2017-04-11 7 views
1

Wir haben eine unten Abfrage, die etwa 6-8 Sekunden dauert, um auszuführen. Gesamtzahl der Datensätze: 522954Notwendigkeit, SQL-Abfrage zu optimieren - viel Zeit für die Ausführung

(SELECT 
     * 
     FROM 
     tbl_insights_copy 
     WHERE insightscat = 21 
     AND submitedon >= UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 30 DAY)) 
     ORDER BY submitedon DESC 
     LIMIT 5) 
     UNION 
     (SELECT 
     * 
     FROM 
     tbl_insights_copy 
     WHERE insightscat = 22 
     AND submitedon >= UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 30 DAY)) 
     ORDER BY submitedon DESC 
     LIMIT 5) 
     UNION 
     (SELECT 
     * 
     FROM 
     tbl_insights_copy 
     WHERE insightscat = 23 
     AND submitedon >= UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 30 DAY)) 
     ORDER BY submitedon DESC 
     LIMIT 5) 
     UNION 
     (SELECT 
     * 
     FROM 
     tbl_insights_copy 
     WHERE insightscat = 24 
     AND submitedon >= UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 30 DAY)) 
     ORDER BY submitedon DESC 
     LIMIT 5) 

kann jemand helfen, diese Abfrage zu optimieren, um die Ausführungszeit zu reduzieren. Vielen Dank im Voraus.

+2

zeigen Sie Ihre tbl_insights_copy Tabellenschema – scaisEdge

Antwort

1

Das einzige, was Sie zwischen einem ändern auswählen und eine andere, ist der Filterwert der Spalte insightscat Ich bin nicht sicher, dass das ist, was Sie wollen, aber ....

können Sie versuchen, die IN Anweisung für Dies. Beispiel:

SELECT 
     * 
FROM 
     tbl_insights_copy 
     WHERE insightscat in (20,21,22,23,24) 
     AND submitedon >= UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 30 DAY)) 
     ORDER BY submitedon DESC 
+2

wo ist dann 'LIMIT 5' für jeden' ​​'insightscat – TriV

+0

Sie die Grenze Erklärung am Ende des Satzes hinzufügen können, wann immer Sie wollen: SELECT * VON tbl_insights_copy WHERE insightscat in (20,21,22,23,24) UND submitedon> = UNIX_TIMESTAMP (DATE_SUB (JETZT(), INTERVALL 30 DAY)) ORDER BY submitedon DESC LIMIT 5 – Developer90

+0

Wenn Sie 5 _von je_ wollen, wird dies nicht funktionieren. –

0

Für diese Abfrage:

SELECT ic.* 
FROM tbl_insights_copy ic 
WHERE insightscat = 21 AND 
     submitedon >= UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 30 DAY)) 
ORDER BY submitedon DESC 
LIMIT 5 

Sie wollen einen Index für tbl_insights_copy(insightscat, submittedon).

Dies sollte für alle Unterabfragen funktionieren. Dies ist wahrscheinlich der beste Ansatz mit MySQL.

0
SELECT t1.* 
    FROM (SELECT t.* ,ROW_NUMBER() OVER (ORDER BY insightscat) AS Row 
     FROM 
     (select * from   
     tbl_insights_copy 
     WHERE insightscat in (20,21,22,23,24) 
     AND submitedon >= UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 30 DAY)) 
     ORDER BY submitedon DESC) as t) t1 
    WHERE Row <= 5 
+0

Die OVER-Syntax ist in MySQL noch nicht verfügbar. Es ist in MariaDB 10.2 verfügbar. –

0

Ohne SHOW CREATE TABLE, werde ich, dass Sie die optimale

INDEX(insightscat, submitedon) 

Da die SELECTs verschieden sind, verwenden UNION ALL anstelle des UNION DISTINCT Standard haben nicht haben zu erraten. Dies vermeidet einen unnötigen (aber schnellen) Deduplizierungs-Durchlauf über die 20 Zeilen.

Wenn Sie 20 Zeilen

Wenn ja, über meine Vorschläge am besten sein könnte.

Wenn Sie 6 Reihen wollen

Wenn Sie nur die neueste von 5 wollen jede dieser insightscats, dann gibt es drei Möglichkeiten.

Plan A

Was Developer90 in seinem Kommentar sagt.

Plan B

(SELECT ... ORDER BY ORDER BY submitedon DESC LIMIT 5) 
UNION ALL 
(SELECT ... ORDER BY ORDER BY submitedon DESC LIMIT 5) 
UNION ALL 
(SELECT ... ORDER BY ORDER BY submitedon DESC LIMIT 5) 
UNION ALL 
(SELECT ... ORDER BY ORDER BY submitedon DESC LIMIT 5) 
ORDER BY ORDER BY submitedon DESC LIMIT 5; 

Jeder SELECT ist sehr schnell mit meinem Index. Dann werden die 20 Zeilen der UNION wieder sortiert und LIMIT 5 wird angewendet. Nochmals, sehr schnell.

Die Verwendung der IN, wie von Developer90 vorgeschlagen, kann oder kann nicht effektiv meinen Index verwenden. Welche Version verwendest du?

Plan C

Diese Option hit or miss ist.Das heißt, seine Leistung hängt stark von der Verteilung der Daten ab, ob sie sehr schnell oder sehr langsam sein wird: Developer90 + INDEX(submitedon) (ohne insightscat).

Verwandte Themen