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

索引此mysql查询

  •  3
  • Maulik Vora  · 技术社区  · 15 年前

    执行此查询需要21秒。
    groupId , batchId 分开。

    EXPLAIN SELECT message, sentOn, maskId, isDndCheck, contentType
    FROM sms_histories
    WHERE groupId = 1750
    GROUP BY batchId
    ORDER BY batchId DESC
    LIMIT 0 , 1
    

    explain查询显示结果

    id  select_type     table       type    possible_keys   key     key_len     ref     rows    Extra
    1      SIMPLE   sms_histories    index      groupId     batchId     5        NULL    888    Using where 
    

    请告诉我是什么问题,为什么这个查询需要这么长时间?

    3 回复  |  直到 15 年前
        1
  •  1
  •   user443355 user443355    15 年前

    我认为应该像bobince说的那样,对batchId和groupId使用复合索引。我想你的表格里会有很多数据 sms_histories . 正如bobince所说,您使用的是有点笨拙的数据库模式。您应该尝试对其进行规范化并从中删除复制。在开始新项目之前,应该更多地关注数据库模式。 batchId groupId 两者都有。

        2
  •  1
  •   Ljubomir Đokić    15 年前

    我注意到groupId是CHAR类型。您需要对groupId字段进行升序索引。但是,如果可能,请考虑将GroupId的类型更改为整数。

        3
  •  1
  •   bobince    15 年前

    (groupId, batchId) ORDER BY optimisation 工作。MySQL无法使用 batchId 单独索引是因为 groupId 这些都混在一起了。

    GROUP BY 没有聚合列。如果 批次ID sms_histories 然后 分组依据