文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

MySQL:一个特殊的问题

2024-04-02 19:55

关注

---

这是开发问的一个问题

---

###一、问题描述

如果一个表有一个联合索引 (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 这部分注释如下:

```

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

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