加速2百万行表中的慢速计数

时间:2016-07-26 17:25:28

标签: mysql large-data-volumes

我有一个拥有2百万行的Mysql表。 大小为600Mb。

此查询需要2秒钟。 我不知道如何加快速度。该表已采用Myisam格式。 我不知道我是否达到了选择计数缓慢的极限。

SELECT COUNT(video) FROM yvideos use index (PRIMARY) WHERE rate>='70' AND tags LIKE '%;car;%'

全部谢谢

1 个答案:

答案 0 :(得分:0)

是的,它可以进行优化。

首先,您正在使用LIKE进行完整扫描,因为MySQL不能使用带左变量部分的索引(';car;%'可以使用,但'%;car;%'不能使用)。< / p>

其次,MySQL(在大多数情况下)不会为SELECT使用多个索引,因此如果ratetags有两个单独的索引,则只有一个使用。

所以为了处理这些事情,我建议: 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);

Live example on SQLFiddle

对此查询执行EXPLAIN并查看计划。现在没有完整扫描,所有过滤都是使用索引完成的。

有关布尔全文搜索的更多信息,请阅读a documetation

BTW,InnoDB和MyISAM现在支持全文索引,因此您可以决定引擎。