在码农的世界里,优美的应用体验,来源于程序员对细节的处理以及自我要求的境界,年轻人也是忙忙碌碌的码农中一员,每天、每周,都会留下一些脚印,就是这些创作的内容,有一种执着,就是不知为什么,如果你迷茫,不妨来瞅瞅码农的轨迹。

  • 优美的音乐节奏带你浏览这个效果的编码过程
  • 坚持每一天,是每个有理想青年的追求
  • 追寻年轻人的脚步,也许你的答案就在这里
  • 如果你迷茫 不妨来瞅瞅这里

在这里,有一张存有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 一条普通的查询语句 你知道如何优雅的使用 前缀索引、索引下推优化查询速度吗?相关推荐

  1. MySql 一条普通的查询语句 你知道需要执行几次树的搜索操作以及会扫描多少行吗??? MySql 索引覆盖

    在码农的世界里,优美的应用体验,来源于程序员对细节的处理以及自我要求的境界,年轻人也是忙忙碌碌的码农中一员,每天.每周,都会留下一些脚印,就是这些创作的内容,有一种执着,就是不知为什么,如果你迷茫,不 ...

  2. mysql索引下沉_MySQL 5.6 索引条件下推优化

    索引下推优化是MySQL5.6版本中新加的功能. 索引条件下推(ICP)是对MySQL使用索引从表中检索行的情况的优化.如果没有ICP,存储引擎会遍历索引以查找基表中的行,并将它们返回给MySQL服务 ...

  3. mysql索引条件下推_MySQL 索引条件下推优化

    一 什么是"索引条件下推" "索引条件下推",称为Index Condition Pushdown (ICP),这是MySQL提供的用某一个索引对一个特定的表从 ...

  4. 【mysql优化 2】索引条件下推优化

    原文地址:Index Condition Pushdown Optimization 索引条件下推(ICP:index condition pushdown)是mysql中一个常用的优化,尤其是当my ...

  5. MySQL 查询缓存快速理解。。。(1分钟图解如何优化查询缓存)

    2019独角兽企业重金招聘Python工程师标准>>> 转载于:https://my.oschina.net/CandyMi/blog/529307

  6. MySql 一条更新语句是如何执行的? MySql杂谈、MySql WAL 技术

    在码农的世界里,优美的应用体验,来源于程序员对细节的处理以及自我要求的境界,年轻人也是忙忙碌碌的码农中一员,每天.每周,都会留下一些脚印,就是这些创作的内容,有一种执着,就是不知为什么,如果你迷茫,不 ...

  7. Mysql查询语句练习

    mysql基础 mysql 语法规范: 不区分大小写,但建议关键字大写,表名.列名小写: 每条命令最好用分号结尾: 每条命令根据需要,可进行缩进或换行 注释#单行注释 --单行注释 /* */多行注释 ...

  8. MySQL优化索引及优化汉字模糊查询语句

    转 http://blog.csdn.net/firstboy0513/article/details/6912632 利用MySQL这种关系型数据库来做索引,的确有些勉强了,也只能看情况来说了,有些 ...

  9. 导致MySQL的查询语句效率低下的可能原因

    前言 本文来自于网络的拼凑,目的在于面试时可以让大家 pretend to be something (zhuang bi) . 一.执行语句执行效率低下的原因 ① SQL语句本身没那么慢,但是在某些 ...

最新文章

  1. dubbo多网卡时,服务提供者的错误IP注册到注册中心导致消费端连接不上
  2. java访问器_ONGN和java字段访问器(get,set)
  3. 虚拟主机选择php版本,虚拟主机的php用什么版本好
  4. 这样用Docker 搭建 Jenkins 实现自动部署,你知道吗?
  5. java list用法_Java List 用法详解及实例分析
  6. 检查硬件变化的命令kudzu
  7. Matlab中图像函数大全
  8. mpvue微信小程序引入腾讯地图sdk
  9. linux调度器(七)——other cfs class api and functions
  10. paip.utf-8,unicode编码的本质输出unicode文件原理 python
  11. 用户计算机证书在哪里找,用户、计算机或服务的“证书”管理单元 怎么进?...
  12. python给csv文件添加表头
  13. spring注解开发实例
  14. 微分几何笔记(1)——参数曲线、内积、外积
  15. matlab多元线性回归方程代码
  16. 聊天群怎么引流?微信群精准引流的方法
  17. MySQL报错 SELECT list is not in GROUP BY clause and contains nonaggregated column...
  18. 配置大华网络摄像机,并远程存储到FTP服务器
  19. 图像处理----图像模糊(高斯模糊)
  20. 德州学院计算机系吧,任传成(计算机系)老师 - 德州学院 - 院校大全

热门文章

  1. 中科院地平线开源state-of-the-art行人重识别算法EANet:增强跨域行人重识别中的部件对齐...
  2. oracle 常用隐藏参数_oracle 查看隐藏参数
  3. 收藏 | EfficientNet模型的完整细节
  4. 大神云集!2019年谷歌博士奖学金获得者重磅问世,清华、上交大、港中文入选最多!...
  5. 对!这就是你要的pandas数据清洗练习题(❤️)
  6. MPC实现自动驾驶轨迹跟踪
  7. Matlab线性/非线性规划优化算法(7)
  8. vscode beautify sass 格式化_最强编辑器 VSCode 系列之插件推荐【不定期更新】
  9. 嵌入式linux面试题库,嵌入式linux面试题解析(二)——C语言部分三
  10. 一年月份大小月口诀_怀胎十月,为啥我只能算出9个月?