【问题标题】:Expain the result of "explain" query in mysql解释mysql中“解释”查询的结果
【发布时间】:2010-08-27 06:49:26
【问题描述】:

我正在为 mysql 表使用索引。

我的查询是这样的

 EXPLAIN SELECT * FROM `logs` WHERE userId =288 AND dateTime BETWEEN '2010-08-01' AND '2010-08-27' 

我在字段 userId 上为此表日志建立了索引, 解释查询的结果如下。

id  select_type     table     type  possible_keys   key     key_len     ref     rows    Extra
1      SIMPLE         logs     ref      userId      userId      4       const   49560   Using where

问题是“我的索引是否真的有用?”...

提前致谢

@fastmultiplication

我认为在这两个字段上建立索引可能会增加 mysql 的负载,因为会有很多具有唯一性(userId 和 dateTime)的条目。 我尝试在 userId_dateTime 上添加索引,结果是

id  select_type     table   type    possible_keys            key        key_len     ref     rows    Extra
1      SIMPLE        logs    ref     userId_dateTime    userId_dateTime     4       const   63455   Using where

【问题讨论】:

    标签: sql mysql performance


    【解决方案1】:

    您的查询正在使用索引,是的,它们很有用。您可能会发现以下文档页面很有用:

    EXPLAIN Output Format
    How MySQL Uses Indexes
    Multiple-Column Indexes

    还有:

    Multiple column index vs multiple indexes

    MySQL 通常会使用返回最少行数的索引。在您的第一个示例中,MySQL 使用 userId 索引将行数缩小到 49560。这意味着 userId 不包含唯一值(如果包含,则不需要日期范围条件)。由于dateTime 列上没有索引,因此它必须扫描每一行以找到符合您的日期范围标准的行。

    在您的第二个示例中,您似乎在userIddateTime 上创建了一个复合(多列)索引。在这种情况下,似乎 MySQL 无法将索引的后半部分用于 BETWEEN 子句——我不知道为什么。使用两个单独的索引而不是多列索引可能值得尝试。您可能还想尝试将BETWEEN 替换为:

    '2010-08-01' >= AND <= '2010-08-27'
    

    这应该是相同的,但请参阅以下错误报告,这可能会影响您的 MySQL 版本:

    Optimizer does not use index for BETWEEN in a JOIN condition

    【讨论】:

      【解决方案2】:

      从“行”字段看来,MySQL 仍然估计它必须查看很多行。

      您也应该尝试向 dateTime 字段添加索引。

      对于这个特定的查询,可能在两个字段上都有一个索引。

      alter table logs add index user_datetime (userId,dateTime);
      

      【讨论】:

      • 我已经输入了更多的问题,请检查
      【解决方案3】:

      应该查询返回多少行?查询的运行速度有多快?

      在我看来它是一个非常简单的查询,它使用了正确的索引,所以如果由于某种原因它很慢,可能是因为它实际上必须返回大量数据。如果您实际上对所有行都不感兴趣,可以使用LIMIT 来获取更少。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-06
        • 1970-01-01
        • 2010-10-22
        • 1970-01-01
        相关资源
        最近更新 更多