代码之家  ›  专栏  ›  技术社区  ›  Maulik Vora

mysql中explain查询结果

  •  0
  • Maulik Vora  · 技术社区  · 16 年前

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

    我对这个表日志的userId字段进行了索引, explain查询的结果如下所示。

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

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

    提前谢谢

    我认为在这两个字段上建立索引可能会增加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
    
    3 回复  |  直到 16 年前
        1
  •  2
  •   Mike    16 年前

    EXPLAIN Output Format
    How MySQL Uses Indexes
    Multiple-Column Indexes

    也:

    Multiple column index vs multiple indexes

    userId 索引将行数缩小到49560。这意味着 用户ID 不包含唯一值(如果包含,则不需要日期范围条件)。因为上面没有索引 dateTime 列,然后它必须扫描每一行以找到符合日期范围条件的行。

    在第二个示例中,您似乎在上创建了一个复合(多列)索引 日期时间 BETWEEN 我不知道为什么。可能值得尝试使用两个独立的索引,而不是多列索引。您也可以尝试替换 使用:

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

    Optimizer does not use index for BETWEEN in a JOIN condition

        2
  •  1
  •   fastmultiplication    16 年前

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

    对于这个特定的查询,可能是两个字段上的索引。

    alter table logs add index user_datetime (userId,dateTime);
    
        3
  •  0
  •   Avi    16 年前

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

    LIMIT 得到更少。