从上图看到使用name,age,pos建立了一个复合索引,并且排序顺序为name->age->pos。使用此表结构来说一下索引优化和索引失效。

大概总结分为一下几点

  • 全值匹配我最爱(怎么建怎么用)

从三条语句中看出三条语句都用到了索引,而且type类型为ref,where后面的条件越来越多精度越来越高,精度越来越高带来的就是长度和花费的代价也就越来越多(key_len由74-78-140,ref从一个常量变为3个常量)。但是来看下面的情况。

综合上述,我们建的索引是nameAgePos,但是没有了开头的name,如果打破前面创建的索引规则,把where条件剔除掉,使用age和pos或pos来查询的话,紧接着看到的就是全表扫描。没有使用到索引。结合我们下面的说法,就是违背了最佳作前缀法则

  • 最佳作前缀法则

如果索引了多列,要遵守最左前缀法则。指的是查询从索引的最左前列开始并且 不跳过索引中的列。综合起来口诀:带头大哥不能死。

我们可以这么联想,我们创建的索引是nameAgePos,name就好比火车的车头,而后面的age和pos就是车厢,火车头自己可以跑,所以说,单独有name的时候索引没有失效。有火车头带着一个车厢也能跑得起来(name,age)。没了车头车厢也不用说只能晾干了。

再来看一个例子

我们把中间的age去掉,显而易见看到理论和实际都使用了索引,ref也是使用常量。但是两个key_len都是62,说明索引并不是全职匹配而是部分匹配。综合口诀:中间兄弟不能断。

  • 不在索引列上做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效而转向全表扫描

相同结果,做出的东西是一样的,但是分析出的性能却差得多。口诀:索引列上少计算

  • 存储引擎不能使用索引中范围条件右面的列

我们可以看到索引执行的四条中,前三条的type类型都是ref,根据where条件的精度key_len也都在增加,最后一条由于age使用了范围搜索,导致age后的查询条件失效,key_len还是66。综合口诀:范围之后全失效。

  • 尽量使用覆盖索引(只访问索引的查询(索引列和查询列一直)),减少select *。

首先看第一条和第二条的对比,使用*和使用索引列去查询返回的Extra是多了一个using index(用什么取什么会比写*要好很多)。第三条虽然使用了范围查询导致后面的查询条件失效,但是age确是从索引上拿此时key_len的长度为62,而且type也没有使用range而是ref,效果有所提升。第四条同样是根据name,age,pos查询,条件为等于的type相同,key_len确为66,ref为两个常量,此时的查询也比较优秀。还有一种情况只需要个别字段(第五条),也可以使用using index。

  • MySQL在使用不等于(!= 或<>)的时候无法使用索引会导致全表扫描

这个时候不能因为会导致索引失效,而不写,但是得知道这种情况下会导致失效,改写的时候还是也要写。最重要还是看生产环境、业务、技术。具体业务具体分析。

  • is null,is not null 也无法使用索引
  • like以通配符开头('%abc...')mysql索引失效回变成全表扫描的操作

从上述结果看出,只有百分号在右面的才能避免索引失效。且type是range。综合口诀:百分like加右面。

那么如何解决百分号在左边导致全表扫描的问题呢?

我们的解决办法是使用覆盖索引 like字符串时索引失效

  • 字符串不加单引号索引失效
  • 少用or,用它来连接时回索引失效

以上就是索引优化的一些方法,根据上面的例子总结出的一些口诀如下:

  1. 全值匹配我最爱,最左前缀要遵守
  2. 带头大哥不能死,中间兄弟不能断(永远要符合最佳左前缀原则)
  3. 索引列上无计算(计算、函数、(自动、手动)类型转换),范围之后全失效
  4. like百分写最右,覆盖索引不写星
  5. 不等控制还有or,索引失效要少用
  6. var引号不能丢,SQL优化也不难

小例子:

