我有一个拥有2百万行的Mysql表。 大小为600Mb。
此查询需要2秒钟。 我不知道如何加快速度。该表已采用Myisam格式。 我不知道我是否达到了选择计数缓慢的极限。
SELECT COUNT(video) FROM yvideos use index (PRIMARY) WHERE rate>='70' AND tags LIKE '%;car;%'
全部谢谢
答案 0 :(得分:0)
是的,它可以进行优化。
首先,您正在使用LIKE
进行完整扫描,因为MySQL不能使用带左变量部分的索引(';car;%'
可以使用,但'%;car;%'
不能使用)。< / p>
其次,MySQL(在大多数情况下)不会为SELECT
使用多个索引,因此如果rate
和tags
有两个单独的索引,则只有一个使用。
所以为了处理这些事情,我建议:
1.使用tags
列的全文索引,
2.使用两个单独的查询替换一个查询,并使用INNER JOIN
“粘合”结果(在这种情况下等于WHERE ... AND ...
)。
所以最后:
SELECT t1.* FROM
(SELECT * FROM yvideos WHERE rate >= 60) t1
INNER JOIN
(SELECT * FROM yvideos WHERE MATCH (tags) AGAINST ('+car +russia -usa' IN BOOLEAN MODE)) t2
USING (id);
对此查询执行EXPLAIN
并查看计划。现在没有完整扫描,所有过滤都是使用索引完成的。
有关布尔全文搜索的更多信息,请阅读a documetation。
BTW,InnoDB和MyISAM现在支持全文索引,因此您可以决定引擎。