IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

MySQL数据库InnoDB存储引擎查询优化器实现的分析之单表unique查询

MySQLOPS 数据库与运维自动化技术分享 2012-01-08 22:24:13 累计浏览 3,183 次
本机暂存

1.1     单表unique查询

select * from nkeys where c3 = 3;

调用流程:
mysql_execute_command -> handle_select -> mysql_select -> JOIN_optimize -> make_join_statistics ->
if ((table->key_info[key].flags & (HA_NOSAME | HA_END_SPACE_KEY)) == HA_NOSAME) ->

  1. 若当前索引为unique索引,同时

if (const_ref == eq_part) ->

    1. 指定的等值条件与当前索引的unique key一致

s->type = JT_CONST ->

  1. 当前表上的查询,返回的数据量是一个常量

join_read_const_table -> … -> row0sel.c::row_search_for_mysql ->

  1. 调用底层函数,做一次unique scan,主要功能是保证explain的正确性。有这个必要吗?看下面的explain截图,就可以发现此函数的功能:

原图已失效
if (s->type == JT_SYSTEM || s->type == JT_CONST) ->

s->found_records = s->records = s->read_time = 1; s->worst_seeks = 1.0;

  1. JT_CONST情况下,查询一定只返回1条数据,不需要调用ha_innobase::records_in_range函数进行判断。

if (join->const_tables != join_tables)

choose_plan();

  1. 若当前不全是TL_CONST查询,还需要调用choose_plan函数,判断非const表的最优执行路径。单表情况下,只需要计算全表扫描代价;多表join条件下,需要计算各非const表的join顺序以及单表的最优路径。TL_CONST情况下,不需要调用choose_plan(单表查询情况下)。

1.1.1  单表Unique查询总结

  • mysql查询优化,对于unique查询做了路径优化,并不需要调用底层提供的records_in_range函数判断查询的代价;同时也不需要调用choose_plan函数,确定此查询全表扫描代价(单表情况下)。

  • 只要指定了unique key上的等值查询,那么无论后面还有多少其他查询条件,mysql查询优化一定会选择unique key索引,做unique查询,如下:

原图已失效
查询优化仍旧选择c3 unique索引,而非选择nkey1索引,虽然nkey1上有c3,c5两列。

本系列文章主目录:MySQL数据库InnoDB存储引擎查询优化器实现的分析

同分类推荐文章

  1. 使用deepseek进行Oracle恢复,引起重大故障 (2026-06-22 10:56:00)
  2. 接手一个只差临门一脚的数据库恢复 (2026-06-18 00:13:09)
  3. 我做了一个 AI 版的 StarRocks 升级风险扫描工具,直接帮我定位到一个风险 (2026-06-15 01:00:00)

查看更多 数据库 文章 →

建议继续学习

  1. 用Hyer来进行网站的抓取 (累计阅读 158,250)
  2. MySQL数据库在实际应用一些方面的介绍 (累计阅读 36,397)
  3. WordPress插件开发 -- 在插件使用数据库存储数据 (累计阅读 29,163)
  4. Mysql监控指南 (累计阅读 21,350)
  5. 由浅入深探究mysql索引结构原理、性能分析与优化 (累计阅读 16,521)
  6. 在Apache2.2.XX下安装Mod-myvhost模块 (累计阅读 13,056)
  7. 15个最好的免费开源电子商务平台 (累计阅读 12,541)
  8. 浅谈MySQL索引背后的数据结构及算法 (累计阅读 11,904)
  9. 整理了一份招PHP高级工程师的面试题 (累计阅读 11,708)
  10. 深入浅出INNODB MVCC机制与原理 (累计阅读 9,692)