2016-08-04 101 views
0

我正在製作一個搜索功能,在幾個下拉菜單中的每一個上進行選擇時更新可用選項。如何使這些wp_postmeta MySQL查詢更快?

這裏有兩個mysql查詢運行更新兩個下拉菜單。在db中有大約5000個產品,每個查詢大約需要4s。我如何加快速度?

我試着將它們組合成一個查詢並用PHP進行分組,但是如果清除了一個選項,則所選下拉列表中的選項不可用。

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

也許你可以提供的表結構,樣本數據和預期結果的複合索引。目前很難理解。 – sgeddes

+0

慢位是str_to_date部分 – Strawberry

+0

還有3.7s沒有這個部分。 :(wp_postmeta有300萬行...重複的連接越少越好 – MartyBoggs

回答

0

您可以試着查詢的聚集形式:

的理念是:

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 ; 

您可以使用的一個having條款或子查詢這些值的具體過濾條件。

wp_posts(product, id)上的索引可能有助於查詢。

+0

嗯,我必須考慮它是如何工作的。 '這樣做是正確的,但是我試着將HAVING product_group ='cruises'添加到最後,查詢花費了8s – MartyBoggs

+1

@Dingalingalingalong ...這是值得一試的,但它可能不會更快 –

+0

它不會更快。 – Strawberry

0

修改你的數據模型,使下面的作品,而不作進一步的功能的任何要求:

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

我不記得你是否可以自定義WP這樣的值可以根據數據排列在表鍵入,但如果沒有,那麼至少需要將日期存儲爲格式正確的字符串。

我認爲有上(POST_ID,meta_key,meta_value)