MySQL数据库InnoDB存储引擎查询优化器实现的分析之单表unique查询
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) ->
若当前索引为unique索引,同时
if (const_ref == eq_part) ->
指定的等值条件与当前索引的unique key一致
s->type = JT_CONST ->
当前表上的查询,返回的数据量是一个常量
join_read_const_table -> … -> row0sel.c::row_search_for_mysql ->
调用底层函数,做一次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;
JT_CONST情况下,查询一定只返回1条数据,不需要调用ha_innobase::records_in_range函数进行判断。
if (join->const_tables != join_tables)
choose_plan();
若当前不全是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存储引擎查询优化器实现的分析
建议继续学习:
- Mysql查询优化器浅析(上) (阅读:2528)
- MySQL数据库InnoDB存储引擎查询优化器实现的分析之单表查询 (阅读:2471)
- Mysql查询优化器浅析(下) (阅读:2088)
- MySQL数据库InnoDB存储引擎查询优化器实现的分析 (阅读:1970)
- MySQL数据库InnoDB存储引擎查询优化器实现的分析之多表简单JOIN查询 (阅读:2007)
- MySQL数据库InnoDB存储引擎查询优化器实现的分析之optimizer_search_depth参数 (阅读:1898)
- MySQL数据库InnoDB存储引擎查询优化器实现的分析之附录 (阅读:1851)
- MySQL数据库InnoDB存储引擎查询优化器实现的分析之统计信息 (阅读:1645)
- MySQL数据库InnoDB存储引擎查询优化器实现的分析之best_access_path函数分析 (阅读:1546)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:Eugene 来源: MySQLOPS 数据库与运维自动化技术分享
- 标签: unique 查询优化器
- 发布时间:2012-01-08 22:24:13
- Mysql查询优化器浅析(上)
- MySQL数据库InnoDB存储引擎查询优化器实现的分析之单表查询
- Mysql查询优化器浅析(下)
- MySQL数据库InnoDB存储引擎查询优化器实现的分析
- MySQL数据库InnoDB存储引擎查询优化器实现的分析之多表简单JOIN查询
- MySQL数据库InnoDB存储引擎查询优化器实现的分析之optimizer_search_depth参数
- MySQL数据库InnoDB存储引擎查询优化器实现的分析之附录
- MySQL数据库InnoDB存储引擎查询优化器实现的分析之统计信息
- MySQL数据库InnoDB存储引擎查询优化器实现的分析之best_access_path函数分析
- [67] Oracle MTS模式下 进程地址与会话信
- [65] 如何拿下简短的域名
- [65] Go Reflect 性能
- [59] 图书馆的世界纪录
- [59] 【社会化设计】自我(self)部分――欢迎区
- [59] android 开发入门
- [58] IOS安全–浅谈关于IOS加固的几种方法
- [53] 视觉调整-设计师 vs. 逻辑
- [47] 读书笔记-壹百度:百度十年千倍的29条法则
- [47] 界面设计速成