0
我有一个有200万行的Mysql表。 大小是600Mb。在一个200万行的表中加速慢计数
此查询需要2秒钟。 我不知道如何加快速度。该表已经是Myisam格式。 我不知道我是否达到了选择计数缓慢的极限。
SELECT COUNT(video) FROM yvideos use index (PRIMARY) WHERE rate>='70' AND tags LIKE '%;car;%'
感谢所有
我有一个有200万行的Mysql表。 大小是600Mb。在一个200万行的表中加速慢计数
此查询需要2秒钟。 我不知道如何加快速度。该表已经是Myisam格式。 我不知道我是否达到了选择计数缓慢的极限。
SELECT COUNT(video) FROM yvideos use index (PRIMARY) WHERE rate>='70' AND tags LIKE '%;car;%'
感谢所有
是的,它可以被优化。
首先,您正在使用LIKE
进行全面扫描,因为MySQL不能使用左变量(对于';car;%'
而不是'%;car;%'
)的索引。其次,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。
顺便提一下,InnoDB和MyISAM都支持全文索引,因此您可以决定引擎。
'rate'是否存储为数值?您可以尝试使用WHERE rate> = 70而不是WHERE rate> ='70',因为数字比较应该更快。 – trevor