原理

b+ 树,记住这棵树!索引所有优化都围绕这棵树展开(hash索引除外)

优缺点

优点

索引大大减小了服务器需要扫描的数据量

索引可以帮助服务器避免排序和临时表

索引可以将随机IO变成顺序IO

索引对于InnoDB(对索引支持行级锁)非常重要,因为它可以让查询锁更少的元组。在MySQL5.1和更新的版本中,InnoDB可以在服务器端过滤掉行后就释放锁,但在早期的MySQL版本中,InnoDB直到事务提交时才会解锁。对不需要的元组的加锁,会增加锁的开销,降低并发性。 InnoDB仅对需要访问的元组加锁,而索引能够减少InnoDB访问的元组数。但是只有在存储引擎层过滤掉那些不需要的数据才能达到这种目的。一旦索引不允许InnoDB那样做(即索引达不到过滤的目的),MySQL服务器只能对InnoDB返回的数据进行WHERE操作,此时,已经无法避免对那些元组加锁了。如果查询不能使用索引,MySQL会进行全表扫描,并锁住每一个元组,不管是否真正需要。

关于InnoDB、索引和锁:InnoDB在二级索引上使用共享锁(读锁),但访问主键索引需要排他锁(写锁)

缺点

虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存索引文件。

建立索引会占用磁盘空间的索引文件。一般情况这个问题不太严重,但如果你在一个大表上创建了多种组合索引,索引文件的会膨胀很快。

如果某个数据列包含许多重复的内容,为它建立索引就没有太大的实际效果。

对于非常小的表,大部分情况下简单的全表扫描更高效;

类型

存储方式:

聚族索引:同一个数据结构中保存了索引与数据(如InnoDB的主键索引,适合多行检索)

非聚族索引:非聚族索引,也称二级索引(适合单行检索)

索引类型:

普通索引:最基本的索引,没有任何限制,是我们大多数情况下使用到的索引。

唯一索引:与普通索引类型,不同的是唯一索引的列值必须唯一,但允许为空值。

主键索引:不允许值为空的唯一索引。

组合索引:将几个列作为一条索引进行检索,使用最左匹配原则。

全文索引:全文索引(FULLTEXT)仅可以适用于MyISAM引擎的数据表;作用于CHAR、VARCHAR、TEXT数据类型的列。(很少使用,业界基本用 ES)

使用

原则:

最左前缀匹配原则:

索引选择性:公式是 COUNT(DISTINCT col) / COUNT(*),表示字段不重复的比率,比率越大扫描的记录数就越少,性能越佳

索引尽可能短:B+树数据结构决定,过长降低性能;

索引列不能参与计算:B+树数据结构决定,如有函数处理索引将会实效;

注意点:

索引覆盖(一个索引包含(或者说是覆盖)需要查询的所有字段)可减少回表操作提高查询速度;

查询条件可以乱序,MySQL的查询优化器会优化成索引可以识别的模式;

尽可能的扩展索引,不要新建立索引;(索引太多影响写速度)

索引不会包含有NULL值的列:只要列中包含有NULL值,都将不会被包含在索引中,组合索引中只要有一列有NULL值,那么这一列对于此条组合索引就是无效的;

单个多列组合索引和多个单列索引的检索查询效果不同,MySQL查询只使用一个索引,如果WHERE子句中已经使用了索引的话,那么ORDER BY中的列是不会使用索引;

联合索引实效情况:

调优步骤:

查看运行效果,是否真的很慢,主要设置SQL_NO_CACHE;

WHERE条件单表查询,锁定最小返回记录表。这句话的意思是,把查询语句的WHERE都应用到表中返回的记录数最小的表开始查起,单表每个字段分别查询,看哪个字段的区分度最高;

EXPLAIN查看执行计划,是否与1预期一致(从锁定记录较少的表开始查询);

ORDER BY LIMIT 形式的SQL语句,让排序的表优先查;

了解业务的使用场景;

加索引时,参照建立索引的几大原则;

观察结果,不符合预期,则重新从1开始分析;

进阶

磁盘IO与预读

数据结构选择:b+树、b树、红黑树对比

InnoDB/MyISAM 索引对比

Explain详解

参考

《高性能MySQL》第3版

https://blog.csdn.net/mysteryhaohao/article/details/51719871

https://zhuanlan.zhihu.com/p/29118331

https://www.infoq.cn/article/OJKWYykjoyc2YGB0Sj2c

https://tech.meituan.com/2014/06/30/mysql-index.html

https://segmentfault.com/a/1190000021464570

MySQL 索引优化指南

标签:wps   必须   多列   insert   不同的   code   缺点   组合   查询

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

本文系统来源:https://www.cnblogs.com/GO-NO-1/p/13283014.html

