--- 这是开发问的一个问题 --- ###一、问题描述 如果一个表有一个联合索引 (a,b): 索引记录如下: id1 id2 1 10 1 10 1 10 2 20 2 20 3 30 3 30 意思就是说通过a进行过滤的数据和通过a和b过滤的数据条数一样,如果要通过索引访问数据select * from table where id1=1 和 select * from table where id1=1 and id2=10 是不是效率一致? ###二、简易分析 首先对于数据查找,首先第一步是进行innodb层数据的定位(也就是从什么位置开始输出数据给MySQL层),然后定位完成后,顺序向下访问就行了,因为innodb 的表示一个索引组织表。 - 对于等值条件,Innodb层会多访问下一条数据,如果不符合要求了则表示结束了,会返回一个DB_RECORD_NOT_FOUND标记给MySQL层表示结束。 - 对于 范围 比如 > and < 操作如果使用了索引,那么<操作要么在MySQL层进行判断结束,要买使用ICP在Innodb做一层过滤。 对于数据定位后的顺序访问而言,没有什么差别。 因此这个问题主要的问题转换为, a=* 和 a=* and b=* 在进行数据定位的时候效率是否一致,对于这个问题来讲因为a=* 和 a=* and b=* 返回的数据是一样。所谓数据定位找到数据返回的起点在什么地方,这个过程一般会通过B+数定位到叶子节点,然后根据在叶子节点内部使用二分法进行比较,加速定位,比较的方法就是根据字段个数逐个比较(函数cmp_dtuple_rec_with_match_bytes),比如a=* 那么需要比较就是一个,如果a=* and b=* 那么比较的字段就是2个。 代码大概的栈 ``` ->row_search_mvcc ->btr_pcur_open_with_no_init_func -> btr_cur_search_to_nth_level -> page_cur_search_with_match_bytes -> cmp_dtuple_rec_with_match_bytes ``` cmp_dtuple_rec_with_match_bytes 这部分注释如下: ``` /* Match fields in a loop; stop if we run out of fields in dtuple or find an externally stored field */ while (cur_field < n_cmp) { ``` n_cmp就是需要比较的个数。 debug 记录: ``` a=*记录 829 ut_ad(n_cmp <= dtuple_get_n_fields(dtuple)); (gdb) n 830 ut_ad(cur_field <= n_cmp); (gdb) p n_cmp $4 = 1 a=* and b=* 记录 829 ut_ad(n_cmp <= dtuple_get_n_fields(dtuple)); (gdb) n 830 ut_ad(cur_field <= n_cmp); (gdb) p n_cmp $5 = 2 ``` 因此结论:如果这种特殊情况下,我认为效率应该基本一致,仅仅区别就在于定位比较的时候使用字段的多少,但这不会是语句的最大性能耗用点,最大的应该是循环访问所有的字段和通过主键回表。因此尽量写自己需要的字段。 深入理解MySQL主从原理:https://www.jianshu.com/nb/43148932 个人微信:gaopp_22389860
MySQL:一个特殊的问题
来源:这里教程网
时间:2026-03-01 15:14:41
作者:
编辑推荐:
- 一文解决MySQL时区相关问题03-01
- MySQL:一个特殊的问题03-01
- MySQL 5.7的表删除数据后的磁盘空间释放03-01
- MySQL 5 - 8 各版本快速安装脚本内容03-01
- mysql两阶段提交和组提交03-01
- MySQL 由于MDL读锁select被阻塞03-01
- 通过mysql的federated插件实现dblink功能03-01
- MongoDB与MySQL关于写确认的异同03-01
下一篇:
相关推荐
-
雷神推出 MIX PRO II 迷你主机:基于 Ultra 200H,玻璃上盖 + ARGB 灯效
2 月 9 日消息,雷神 (THUNDEROBOT) 现已宣布推出基于英
-
制造商 Musnap 推出彩色墨水屏电纸书 Ocean C:支持手写笔、第三方安卓应用
2 月 10 日消息,制造商 Musnap 现已在海外推出一款 Oce
热文推荐
- 一文解决MySQL时区相关问题
一文解决MySQL时区相关问题
26-03-01 - mysql两阶段提交和组提交
mysql两阶段提交和组提交
26-03-01 - MySQL 由于MDL读锁select被阻塞
MySQL 由于MDL读锁select被阻塞
26-03-01 - MongoDB与MySQL关于写确认的异同
MongoDB与MySQL关于写确认的异同
26-03-01 - 详解在数据库管理系统中MySQL的应用
详解在数据库管理系统中MySQL的应用
26-03-01 - 关于日期及时间字段的查询
关于日期及时间字段的查询
26-03-01 - sap软件在半导体设计行业中的三种应用!
sap软件在半导体设计行业中的三种应用!
26-03-01 - 我们在选择集成电路运作模式的时候要注意这些?
我们在选择集成电路运作模式的时候要注意这些?
26-03-01 - MySQL 5.6对大表做归档
MySQL 5.6对大表做归档
26-03-01 - MySQL关于日期为零值的处理
MySQL关于日期为零值的处理
26-03-01
