【Java 面试八股学习 自用版】MYSQL优化-------索引

本文详细阐述了MySQL索引的概念、类型(聚簇索引、非聚簇索引),以及为何不全建索引的原因。讲解了索引的底层数据结构(B+树),索引的选择原则,包括覆盖索引的利用和索引失效的情况。同时强调了索引维护的影响和索引列的限制。
摘要由CSDN通过智能技术生成

MYSQL 索引

什么是索引

①index 是帮助MySql高效获取数据的数据结构(有序)。
②提高数据检索的效率,降低数据库的I0成本(不需要全表扫描)
③通过索引列对数据进行排序,降低数据排序的成本,降低了CPU的消耗

为什么不对表中所有的列都建索引呢???
————①当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。 2.索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。

索引的底层数据结构

InnoDB引擎使用B+树存储索引

B+树 只有叶子阶段存储数据。
与B树相比 ①磁盘读写代价更低(比b树更加矮胖)只有叶子阶段存储数据 ②查询效率更稳定,阶数更多,路径更短 ③ 便于扫库和区间查询 叶子节点是一个双向链表

聚簇索引(聚集索引),非聚簇索引(二级索引),回表查询

概念:
聚簇索引 :将数据存储与索引放到了一块,索引结构的叶子节点保存了行数据必须有,且唯一

 选取原则: 
 有主键,主键索引就是; 
 无主键,使用第一个**唯一(UNIQUE)索引**作为聚簇索引;
 都没有innoDB**自动生成**一个rowid作为隐藏的聚簇索引。					

非聚簇索引:将数据与索引分开存储,索引结构的叶子节点关联的是对应的主键(可以有多个)

两者区别在于,前者叶子节点存储了一整行数据,而后者叶子节点只有主键

回表查询: 先通过二级索引,得到对应的主键,然后使用聚簇索引查询整行的数据。

覆盖索引

概念:查询使用了索引,并且需要返回的列,在该索引中已经全部能够找到。
通俗来说,就是一次查询就能查询到所有数据,不需要回表查询

主键索引一定是覆盖索引
二级索引中,若查询的是i主键以及二级索引本身

索引创建的原则

数据量大,查询频繁的表
常作为查询条件(where)、排序order 、分组(group by)的字段
选择区分度高的列作为索引,尽量建立唯一索引
字符串类型 ,字段过长可以建立前缀索引
尽量使用联合索引,减少单列索引 联合索引很多时候可以覆盖索引,效率高避免回表,节省时间
控制索引的数量

为什么不对表中所有的列都建索引呢???
————①当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。 2.索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。

索引列不能存null值,创建表时使用NOT NULL约束。优化器知道每列是否包含NULL时可以确定那个索引最有效用于查询

索引失效

使用 explain 判断是否失效

  • 违反最左前缀法则 。索引多列时 ,查询从索引最左端前列开始且不跳过索引中的列
  • 范围查询最右的列,不能使用索引
  • 再索引列上运算操作
  • 字符串不加单引号
  • 以%开头的Like模糊查询。尾部模糊不会失效,头部模糊会!!!!!
  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值