infoq mysql索引_MySQL 索引优化指南
原理
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 索引优化指南相关推荐
- mysql 大量数据 更改索引_Mysql索引数据结构详解与索引优化
本篇文章主要学习了MySQL的索引的数据结构的认识,做一个大概的了解即可. 一.索引 在关系数据库中,索引是一种单独的.物理的对数据库表中一列或多列的值进行排序的一种存储数据结构,它是某个表中一列或若 ...
- mysql字段简索引_Mysql索引优化攻略(全)
所谓索引就是为特定的mysql字段进行一些特定的算法排序,比如二叉树的算法和哈希算法,哈希算法是通过建立特征值,然后根据特征值来快速查找.而用的最多,并且是mysql默认的就是二叉树算法 BTREE, ...
- mysql 排序字段是否需要建索引_MySQL索引详解(优缺点,何时需要/不需要创建索引,索引及sql语句的优化)...
一.什么是索引? 索引是对数据库表中的一列或多列值进行排序的一种结构,使用索引可以快速访问数据库表中的特定信息. 二.索引的作用? 索引相当于图书上的目录,可以根据目录上的页码快速找到所需的内容,提高 ...
- mysql 重复率高字段 索引_MySQL性能优化(二)索引优化
一.选择合适的列建立索引 1.在where从句,group by从句,order by从句,on从句中出现的列(select) 2.索引字段越小越好(表每页数据才会更多,IO效率会更高) 3.离散度大 ...
- mysql 更新索引_MySQL索引优化
MySQL支持的索引类型 B-tree索引的特点 1.B-tree索引以B+树的结构存储数据 2.B-tree索引能够加快数据的查询速度 3.B-tree索引更适合进行行范围查找 B-tree结构图 ...
- mysql or 创建索引_Mysql索引优化
1.单表索引优化 单表索引优化分析 创建表 建表 SQL CREATE TABLE IF NOT EXISTS article( id INT(10) UNSIGNED NOT NULL PRIMAR ...
- 手机号 mysql 索引_mysql索引以及优化
:最左前缀原则中where字句有or出现还是会遍历全表 (1) 其实where条件的顺序不影响使用索引,比如三个字段添加联合索引t_user表联合索引(name, mobile, create_dat ...
- mysql locate索引_MYSQL索引优化
1.查看sql的执行频率 MySQL 客户端连接成功后,通过 show [session|global] status 命令可以提供服务器状态信息.show [session|global] stat ...
- mysql locate不走索引_MySQL 索引——定位并优化慢 SQL
定位并优化慢查询SQL.png 为什么要学习定位并优化慢查询 SQL 日常开发中,在数据量比较小的表中,SQL 的执行效率可能没什么问题,但是随着表数据量的增加,慢 SQL 可能就会慢慢浮现,因此学习 ...
- mysql带where的join加索引_MySQL索引分析和优化+JOIN的分类(转)
join : 左右合併 inner join : 只顥示符合修件的資料列 (左右互相比對) left join : 顥示符合條件的右資料列及左邊不符合條件的資料列 (此時右邊的資料會以 NULL 顯示 ...
最新文章
- python成绩统计_python学习-统计学生成绩-统计学生成绩
- wxPython多线程界面卡死或在不同平台崩溃问题
- oracle protocol=beq 不可用,学习笔记:Oracle数据库坏块 深入研究obj$坏块导致exp/expdp不能执行原因...
- toAppendStream doesn‘t support consuming update changes which is produced by node GroupAggregate
- LeetCode 1701. 平均等待时间(模拟)
- 【新功能】媒体处理MPS全新支持自适应多码率、多语言音轨
- TensorFlow的基本运算03
- VCGLib中邻接关系的实现
- samba 部署和优化
- 深度学习head、neck、backbone三个术语分别是指什么?
- [UE4] Spawn Emitter Attached 特效消失的问题的解决方法:ParticleSystem 必须附着在角色的 Mesh 上
- apple pencil_如何检查Apple Pencil的电池电量
- 让迁移不再开盲盒,让云也能省钱丨Hackathon 项目背后的故事第一期回顾
- Excel使用教程: 关于Excel的窗口冻结与拆分
- angular 万年历_jQuery实现的简单日历组件定义与用法示例
- 用Kodi访问Win10共享文件夹
- 京东到家开放平台网关系统设计实践
- ASP.NET设置404错误页面
- Test OpenStack SRIOV (by quqi99)
- 最全面试宝典-我的春招总结