帮助解决问题经常发生的慢查询。
# Query_time: 12.519347 Lock_time: 0.000057 Rows_sent: 0 Rows_examined: 98260
SET timestamp=1464192549;
SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
FROM wp_posts
WHERE 1=1
AND (((wp_posts.post_title LIKE '%Медвен%') OR (wp_posts.post_excerpt LIKE '%Медвен%') OR (wp_posts.post_content LIKE '%Медвен%'))) AND wp_posts.post_type IN ('post', 'page', 'attachment') AND ((wp_posts.post_status = 'publish'))
ORDER BY wp_posts.post_title LIKE '%Медвен%' DESC, wp_posts.post_date DESC LIMIT 0, 20;
如何解决?
答案 0 :(得分:1)
您永远无法利用典型的BTREE索引与LIKE子句不是前缀匹配(即与字符串开头的起点不匹配)。 LIKE sometext%
将使用BTREE索引,而LIKE %sometext%
将无法使用此索引。
你的ORDER BY中也有类似的LIKE子句,这将进一步加剧排序问题。
因此,我不认为尝试最终优化其当前形式的查询有很大的希望,除此之外可能会获得一些收益,即删除ORDER BY条件。
看起来你正在尝试做的事情(使用单个术语搜索多个列),使用全文搜索会更好。请参阅此处的MySQL文档 - http://dev.mysql.com/doc/refman/5.7/en/fulltext-search.html
全文搜索利用针对此类搜索模式优化的特定类型的索引(FULLTEXT
索引)。