写点什么

MySQL 高级 -- 性能优化之索引

作者:Java学术趴
  • 2022 年 10 月 11 日
    北京
  • 本文字数:1027 字

    阅读完需:约 3 分钟

MySQL高级--性能优化之索引

👨‍🎓作者:Java 学术趴

🏦仓库:GithubGitee

✏️博客:CSDN掘金InfoQ云+社区

💌公众号: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 不适合创建索引的场景

  • 表记录少:原始数据很少,不需要索引查询的速度也非常快。

  • 经常增、删、改的表:提高查询速度的同时,在进行数据增删改的操作时, 操作原始数据的同时还需要操作索引文件,会占用大量的性能。

  • 数据重复且分布平均的表字段:索引一般使用在经常查询和经常排序的字段。如果某个字段存在大量重复的元素,为它建立索引就没有太大的意义。

发布于: 刚刚阅读数: 5
用户头像

Java学术趴

关注

还未添加个人签名 2022.07.02 加入

还未添加个人简介

评论

发布
暂无评论
MySQL高级--性能优化之索引_10月月更_Java学术趴_InfoQ写作社区