【问题标题】:speed up slow count in a 2 millions rows table加快 200 万行表中的慢计数
【发布时间】:2016-11-30 11:32:28
【问题描述】:

我有一个有 200 万行的 Mysql 表。 大小为 600Mb。

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

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

谢谢大家

【问题讨论】:

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

标签: mysql large-data-volumes


【解决方案1】:

是的,可以优化。

首先,您正在使用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 都支持全文索引,因此您可以决定使用引擎。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 2020-08-12
    • 1970-01-01
    相关资源
    最近更新 更多