慢SQL查询SQL_CALC_FOUND_ROWS

时间:2016-05-25 16:59:23

标签: mysql

帮助解决问题经常发生的慢查询。

# 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;

如何解决?

1 个答案:

答案 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索引)。