2016-07-26 61 views
0

我有一个有200万行的Mysql表。 大小是600Mb。在一个200万行的表中加速慢计数

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

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

感谢所有

+0

'rate'是否存储为数值?您可以尝试使用WHERE rate> = 70而不是WHERE rate> ='70',因为数字比较应该更快。 – trevor

回答

0

是的,它可以被优化。

首先,您正在使用LIKE进行全面扫描,因为MySQL不能使用左变量(对于';car;%'而不是'%;car;%')的索引。其次,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

顺便提一下,InnoDB和MyISAM都支持全文索引,因此您可以决定引擎。