infoq mysql索引_MySQL 索引优化指南相关推荐

  1. mysql 大量数据 更改索引_Mysql索引数据结构详解与索引优化

    本篇文章主要学习了MySQL的索引的数据结构的认识,做一个大概的了解即可. 一.索引 在关系数据库中,索引是一种单独的.物理的对数据库表中一列或多列的值进行排序的一种存储数据结构,它是某个表中一列或若 ...

  2. mysql字段简索引_Mysql索引优化攻略(全)

    所谓索引就是为特定的mysql字段进行一些特定的算法排序,比如二叉树的算法和哈希算法,哈希算法是通过建立特征值,然后根据特征值来快速查找.而用的最多,并且是mysql默认的就是二叉树算法 BTREE, ...

  3. mysql 排序字段是否需要建索引_MySQL索引详解(优缺点,何时需要/不需要创建索引,索引及sql语句的优化)...

    一.什么是索引? 索引是对数据库表中的一列或多列值进行排序的一种结构,使用索引可以快速访问数据库表中的特定信息. 二.索引的作用? 索引相当于图书上的目录,可以根据目录上的页码快速找到所需的内容,提高 ...

  4. mysql 重复率高字段 索引_MySQL性能优化(二)索引优化

    一.选择合适的列建立索引 1.在where从句,group by从句,order by从句,on从句中出现的列(select) 2.索引字段越小越好(表每页数据才会更多,IO效率会更高) 3.离散度大 ...

  5. mysql 更新索引_MySQL索引优化

    MySQL支持的索引类型 B-tree索引的特点 1.B-tree索引以B+树的结构存储数据 2.B-tree索引能够加快数据的查询速度 3.B-tree索引更适合进行行范围查找 B-tree结构图 ...

  6. mysql or 创建索引_Mysql索引优化

    1.单表索引优化 单表索引优化分析 创建表 建表 SQL CREATE TABLE IF NOT EXISTS article( id INT(10) UNSIGNED NOT NULL PRIMAR ...

  7. 手机号 mysql 索引_mysql索引以及优化

    :最左前缀原则中where字句有or出现还是会遍历全表 (1) 其实where条件的顺序不影响使用索引,比如三个字段添加联合索引t_user表联合索引(name, mobile, create_dat ...

  8. mysql locate索引_MYSQL索引优化

    1.查看sql的执行频率 MySQL 客户端连接成功后,通过 show [session|global] status 命令可以提供服务器状态信息.show [session|global] stat ...

  9. mysql locate不走索引_MySQL 索引——定位并优化慢 SQL

    定位并优化慢查询SQL.png 为什么要学习定位并优化慢查询 SQL 日常开发中,在数据量比较小的表中,SQL 的执行效率可能没什么问题,但是随着表数据量的增加,慢 SQL 可能就会慢慢浮现,因此学习 ...

  10. mysql带where的join加索引_MySQL索引分析和优化+JOIN的分类(转)

    join : 左右合併 inner join : 只顥示符合修件的資料列 (左右互相比對) left join : 顥示符合條件的右資料列及左邊不符合條件的資料列 (此時右邊的資料會以 NULL 顯示 ...

最新文章

  1. python成绩统计_python学习-统计学生成绩-统计学生成绩
  2. wxPython多线程界面卡死或在不同平台崩溃问题
  3. oracle protocol=beq 不可用,学习笔记:Oracle数据库坏块 深入研究obj$坏块导致exp/expdp不能执行原因...
  4. toAppendStream doesn‘t support consuming update changes which is produced by node GroupAggregate
  5. LeetCode 1701. 平均等待时间(模拟)
  6. 【新功能】媒体处理MPS全新支持自适应多码率、多语言音轨
  7. TensorFlow的基本运算03
  8. VCGLib中邻接关系的实现
  9. samba 部署和优化
  10. 深度学习head、neck、backbone三个术语分别是指什么?
  11. [UE4] Spawn Emitter Attached 特效消失的问题的解决方法:ParticleSystem 必须附着在角色的 Mesh 上
  12. apple pencil_如何检查Apple Pencil的电池电量
  13. 让迁移不再开盲盒,让云也能省钱丨Hackathon 项目背后的故事第一期回顾
  14. Excel使用教程: 关于Excel的窗口冻结与拆分
  15. angular 万年历_jQuery实现的简单日历组件定义与用法示例
  16. 用Kodi访问Win10共享文件夹
  17. 京东到家开放平台网关系统设计实践
  18. ASP.NET设置404错误页面
  19. Test OpenStack SRIOV (by quqi99)
  20. 最全面试宝典-我的春招总结

热门文章

  1. HDU 1325 Is It A Tree?(并查集)
  2. HashMap死循环讲解(JDK1.8 之前)
  3. 常用的一些集合工具类
  4. Mybatis原理解析(一)解析全局xml配置文件生成SqlSessionFactory过程
  5. 去除A和B数组中的交集
  6. 130242014062-黄凌逸-电商系统某功能模块“需求分析与设计实验课小结
  7. css 多行文本的溢出显示省略号(移动端)
  8. 关于rnn神经网络的loss函数的一些思考
  9. odoo 中实现多列搜索
  10. iOS启动动画效果实现