MySql 一条普通的查询语句 你知道如何优雅的使用 前缀索引、索引下推优化查询速度吗?
在码农的世界里,优美的应用体验,来源于程序员对细节的处理以及自我要求的境界,年轻人也是忙忙碌碌的码农中一员,每天、每周,都会留下一些脚印,就是这些创作的内容,有一种执着,就是不知为什么,如果你迷茫,不妨来瞅瞅码农的轨迹。
- 优美的音乐节奏带你浏览这个效果的编码过程
- 坚持每一天,是每个有理想青年的追求
- 追寻年轻人的脚步,也许你的答案就在这里
- 如果你迷茫 不妨来瞅瞅这里
在这里,有一张存有10多万条用户数据的表,你知道接下来会发生什么吗 ?这是建表语句中的一小部分
CREATE TABLE `t_user`(`id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMIT '主键ID',`id_card` VARCHAR(32) DEFAULT NULL COMMIT '用户身份证',`u_name` VARCHAR(32) DEFAULT NULL COMMIT '用户姓名',`u_age` INT(11) DEFAULT NULL COMMIT '用户年龄',`u_male` TINYINT(1) DEFAULT NULL ,PRIMARY KEY(`id`) ,KEY `id_card`(`id_card`) ,KEY `name_age`(`u_name` , `u_age`)
) ENGINE = INNODB
如上所示 我们创建了(用户年龄与姓名)的联合索引,如果现在有一个高频请求,要根据用户的姓名查询他的年龄,这个联合索引就有意了。它可以在这个高频请求上用到 覆盖索引,不再需要回表查整行记录,减少语句的执行时 间。
索引字段的维护是有代价的,所以在建立冗余索引来支持覆盖索引时就需要权衡业务的需求,不能盲目来。
1 前缀索引
如果为每一种查询都设计一个索引,索引也就太多了,如我们再多一个根据用户身份证号来查看他的姓名或者是地址,这个查询需求在业务中出现的概率不高,每次查询时让它走全表扫描也是可以的,但这也太low了,数据量一上百万级别,人眼感觉的慢。
所以可以使用 索引的“最左前缀” 来定位记录。
如上图所示,索引项是按照索引定义里面出现的字段顺序排序的,当需要查到所有名字是“张三”的人时,可以快速定位到 ID为1001的位置,然后向后遍历得到所有需要的结果。
当你的查询是模糊查询时,也能够用上图这个索引,查找到第一个符合条件的记录是 ID为1001的位置,然 后向后遍历,直到不满足条件为止。
select * from t_user where name like '张 %'
这样看来,只要是查询的条件满足满足联合索引的最左前缀,就可以利用索引来加速检索,这个最左前缀可以是联合索引的最左 N 个字段,可称作是前缀索引。
基于联合索引的使用,在建立联合索引的时候,如何安排索引内的字段顺序便是一个效率的关键点,一个参考的原则就是
索引的复用能力: 当有了 (a,b) 这个联合索引后,一般就不需要单独在 a 上建立索引了,如果通过调 整顺序,可以少维护一个索引,那么这个顺序往往就是需要优先考虑采用的。
如在这里我们创建的 ‘name_age’ ,从空间的角度来看,name 字段是比 age 字段大的 ,所以我们创建一个(name,age) 的联合索引和一个 (age) 的单字段索 引。
2 索引下推
如在这里 t_user 表的 (name,age) 的联合索引,当执行如下查询筛选时
select * from t_user where name like '张 %' and age=20
首先会使用(name,age) 的联合索引的 前缀索引规则找到第一个满足条件的ID为1001,然后一个个回表到主键索引上找出数据行,如下图所示:
在这个过程 InnoDB 并不会去看 联合索引表age 的值,只是按顺序把“name 第一个字是’张’的记录一条条取出来回表,因此查询出来三条数据, 需要回表 4 次。
MySQL 5.6 引入的索引下推优化(index condition pushdown), 可以在索引遍历过 程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数,如下图所示
在这个过种中InnoDB 在 (name,age) 索引内部就判断了 age 是否等于 20,对于 不等于 20 的记录,直接判断并跳过,在查询中,只需要对 ID-1001、ID-1011 这两条记 录回表取数据判断,查询三条数据,就只需要回表 2 次。
完毕
不局限于思维,不局限语言限制,才是编程的最高境界。
以小编的性格,肯定是要录制一套视频的,随后会上传
有兴趣 你可以关注一下 西瓜视频 — 早起的年轻人
MySql 一条普通的查询语句 你知道如何优雅的使用 前缀索引、索引下推优化查询速度吗?相关推荐
- MySql 一条普通的查询语句 你知道需要执行几次树的搜索操作以及会扫描多少行吗??? MySql 索引覆盖
在码农的世界里,优美的应用体验,来源于程序员对细节的处理以及自我要求的境界,年轻人也是忙忙碌碌的码农中一员,每天.每周,都会留下一些脚印,就是这些创作的内容,有一种执着,就是不知为什么,如果你迷茫,不 ...
- mysql索引下沉_MySQL 5.6 索引条件下推优化
索引下推优化是MySQL5.6版本中新加的功能. 索引条件下推(ICP)是对MySQL使用索引从表中检索行的情况的优化.如果没有ICP,存储引擎会遍历索引以查找基表中的行,并将它们返回给MySQL服务 ...
- mysql索引条件下推_MySQL 索引条件下推优化
一 什么是"索引条件下推" "索引条件下推",称为Index Condition Pushdown (ICP),这是MySQL提供的用某一个索引对一个特定的表从 ...
- 【mysql优化 2】索引条件下推优化
原文地址:Index Condition Pushdown Optimization 索引条件下推(ICP:index condition pushdown)是mysql中一个常用的优化,尤其是当my ...
- MySQL 查询缓存快速理解。。。(1分钟图解如何优化查询缓存)
2019独角兽企业重金招聘Python工程师标准>>> 转载于:https://my.oschina.net/CandyMi/blog/529307
- MySql 一条更新语句是如何执行的? MySql杂谈、MySql WAL 技术
在码农的世界里,优美的应用体验,来源于程序员对细节的处理以及自我要求的境界,年轻人也是忙忙碌碌的码农中一员,每天.每周,都会留下一些脚印,就是这些创作的内容,有一种执着,就是不知为什么,如果你迷茫,不 ...
- Mysql查询语句练习
mysql基础 mysql 语法规范: 不区分大小写,但建议关键字大写,表名.列名小写: 每条命令最好用分号结尾: 每条命令根据需要,可进行缩进或换行 注释#单行注释 --单行注释 /* */多行注释 ...
- MySQL优化索引及优化汉字模糊查询语句
转 http://blog.csdn.net/firstboy0513/article/details/6912632 利用MySQL这种关系型数据库来做索引,的确有些勉强了,也只能看情况来说了,有些 ...
- 导致MySQL的查询语句效率低下的可能原因
前言 本文来自于网络的拼凑,目的在于面试时可以让大家 pretend to be something (zhuang bi) . 一.执行语句执行效率低下的原因 ① SQL语句本身没那么慢,但是在某些 ...
最新文章
- dubbo多网卡时,服务提供者的错误IP注册到注册中心导致消费端连接不上
- java访问器_ONGN和java字段访问器(get,set)
- 虚拟主机选择php版本,虚拟主机的php用什么版本好
- 这样用Docker 搭建 Jenkins 实现自动部署,你知道吗?
- java list用法_Java List 用法详解及实例分析
- 检查硬件变化的命令kudzu
- Matlab中图像函数大全
- mpvue微信小程序引入腾讯地图sdk
- linux调度器(七)——other cfs class api and functions
- paip.utf-8,unicode编码的本质输出unicode文件原理 python
- 用户计算机证书在哪里找,用户、计算机或服务的“证书”管理单元 怎么进?...
- python给csv文件添加表头
- spring注解开发实例
- 微分几何笔记(1)——参数曲线、内积、外积
- matlab多元线性回归方程代码
- 聊天群怎么引流?微信群精准引流的方法
- MySQL报错 SELECT list is not in GROUP BY clause and contains nonaggregated column...
- 配置大华网络摄像机,并远程存储到FTP服务器
- 图像处理----图像模糊(高斯模糊)
- 德州学院计算机系吧,任传成(计算机系)老师 - 德州学院 - 院校大全
热门文章
- 中科院地平线开源state-of-the-art行人重识别算法EANet:增强跨域行人重识别中的部件对齐...
- oracle 常用隐藏参数_oracle 查看隐藏参数
- 收藏 | EfficientNet模型的完整细节
- 大神云集!2019年谷歌博士奖学金获得者重磅问世,清华、上交大、港中文入选最多!...
- 对!这就是你要的pandas数据清洗练习题(❤️)
- MPC实现自动驾驶轨迹跟踪
- Matlab线性/非线性规划优化算法(7)
- vscode beautify sass 格式化_最强编辑器 VSCode 系列之插件推荐【不定期更新】
- 嵌入式linux面试题库,嵌入式linux面试题解析(二)——C语言部分三
- 一年月份大小月口诀_怀胎十月,为啥我只能算出9个月?