mysql性能优化金字塔法则pdf_MySQL索引优化2-优化法则相关推荐

  1. mysql 学习笔记--存储引擎、索引、sq优化

    全面的 mysql学习笔记–通用语法.函数.数据类型.约束.多表查询.事务 全面的 mysql学习笔记–存储引擎.索引.sql优化 全面的mysql学习笔记–视图/存储过程/触发器.锁.InnoDB引 ...

  2. Mysql优化之三:数据库索引原理及优化

    转自:https://blog.csdn.net/suifeng3051/article/details/52669644 Mysql优化主要是索引的优化 1. 平衡多路搜索树B树(B-tree) 上 ...

  3. SQL终极优化(包括很多非索引方面的优化和原理)

    1. 选用适合的ORACLE优化器         ORACLE的优化器共有3种:         a.       RULE (基于规则)        b. COST (基于成本)       c ...

  4. 面试题: mysql 数据库已看 sql安全性 索引 引擎 sql优化

    总结的一些MySQL数据库面试题 2016年06月16日 11:41:18 阅读数:4950 一.sql语句应该考虑哪些安全性? (1)防止sql注入,对特殊字符进行转义,过滤或者使用预编译的sql语 ...

  5. MySQL实战——表、索引创建与优化

    目录 前言 MySQL表.索引 优化实战 优化前 - 表.索引结构 表优化思路 非聚簇索引优化思路 组合索引优化思路 认识key_len 依据最左匹配选择 只使用一列也能走联合索引 依据最左匹配选择 ...

  6. MySQL优化器选错索引情况

    MySQL优化器选错索引情况 1. 优化器选错索引 2. 优化器的逻辑 3. 索引选择异常和处理 1. 优化器选错索引 之前MySQL架构以及执行sql查询语句介绍过MySQL优化器可以帮助我们优化s ...

  7. 面试官邪魅一笑:MySQL千万级别大表,你要如何优化?

    作者:码农 原文链接:https://segmentfault.com/a/1190000006158186#comment-area 当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考 ...

  8. 【Mysql性能调优】高性能表结构及索引设计的最优实践

    数据库表设计 良好的表结构设计是高性能的基石,应该根据系统将要执行的业务查询来设计,这往往需要权衡各种因素.糟糕的表结构设计,会浪费大量的开发时间,严重延误项目开发周期,让人痛苦万分,而且直接影响到数 ...

  9. MySQL性能调优(MySQL高性能第三版)

    创建高性能索引 query优化 连接优化 内存使用 查询缓存优化 日志设置优化 Innodb存储引擎优化 索引设计问题 1.不稳定列问题: 磁盘驱动器的负载和DML语句的性能需求决定了表上索引数目的上 ...

最新文章

  1. C#系列五《多样化的程序分支》
  2. python处理csv文件缺失值_python处理数据中缺失值
  3. wget下载https时遇到not trusted下载不了的解决办法
  4. CF643E Bear and Destroying Subtrees
  5. 于ubuntu配置hadoop当问题
  6. 知识归纳,程序猿必备的21张(神经网络、线性代数、可视化等)数据挖掘速查表
  7. Tomcat7目录结构详解(非常详细)
  8. vs2010添加TSTCON( ActiveX Control Test Container )工具
  9. Maximum Profit Aizu - ALDS1_1_D
  10. Java 多线程 并发编程------超全面
  11. TreeMap实现排序
  12. CF1408G:Clusterization Counting(区间dp、克鲁斯卡尔重构树)
  13. 怎么讲d 盘里的软件弄到桌面_GNOME 2 粉丝喜欢 Mate Linux 桌面的什么?
  14. python编译环境对cpu要求高不高_解决Tensorflow 使用时cpu编译不支持警告的问题
  15. 业界安全事件最新动态
  16. vSphere web client 虚拟机生成模板快速部署
  17. VUE项目SEO问题的解决
  18. SLAM--Geometric jacobian of UR series.
  19. FLAC文件格式详解
  20. Vijos 1253 旅行家的预算

热门文章

  1. 经典KMP算法C++与Java实现代码
  2. 超级usb万能启动盘
  3. mysql怎么使用sql语句查看表的编码_MySQL中使用SQL语句查看某个表的编码
  4. mysql 数据库事务处理_MySQL数据库事务及其原理
  5. python获取计算机信息系统数据罪_工作心得:破坏计算机信息系统罪与非法获取计算机信息系统数据罪的区分...
  6. 按位异或运算和求反运算解析
  7. linux 设置git ip,centos7安装gitlab并更改端口IP地址
  8. jdbc mysql 换行符_mysql JDBC URL格式各个参数详解
  9. html表单中的数据提交后清空,怎么实现小程序中表单提交后自动清空内容
  10. vue判断显示隐藏_web前端进阶之【Vue】10分钟掌握Vue 在学Vue的童鞋过来拿资料