Ich habe 3 Tabellen (SuccessOrder, FailedOrder und PendingOrder) mit gleichen Spalten. Jede Tabelle hat mehr als 2 Millionen Datensätze. Ich muss alle Daten aus diesen 3 Tabellen kombinieren und nach CreatedDate sortieren, um sie in meinem Portal anzuzeigen. Ich verwende UNION ALL, um das Ergebnis aller Tabellen zu kombinieren.MySQL Union Performance-Problem
Wenn ich jede Unterabfrage ausführen, erhalten Sie das Ergebnis in 1 oder 2 Sekunden. Wenn ich die gesamte Abfrage (3 Unterabfragen mit UNION ALL) ausführe, dauert es mehr als 5 Minuten.
select * from (
select * from SuccessOrder
UNION ALL
select * from FailedOrder
UNION ALL
select * from PendingOrder
) t order by t.ID;
Gibt es eine Alternative zu UNION ALL?
Ist es möglich, Ansicht von 3 Abfragen ohne UNION ALL zu erstellen?
Im Folgenden werden die von Workbench getesteten Einzel- und Unionsabfragen beschrieben. Ich sehe keinen großen Unterschied zwischen UNION ALL und UNION ALL - ORDER BY
erste Abfrage
Dauer/Fetch Zeit: 2.182 sec/1,513 sec
SELECT col1, col2, ...
FROM CompleteTxn ct
left outer join CompleteItem ci ON (ct.Id = ci.TxnId)
left outer join ItemDispute id ON (ct.Id = id.TxnId and ci.Id = id.ItemId)
left outer join Merchant mc ON (ct.MerchantId = mc.Id)
left outer join AdditionalTxnInfo addti ON (ct.Id = addti.TxnId)
where (ct.PartitionKey>=55 AND ct.PartitionKey<=56)
and (ct.TxnCompleteTime >= '2016-08-01 17:00:00'
and ct.TxnCompleteTime <= '2016-08-09 17:00:00'
)
and ct.MnoId in (22,24,25,23,26,220,221,200,223,224,320, 400)
and ct.Status in (1,2,3,4,5);
Zweite Abfrage
Dauer/Fetch Zeit: 0.279 sec/0,861 sec
SELECT col1, col2, ...
FROM FailedOrder ct
left outer join FailedItem ci ON (ct.Id = ci.TxnId)
left outer join ItemDispute id ON (ct.Id = id.TxnId and ci.Id = id.ItemId)
left outer join Merchant mc ON (ct.MerchantId = mc.Id)
left outer join AdditionalTxnInfo addti ON (ct.Id = addti.TxnId)
where (ct.PartitionKey>=55 AND ct.PartitionKey<=56)
and (ct.TxnCompleteTime >= '2016-08-01 17:00:00'
and ct.TxnCompleteTime <= '2016-08-09 17:00:00'
)
and ct.MnoId in (22,24,25,23,26,220,221,200,223,224,320, 400);
Union Alle withour Auftrag von
Dauer/Fetch Zeit: 104,802 sec/0,00027 sec
select *
FROM
(
SELECT col1, col2, ...
FROM FailedOrder ct
left outer join FailedItem ci ON (ct.Id = ci.TxnId)
left outer join ItemDispute id ON (ct.Id = id.TxnId
and ci.Id = id.ItemId
)
left outer join Merchant mc ON (ct.MerchantId = mc.Id)
left outer join AdditionalTxnInfo addti ON (ct.Id = addti.TxnId)
where (ct.PartitionKey>=55 AND ct.PartitionKey<=56)
and (ct.TxnCompleteTime >= '2016-08-01 17:00:00'
and ct.TxnCompleteTime <= '2016-08-09 17:00:00'
)
and ct.MnoId in (22,24,25,23,26,220,221,200,223,224,320, 400)
and ct.Status in (1,2,3,4,5)
UNION ALL
SELECT col1, col2, ...
FROM CompleteTxn ct
left outer join CompleteItem ci ON (ct.Id = ci.TxnId)
left outer join ItemDispute id ON (ct.Id = id.TxnId
and ci.Id = id.ItemId
)
left outer join Merchant mc ON (ct.MerchantId = mc.Id)
left outer join AdditionalTxnInfo addti ON (ct.Id = addti.TxnId)
where (ct.PartitionKey>=55 AND ct.PartitionKey<=56)
and (ct.TxnCompleteTime >= '2016-08-01 17:00:00'
and ct.TxnCompleteTime <= '2016-08-09 17:00:00'
)
and ct.MnoId in (22,24,25,23,26,220,221,200,223,224,320, 400) ) t ;
Union Alle mit Auftrag von
Dauer/Fetch Zeit: 104,895 sec/0,00028 sec
select * FROM (
SELECT col1, col2, ... FROM FailedOrder ct linker äußerer Join FailedItem ci ON (ct.Id = ci.TxnId) linker äußerer Join ItemDispute ID ON (ct.Id = id.TxnId und ci.Id = id.ItemId) linker äußerer Join Merchant mc ON (ct.MerchantId = mc .Id) linker äußerer Join AdditionalTxnInfo addti ON (ct.Id = addi.TxnId) wo (ct.PartitionKey> = 55 AND ct.PartitionKey < = 56) und (ct.TxnCompleteTime> = '2016-08-01 17:00:00' und ct.TxnCompleteTime < = '2016-08-09 17:00:00') und ct.MnoId in (22,24,25,23,26,220,221,200,223,224,320,400) und ct.Status in (1,2,3,4,5)
UNION ALL
SELECT col1, col2, ... FROM CompleteTxn ct links außen Join CompleteItem ci ON (ct.Id = ci.TxnId) linker äußerer Join ItemDispute id ON (ct.Id = id.TxnId und ci.Id = id.ItemId) linker äußerer Join Händler mc ON (ct.MerchantId = mc.Id) linker äußerer Join AdditionalTxnInfo addti ON (ct.Id = addi.TxnId) wobei (ct.PartitionKey> = 55 UND ct.PartitionKey < = 56) und (ct.TxnCompleteTime> = '2016-08-01 17:00:00' und ct.TxnCompleteTime < = '2016-08-09 17:00:00') und ct.MnoId in (22,24,25,23, 26,220,221,200,223,224,320,400)
) t ORDER BY id desc;
Wenn Sie die 'order by t.ID' entfernen, dann würde es wahrscheinlich viel schneller sein, ansonsten sollte es Zeit brauchen. – 1000111
Warum in aller Welt wollen Sie sechs Millionen Datensätze gleichzeitig abrufen? Das sind drei Table Scans. Indexierung wird hier nicht viel nützen. – e4c5
Wir sammeln nicht gleichzeitig 6 Millionen Datensätze. Wir haben Bedingungen für jede Unterabfrage. Wir müssen die Suche aus diesen 3 Tabellen überprüfen und sie nach ausgewähltem Feld (Mostly ID) ordnen und erste 100 Datensätze für den Benutzer mit Paginierung anzeigen – rkvegiraju