據我所知,以下查詢不是太複雜,但它仍然需要3秒以上。 關於如何優化這個的任何想法?關於優化MySQL查詢:簡單的MySQL查詢需要3秒以上
SELECT
wpp.ID, wpp.post_title, wpp.post_author,
wpp.post_status, s.supplier_company
FROM wp_posts AS wpp
LEFT JOIN wp_postmeta AS postmeta ON wpp.ID = postmeta.post_id
LEFT JOIN wp_term_relationships AS term_link ON wpp.ID = term_link.object_id
LEFT JOIN wp_terms AS terms ON term_link.term_taxonomy_id = terms.term_id
LEFT JOIN wp_teleapo_supplier AS s ON wpp.post_author = s.ID
WHERE wpp.post_type = 'post'
AND wpp.post_warning <> 'no_image'
AND wpp.post_status <> 'trash'
AND wpp.post_status <> 'auto-draft'
GROUP BY wpp.ID
ORDER BY post_date DESC
LIMIT 100 OFFSET 0
現在我所有的餐桌都有大約2000〜9000個職位。
1)在wp_posts
中有15000個記錄,但只有大約3000個,使用WHERE wpp.post_type = 'post'
。
2)圍繞9000在wp_term_relationships
但很容易在不久的將來成長......
問題的起源:
在上面的短查詢,如果我改變:
GROUP BY wpp.ID
ORDER BY post_date DESC
TO
GROUP BY wpp.ID
ORDER BY wpp.ID DESC
我的查詢時間從3.3秒到0.3秒...但是我想要一個方法,所以我仍然可以ORDER BY post_date
!
東西是更加古怪的是,樓下全搜索查詢會在不到1秒,即使GROUP和ORDER BY的是不同的...
解釋短期查詢結果:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE wpp ref type_status_date,post_type,post_status post_type 62 const 3351 Using where; Using temporary; Using filesort
1 SIMPLE postmeta ref post_id post_id 8 r_11524_jtc.wpp.ID 7 Using index
1 SIMPLE term_link ref PRIMARY PRIMARY 8 r_11524_jtc.wpp.ID 92 Using index
1 SIMPLE terms eq_ref PRIMARY PRIMARY 8 r_11524_jtc.term_link.term_taxonomy_id 1 Using index
1 SIMPLE s eq_ref ID ID 4 r_11524_jtc.wpp.post_author 1
這些都是我的指標:
全搜索根據用戶羯羊或不填,他在某些搜索領域中,最奇怪的是,即使ORDER BY
列與GROUP BY
列不同,以下搜索查詢僅需要0.3秒!
SELECT SQL_CALC_FOUND_ROWS wpp.ID, wpp.post_title, wpp.post_author,
wpp.post_status, s.supplier_company,
GROUP_CONCAT(DISTINCT terms.slug SEPARATOR ',') AS allslug,
GROUP_CONCAT(DISTINCT terms.name SEPARATOR ',') AS allcatname
FROM wp_posts AS wpp
LEFT JOIN wp_postmeta AS postmeta ON wpp.ID = postmeta.post_id
LEFT JOIN wp_term_relationships AS term_link ON wpp.ID = term_link.object_id
LEFT JOIN wp_terms AS terms ON term_link.term_taxonomy_id = terms.term_id
LEFT JOIN wp_teleapo_supplier AS s ON wpp.post_author = s.ID
WHERE wpp.post_type = 'post'
AND wpp.post_warning <> 'no_image'
AND wpp.post_status <> 'trash'
AND wpp.post_status <> 'auto-draft' /* All search on post_title
and any postmeta value */
AND (post_title LIKE '%textile%'
OR postmeta.meta_value LIKE '%textile%')
/* extra filters. The one below is an example of a filter on
the user #324 but this field can also take the username
(supplier_company) parameters etc. */
AND (wpp.post_author LIKE '%324%'
OR (EXISTS
(SELECT 1
FROM wp_teleapo_supplier as s2
WHERE s2.ID = wpp.post_author
AND (s2.supplier_company LIKE '%324%'
OR s2.supplier_company_kana LIKE '%324%')))
OR (EXISTS
(SELECT 1
FROM wp_postmeta AS postmeta2
WHERE postmeta2.post_id = wpp.ID
AND postmeta2.meta_key = 'input_comp'
AND postmeta2.meta_value LIKE '%324%')))
GROUP BY wpp.ID /* Filter on Categories!! */
HAVING (allcatname LIKE '%apparel-and-accessories%'
OR allslug LIKE '%apparel-and-accessories%')
ORDER BY post_date DESC
LIMIT 20 OFFSET 0
桌子有多大?你有什麼指數? –
親愛的@ PM77-1謝謝!我用索引和表格大小更新了這個問題。 – mesqueeb
當你通過[Explain](http://dev.mysql.com/doc/refman/5.7/en/explain.html)運行查詢時會發生什麼? – Drew