前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >MySQL where条件探索

MySQL where条件探索

作者头像
晓果冻
发布2022-09-08 12:50:00
发布2022-09-08 12:50:00
1.8K00
代码可运行
举报
运行总次数:0
代码可运行

MySQL查询数据过程探索

等值匹配原则
  • 通过主键查找,不需要回表,因为主键下面的叶子节点记录本行的所有数据。
  • 通过唯一索引查找,如果你select的不是这个唯一索引而是类似select *这样非次唯一索引列,那么需要回表,通过主键找到本行所有数据
  • 通过联合索引,情况同唯一索引,如果select的内容不是此索引包含的列,需回表。
代码语言:javascript
代码运行次数:0
运行
复制
假设一张表demo  id,age,name,telephone三列  对age,name建立了联合索引。那么
select * from demo where age = 18需要回表吗?
需要。因为telephone不在次索引中,还需通过主键去查找telephone的值。
而select name from demo where age = 18就不需要回表了,因为此索引中包含name列的值。
最左前缀匹配原则,仅针对联合索引
  • 这个规则就像盖楼房,得一层盖好再盖另一层,不可能直接盖3楼,mysql来了也不行。
  • 示例表结构,注意联合索引的顺序是addr,age,name
代码语言:javascript
代码运行次数:0
运行
复制
CREATE TABLE `demo` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `age` int(3) DEFAULT NULL COMMENT '年龄',
  `name` varchar(11) DEFAULT NULL COMMENT '姓名',
  `addr` varchar(50) DEFAULT NULL COMMENT '地址',
  `telephone` varchar(20) DEFAULT NULL COMMENT '手机号',
  PRIMARY KEY (`id`),
  UNIQUE KEY `unique` (`telephone`),
  KEY `union` (`addr`,`age`,`name`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
  • 直接盖三楼,不可能,还是会给你从开始盖的,全表扫描。 explain select * from demo where name = 'mysql';
  • 就要一楼和二楼,三楼没钱盖了,用到了此联合索引,但是可能不完整,看key_len的值
  • 有钱,全盖,索引长度完整,和计划的楼房高度一致
范围查询规则

表结构

代码语言:javascript
代码运行次数:0
运行
复制
CREATE TABLE `demo` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `age` int(3) DEFAULT NULL COMMENT '年龄',
  `stu_id` int(3) DEFAULT NULL COMMENT '姓名',
  `tel` int(3) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `union` (`age`,`stu_id`),
  KEY `saddad` (`tel`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

一个范围查询,注意key_len,这个也可以从侧面看它用了几个索引 多个范围查询

mysql认为可能还用到了唯一索引,但实际并没有用到,还是只用到了联合索引, 再看key_len的长度和情况1一样,所以验证结论,where后只有第一个范围查 找才生效(如果第一个索引失效,则顺延)。如果有联合索引,仅最左侧的索引字段生效. 范围查询+等值匹配 优先有索引的等值查询

where后是联合索引

mysql先去union的索引树找age等于1的,然后按范围去排序stu_id。 最左匹配原则,也就是前面的记录必须是确定的,这样子才能继续对后面的数据判断。

order by优化

大概懂什么意思了,尽量order索引,因为索引本来就是排好序的,select啥呢,还是索引包含的列或者id,为啥呢,此索引树种的叶子节点就保存这索引列的值和id,为啥还有id,因为回表的时候需要id来找整行数据

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • MySQL查询数据过程探索
    • 等值匹配原则
    • 最左前缀匹配原则,仅针对联合索引
    • 范围查询规则
    • order by优化
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档