2016-07-18 11 views
1

ich nächst mysql queryMysql subquery lange Arbeit

SELECT DISTINCT * FROM dom_small WHERE count>=0 AND dom NOT IN 
(SELECT dom FROM dom_small WHERE was_blocked=1) 
ORDER BY count DESC LIMIT 30 OFFSET 4702020 

habe, wenn ich mehr erhöhen OFFSET und mehr, Unterabfrage läuft lange und lang.

Wenn OFFSET 0 mysql query Last 0 Sek aber wenn 4.702.020 mysql query Last 1 min 19,49 sec

Wie dieses Problem zu lösen?

+2

zu optimieren in der Regel höher Offset wird die Leistung verringert. – 1000111

+1

Denke darüber nach, es muss alles auswählen und dann alle sortieren und dann nach '4702020' Reihen suchen und dir dann 30 Reihen von dort ausliefern. Natürlich läuft es länger, wenn Sie den Offset erhöhen – RiggsFolly

+0

Duplikat von http://stackoverflow.com/questions/4481388/why-does-mysql-higher-limit-offset-slow-the-query-down –

Antwort

0

können Sie gleiches Ergebnis liefern mit outer Abfrage folgenden Unterabfrage

SELECT DISTINCT * FROM dom_small WHERE count>=0 AND was_blocked=1 
ORDER BY count DESC LIMIT 30 OFFSET 4702020; 
+2

Ich denke @Dmitriy Kupriyanov will Ergebnis, was nicht in was_blocked = 1 ist. Also deine Antwort falsch. – Abhay

+0

Denke richtig, aber in diesem Fall bekomme ich die gleiche Zeit für alle Abfragen bei Offset 0 oder 4702020. Ungefähr 7 Sekunden. Es ist Grund, warum ich Unterabfrage verwende. –

+0

gleiche Zeit mit falschen Ergebnissen ist immer noch fehlgeschlagen. Wenn dom "A" 25 Einträge hat und 1 davon als blockiert markiert ist, möchte der Benutzer dom "A" überhaupt nicht sehen, unabhängig von den 24, die ursprünglich nicht blockiert waren. – DRapp

0

Verwendung mit:

SELECT DISTINCT * FROM dom_small WHERE count>=0 AND dom NOT IN 
    (select * from(SELECT dom FROM dom_small WHERE was_blocked=1) t1) 
    ORDER BY count DESC LIMIT 30 OFFSET 4702020 

Es kann durch Caching der Unterabfrage Ergebnis die Leistung beschleunigen. Ich habe diese Methode früher benutzt und es hat mir sehr geholfen.

Aber wie andere erwähnt verwenden Offset mit großen Zahlen verlangsamen die Leistung.

+0

Vielen Dank für Ihre Idee, aber 30 Zeilen im Satz (2 min 5,96 sec) –

+0

@DmitriyKupriyanov so denke ich Optimierung der Unterabfrage kann die Leistung nicht verbessern. –

0

DISTINCT * FROM dom_small SELECT WHERE count> = 0 UND NICHT IN dom (dom VON dom_small SELECT WHERE was_blocked = 1) ORDER BY Zählung DESC LIMIT 30 OFFSET 4702020

Obwohl die anderen Kommentare sind korrekt, die Der einzige Vorschlag, den ich anbieten kann, ist, dass Ihre Unterabfrage und Unterabfrage von der gleichen Tabelle "dom_small" stammen. Außerdem führen Sie keine Aggregationszählung (*) im Vergleich zu einer tatsächlichen Spalte in Ihrer Tabelle namens count durch.

Das heißt, würde ich einen Index haben, um die Abfrage auf

(dom, was_blocked, count)