MySQL 高级 -- 性能优化之索引
👨🎓作者:Java 学术趴
💌公众号:Java 学术趴
🚫特别声明:原创不易,未经授权不得转载或抄袭,如需转载可联系小编授权。
🙏版权声明:文章里的部分文字或者图片来自于互联网以及百度百科,如有侵权请尽快联系小编。微信搜索公众号 Java 学术趴联系小编。
☠️每日毒鸡汤:一件事你犹豫去不去做,那就是该立即动身做的。
1. 索引优化分析
1.1 手写 SQL 和机读 SQL
机器读的 SQL 和我们写的 SQL 是不一样的。
几种表关联方式
1.2 索引
1.2.1 索引概念
索引(index)是帮助 MySQL 高效查询获取数据的数据结构。
索引的本质:索引是数据结构,是一种排好序的快速查找数据结构。
索引的目的在于提高查询效率,可以类比字典,如果要查”mysql“这个单词,我们肯定需要定位到 m 字母,然后从上往下找 y 字母,在找到剩下的 sql。如果没有索引,那么你可能需要 a---z 依次查询。
索引之所以查的快是因为已经排序好了,所以查询的速度比较快。
在数据之外, 数据库系统还维护着满足特定查找算法的数据结构, 这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。
左边是数据表,一共两列七条记录,最左边的是数据记录的物理地址。
1.2.2 索引的分类
单一索引: 即一个索引只包含单个列,一个表可以有多个单列索引。
唯一索引: 索引列的值必须唯一,但允许为空。
复合索引: 即一个索引包含多个列。
1.2.3 MySQL 索引结构
BTree 索引: 检索过程
Hash 索引
full-text
R-Tree 索引
1.3.4 适合创建索引的场景
主键自动建立一个唯一索引。
频繁作为查询条件的字段应该创建索引。
查询中与其他表关联的字段,外键关系建立索引。
频繁更新的字段不适合创建索引(因为每次更新不单单的更新表中的数据,还要更新索引)
where 条件里用不到的字段不创建索引。
单键/组合索引的选择问题?(一般在高并发的情况下倾向创建组合索引)
查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度(原始数据已经排序好了,不用在使用索引进行排序)
查询中统计或者分组字段(分组的前提是数据已经排序好了,既然排序就与索引息息相关)
1.3.5 不适合创建索引的场景
表记录少:原始数据很少,不需要索引查询的速度也非常快。
经常增、删、改的表:提高查询速度的同时,在进行数据增删改的操作时, 操作原始数据的同时还需要操作索引文件,会占用大量的性能。
数据重复且分布平均的表字段:索引一般使用在经常查询和经常排序的字段。如果某个字段存在大量重复的元素,为它建立索引就没有太大的意义。
版权声明: 本文为 InfoQ 作者【Java学术趴】的原创文章。
原文链接:【http://xie.infoq.cn/article/4345c76f6cf5186dd2a2eadd3】。文章转载请联系作者。
评论