stevenjin 2024-10-22 16:15 采纳率: 98%
浏览 4

mySQL查询条件带来的索引优化问题

mysql,数据量在20万条以上
1.有id,name,age,createdate三个字段,无外键,Id为主键且自增
2.如果用select name age from tb,查询时间与不加索引无异,但exlain发现有用上索引
3.如果用select id, name age from tb查,查询时间与不加索引无异,但exlain发现有用上索引
4.如果用select name age from tb order by createdate查,时间减少一半,exlain发现有用上索引
以上是什么原因呢?

  • 写回答

1条回答 默认 最新

  • 月下独码 Java领域新星创作者 2024-10-22 19:34
    关注

    本答案参考 多次询问 ChatGPT-3.5 后选择的最佳回答,若是满意,还请采纳,谢谢

    1. 关于索引基础概念
      • 在MySQL中,索引是一种数据结构,用于快速查找数据库中的记录。主键(如这里的id)通常会自动创建索引。当创建索引时,数据库会构建一种类似树(如B - Tree)的数据结构,使得在查找满足特定条件的记录时能够快速定位,而不需要全表扫描。
    2. 分析select name, age from tb情况
      • 虽然EXPLAIN发现用上了索引,但查询时间与不加索引无异。
      • 可能原因是索引覆盖度的问题。如果查询只涉及nameage字段,而索引没有完全覆盖这些字段(假设没有针对nameage的联合索引),数据库可能仍然需要进行额外的操作来获取数据。例如,索引可能只是基于id(主键索引),虽然可以通过索引快速定位到行的位置,但还需要从表中读取nameage字段的值,这个读取操作可能抵消了索引带来的优势。
      • 假设索引结构是基于id的B - Tree索引,查询时先通过索引找到对应的id,然后再根据id去获取nameage,如果表数据存储在磁盘上,频繁的磁盘I/O读取nameage可能导致性能没有明显提升。
    3. 分析select id, name, age from tb情况
      • 同样查询时间与不加索引无异,尽管EXPLAIN显示用上了索引。
      • 这里包含了id字段,理论上如果有合适的索引(如id为主键已经有索引),查询应该会更快。但是如果表中的数据在内存中缓存情况较好,或者数据库的查询优化器没有选择最优的索引使用策略,也可能导致这种情况。例如,查询优化器可能错误地估计了全表扫描和使用索引的成本,认为全表扫描的成本更低,所以虽然使用了索引,但并没有带来明显的性能提升。
    4. 分析select name, age from tb order by createdate情况
      • 这里查询时间减少了一半,并且EXPLAIN发现用上了索引。
      • 很可能是因为有针对createdate的索引。当执行ORDER BY操作时,如果有合适的索引,数据库可以直接按照索引的顺序获取数据,避免了额外的排序操作。例如,如果createdate字段有索引,数据库可以直接按照索引中createdate的顺序读取满足条件(这里是查询nameage)的记录,而不需要先查询出所有结果再在内存中进行排序,从而大大提高了查询效率。
    评论

报告相同问题?

问题事件

  • 修改了问题 10月22日
  • 创建了问题 10月22日

悬赏问题

  • ¥60 Matlab联合CRUISE仿真编译dll文件报错
  • ¥15 脱敏项目合作,ner需求合作
  • ¥15 脱敏项目合作,ner需求合作
  • ¥30 Matlab打开默认名称带有/的光谱数据
  • ¥50 easyExcel模板 动态单元格合并列
  • ¥15 res.rows如何取值使用
  • ¥15 在odoo17开发环境中,怎么实现库存管理系统,或独立模块设计与AGV小车对接?开发方面应如何设计和开发?请详细解释MES或WMS在与AGV小车对接时需完成的设计和开发
  • ¥15 CSP算法实现EEG特征提取,哪一步错了?
  • ¥15 游戏盾如何溯源服务器真实ip?需要30个字。后面的字是凑数的
  • ¥15 vue3前端取消收藏的不会引用collectId