2016-08-04 10 views
0

私はいくつかのドロップダウンメニューのそれぞれで選択が行われたときに利用可能なオプションを更新する検索機能を作っています。これらのwp_postmeta MySQLクエリをより高速にするにはどうすればよいですか?

2つのドロップダウンメニューを更新するために実行される2つのmysqlクエリがあります。 db内の約5000の製品では、各クエリーには約4秒かかります。どうすればそれらをスピードアップできますか?

私はそれらを単一のクエリと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'を追加してみました。クエリは8秒かかりました – 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)

関連する問題