我有一個用於返回可用客房的預訂系統如何改善慢速自定義查詢? (子查詢+內有自定義字段合併)
使用Advanced Custom Fields,我代表與各領域
計劃預留的自定義後類型查詢這裏是找到與子查詢所有預訂房間,然後通過選擇不在子查詢返回的結果集中的帖子來獲取所有可用房間
我的預訂自定義帖子有一個「terrain_id」匹配房間的帖子ID(露營或別墅)
第一內加入對房間ID(terrain_id),第二內連接的開始日期,最後一個是在結束日期
所以基本上我的ROOM_ID與POST_ID和收益相匹配所有指定的時間間隔不可用的房間,然後我得到的所有誰在子查詢的結果是不存在的IDS讓我的空房
的問題如下:
這個查詢大約運行小數據樣本5-6秒(約2000個預約,100個房間)
我嘗試不同的方法來優化它,但我幾乎陷入
有所有相關領域
本身在大約0.030秒運行一次,所以我不認爲內連接是子查詢索引問題的大部分似乎是在SELECT不存在
使用默認的wordpress方法和循環不是選項,因爲它是不可能做什麼需要,我需要查詢所有的自定義字段單獨對於每個記錄
我該如何impr我的查詢性能如何?
如何選擇不存在於大約100條記錄數組中的基本屬性可能需要這麼長時間?
SELECT wps.ID, wps.post_title, wps.post_type, wps.post_status
FROM wp_posts wps, wp_postmeta wpm
WHERE NOT EXISTS
(
SELECT
p.ID,
pm_ti.meta_value as tiv,
pm_ti.meta_key as tik,
pm_ed.meta_key as edk,
pm_ed.meta_value as edv,
pm_sd.meta_key as sdk,
pm_sd.meta_value as sdv
FROM
wp_posts p
INNER JOIN wp_postmeta pm_ti ON (pm_ti.post_id = p.ID)
INNER JOIN wp_postmeta pm_ed ON (pm_ed.post_id = p.ID)
INNER JOIN wp_postmeta pm_sd ON (pm_sd.post_id = p.ID)
WHERE NOT (pm_ed.meta_value <= '{$start}' OR pm_sd.meta_value >= '{$end}')
AND pm_ti.meta_key='terrain_id' and p.post_status='publish' and wps.ID = pm_ti.meta_value and pm_ed.meta_key='e_date' and pm_sd.meta_key='s_date'
GROUP BY p.ID
)
AND wpm.post_id = wps.ID AND wps.post_status='publish' AND wps.ID = icl_translations.element_id
and (wps.post_type='camping' or wps.post_type='cottages') GROUP BY wps.ID
");
解釋結果:
查詢的修改的查詢的運行方式是更快的,但問題是,代替p.ID,主鍵需要在meta_key「terrain_id」。我試圖讓它工作,我會回報 – user1229829
我更新了這個返回terrain_id值並將其與post_id進行比較,但它確實沒有任何意義,因爲您將id設置爲post_id無論如何。我很困惑你的數據庫。這可能就是我現在想要疲倦的想法。 – Bob
@Bob - 這是標準的WordPress數據庫結構。它基於[TOXI解決方案](http://tagging.pui.ch/post/37027745720/tags-database-schemas)標記結構,因此很混亂。 –