我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL:一个特殊的问题

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

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySQL:一个特殊的问题

---

这是开发问的一个问题

---

###一、问题描述

如果一个表有一个联合索引 (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

MySQL:一个特殊的问题

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python处理mysql特殊字符的问题

有的时候我们会去扫表,然后拿出扫的结果再到另一张表里去查信息。比如下面一段index_sql_str = "select %s from user where %s = %d" % ("social_id", "user_id", u_id
2022-05-17

sql server特殊字符查询问题及ESCAPE的使用

公司一个老项目,sql server的模糊查询时,查询条件包含 [] ,然后查询结果就一直为空查阅资料得知:如果 LIKE 模式中的转义符后面没有字符,则该模式无效并且 LIKE 返回 FALSE。如果转义符后面的字符不是通配符,则将放弃转义符并将该转义符后面
sql server特殊字符查询问题及ESCAPE的使用
2015-06-01

MyBatis特殊字符转义拦截器问题针对(_、\、%)

这篇文章主要介绍了MyBatis特殊字符转义拦截器问题针对(_、\、%),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-02-07

linux文件名特殊字符问题怎么解决

在Linux系统中,文件名可以包含许多特殊字符,但有些字符在命令行下可能会引起问题。以下是一些常见的解决方法:1. 使用反斜杠转义特殊字符:在特殊字符之前加上反斜杠(\)可以转义字符,使其被正确解释。例如,如果文件名包含空格,可以使用`\`
2023-09-16

分享一些RxJava的特殊用法

这篇文章给大家介绍分享一些RxJava的特殊用法,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、按钮绑定通过 RxView 可以对 view 进行快速的 clicks 绑定RxView.clicks(button).
2023-05-31

MySQL中关于null值的一个小问题

今天在测试null值的时候,发现了一个小问题,记录在这里,不知道大家以前遇到过没。 事情发展是这样的,在过滤一个表中的数值的时候,需要把age=2的列给剔除掉,然后查看剩余的列信息,这个操作看起来比较简单,我用一个表模拟一下
2022-05-29

linux如何获取一个已安装包的特殊信息

本文介绍了在Linux系统中获取已安装软件包特殊信息的方法。可以通过使用dpkg、apt-cache(对于Debian/Ubuntu系统)、rpm(对于RPM系统)和yum(对于Yum系统)命令,以及apt-file、pkginfo和rpm2cpio等其他工具。这些命令提供了包描述、版本、依赖关系、配置文件位置等信息。获取此信息对于管理系统至关重要,例如更新、升级或解决依赖性问题。
linux如何获取一个已安装包的特殊信息
2024-04-02

50个SQL语句(MySQL版) 问题一

--------------------------表结构--------------------------student(StuId,StuName,StuAge,StuSex) 学生表teacher(TId,Tname) 教师表course(CId,Cn
50个SQL语句(MySQL版) 问题一
2017-05-02

MyBatis解决模糊查询包含特殊字符问题

这篇文章主要介绍了MyBatis解决模糊查询包含特殊字符问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-02-07

Excel数据导入Mysql常见问题汇总:如何处理特殊字符导致导入失败的问题?

Excel数据导入MySQL常见问题汇总:如何处理特殊字符导致导入失败的问题?导入数据到MySQL是一个常见且重要的操作,但在实际操作中,你可能会遇到一些问题。其中之一就是特殊字符导致导入失败的情况。本文将为你介绍一些常见的问题及其解决方法
2023-10-22

编程热搜

目录