2016-08-04 21 views
0

Ich mache eine Suchfunktion, die verfügbare Optionen aktualisiert, wenn in jedem der Dropdown-Menüs eine Auswahl getroffen wird.Wie kann ich diese wp_postmeta MySQL Abfragen schneller machen?

Hier sind zwei mysql-Abfragen, die ausgeführt werden, um zwei Dropdown-Menüs zu aktualisieren. Bei etwa 5000 Produkten in der Datenbank dauert jede Abfrage etwa 4 Sekunden. Wie kann ich sie beschleunigen?

Ich habe versucht, sie zu einer einzigen Abfrage und Gruppierung mit PHP zu kombinieren, aber dann waren die Optionen im ausgewählten Dropdown nicht verfügbar, wenn eine Option gelöscht wurde.

SELECT DISTINCT l.meta_value AS ship_id 
FROM wp_posts a 
JOIN wp_postmeta f ON ID = f.post_id 
JOIN wp_postmeta g ON ID = g.post_id 
JOIN wp_postmeta h ON ID = h.post_id 
JOIN wp_postmeta d ON ID = d.post_id JOIN wp_postmeta i ON ID = i.post_id 
JOIN wp_postmeta l ON ID = l.post_id 
WHERE post_type = 'product' 
AND f.meta_key = 'first_start_date' 
AND g.meta_key = 'last_start_date' 
AND h.meta_key = 'product_group' 
AND h.meta_value = 'cruises' 
AND d.meta_key = 'destinationregion' 
AND i.meta_key = 'destinationarea' 
AND 'South America' IN (d.meta_value, i.meta_value) 
AND (
     (CONCAT('2016', '01-01') BETWEEN STR_TO_DATE(f.meta_value, '%b %e, %Y') AND STR_TO_DATE(g.meta_value, '%b %e, %Y')) OR 
     (STR_TO_DATE(f.meta_value, '%b %e, %Y') BETWEEN CONCAT('2016', '-01-01') AND CONCAT('2016' + 1, '-01-01')) 
    ) 
AND l.meta_key = 'cruiseship' 
ORDER BY l.meta_value ASC 

-

SELECT DISTINCT d.meta_value AS destinationregion, i.meta_value AS destinationarea 
FROM wp_posts a 
JOIN wp_postmeta f ON ID = f.post_id 
JOIN wp_postmeta g ON ID = g.post_id 
JOIN wp_postmeta h ON ID = h.post_id 
JOIN wp_postmeta d ON ID = d.post_id JOIN wp_postmeta i ON ID = i.post_id 
WHERE post_type = 'product' 
AND f.meta_key = 'first_start_date' 
AND g.meta_key = 'last_start_date' 
AND h.meta_key = 'product_group' 
AND h.meta_value = 'cruises' 
AND (
     (CONCAT('2016', '01-01') BETWEEN STR_TO_DATE(f.meta_value, '%b %e, %Y') AND STR_TO_DATE(g.meta_value, '%b %e, %Y')) OR 
     (STR_TO_DATE(f.meta_value, '%b %e, %Y') BETWEEN CONCAT('2016', '-01-01') AND CONCAT('2016' + 1, '-01-01')) 
    ) 
AND d.meta_key = 'destinationregion' AND i.meta_key = 'destinationarea' 
ORDER BY destinationregion, destinationarea" 
+0

Vielleicht haben Sie Tabellenstruktur zur Verfügung stellen könnte, Beispieldaten und die erwarteten Ergebnisse. Ich habe derzeit Schwierigkeiten, mich zu verstehen. – sgeddes

+0

Das langsame Bit ist der str_to_date Teil – Strawberry

+0

Noch 3,7s ohne diesen Teil. :(wp_postmeta hat 3 Millionen Zeilen ... Je weniger wiederholte Joins, desto besser. – MartyBoggs

Antwort

0

Sie könnten die Aggregation Form der Abfrage versuchen:

Die Idee ist:

select p.id, 
     max(case when pm.meta_key = 'First_start_date' then pm.meta_value end) as first_start_date, 
     max(case when pm.meta_key = 'last_start_date' then pm.meta_value end) as last_start_date,  
     max(case when pm.meta_key = 'product_group' then pm.meta_value end) as product_group, 
     max(case when pm.meta_key = 'destinationregion' then pm.meta_value end) as destinationregion, 
     max(case when pm.meta_key = 'destinationarea' then pm.meta_value end) as destinationarea, 
     max(case when pm.meta_key = 'cruiseship' then pm.meta_value end) as cruiseship 
from wp_posts p join 
    wp_postmeta pm 
    on pm.post_id = p.id 
where p.post_type = 'product' 
group by p.id ; 

Sie verwenden, um eine having Klausel oder Unterabfrage für die spezifische Filterbedingungen für die Werte.

Ein Index auf wp_posts(product, id), könnte die Abfrage helfen.

+0

Hmm, ich muss darüber nachdenken, wie das funktioniert. Ich bin mir nicht sicher, ob ich Ich mache das richtig, aber ich habe versucht, HAVING product_group = 'cruises' zum Ende hinzuzufügen und die Abfrage dauerte 8s – MartyBoggs

+1

@Dingalingalingalong ... Es ist einen Versuch wert, aber es könnte nicht schneller sein. –

+0

Es wird nicht schneller sein . – Strawberry

0

Ihr Datenmodell ändern, so dass die folgenden Arbeiten ohne Anforderung für weitere Funktionen:

WHERE f.meta_value < '2017-01-01' AND g.meta_value > '2016-01-01'

Ich kann mich nicht erinnern, ob Sie wp anpassen können, so dass Werte können nach Daten in Tabellen angeordnet werden Typ, aber wenn nicht, dann speichern Sie Daten als korrekt formatierte Strings.

Ich gehe davon aus, dass es eine Verbindung Index (post_id, meta_key, meta_value)

Verwandte Themen