MySQL索引

 一、索引介绍

1、概述

索引是帮助MySQL高效获取数据的数据结构。主要是用来提高数据检索的效率,降低数据库的IO成本,同时对索引进行排序,降低数据排序的 成本,降低对CPU的消耗。

2、优缺点 

索引优缺点
优势劣势
提高数据检索的效率,降低数据库的IO成本索引的创建也是需要占用空间的
对索引进行排序,降低数据排序的 成本,降低对CPU的消耗索引降低了数据更新的效率,对数据库进行增加,删除,修改的速度降低

综上所述,索引并不是越多越好!

3、索引结构

数据库默认是使用b+树索引

为什么使用b+树结构?

a、二叉树缺点:顺序插入时,会形成一个链表,查询性能大大降低。大数据量的情况下,层级较深,检索慢;

b、红黑树:大数据量的情况下,层级较深,检索慢;

c、B-Tree(多路平衡查找树):叶子节点和非叶子节点都会存储数据,没有b+树查询稳定;无论是叶子节点还是非叶子节点,都会保存数据,这样导致一页中存储的键值减少,指针跟着减少,要同样保存大量数据,只能增加树的高度,导致性能降低;

4、索引的分类

4.1、什么是聚簇索引和非聚簇索引(二级索引)?

聚簇索引:将数据和索引放到一块,叶子节点保存整行数据,有且只有一个,一般情况下主键作为聚簇索引。如果没有设置主键就会将第一个唯一索引作为聚簇索引,如果两者都无,InnoDB就会自动生成一个rowid隐藏的聚簇索引。

非聚簇索引:将索引与数据分开存储,叶子节点保存对应的主键,可以有多个,一般自己定义的都是二级索引。

4.2、什么是回表查询?

回表查询就是指我们利用二级索引找到对应的主键值之后,通过这个主键值进行聚簇索引的查询找到整行数据,这个过程就叫做回表查询。

5、索引使用

5.1、索引失效的场景

1、违反最左前缀法则:如果一个索引关联了多列(联合索引),就要遵循最左前缀法则。

在查询时从索引最左边的列开始,不能跳过索引中的列。如果跳过某一列,那么后面的索引将会失效。

2、范围查询右边的列将会失效(<>),条件允许可以使用<=和>=

3、索引列上进行运算操作,索引将会失效

4、索引进行类型转换(字符串不加引号)

5、模糊查询时,头部模糊匹配会失效(like ‘%xxx’)

6、or条件使用的时候,两侧都必须要有索引否则就会失效

7、数据分布的影响,即如果走索引查询比全表扫描慢就不会走索引,索引失效

5.2、SQL提示

是指在SQL语句中加入认为提示达到优化的目的。

user index:(使用哪个索引,建议MySQL使用这个索引,mysql权衡这个索引效率使用)

ignore index:(不使用哪个索引)

force index:(必须走这个索引,强制MySQL使用这个索引)

5.3、索引创建

5.3.1、尽量走覆盖索引:覆盖索引是指你使用索引查询时,结果返回的列全部在索引中能找到。所以要避免使用select *导致回表查询。

5.3.2、字符串长度很大时,使用前缀索引。避免索引过大,浪费大量的磁盘IO,影响效率。可以将字符串一部分前缀,建立索引,节约索引空间提高效率。

 5.3.3 索引设计原则

1.针对于数据量较大,且查询比较频繁的表建立索引。
2.针对于常作为查询条件(where)、排序(order by)、分组(group by)操作的字段建立索引。
3.尽量选择区分度高的列作为索引,尽量建立唯一索引,区分度越高,使用索引的效率越高。
4.如果是字符串类型的字段,字段的长度较长,可以针对于字段的特点,建立前缀索引。
5.尽量使用联合索引,减少单列索引,查询时,联合索引很多时候可以覆盖索引,节省存储空间,避免回表,提高查询效率。
6.要控制索引的数量,索引并不是多多益善,索引越多,维护索引结构的代价也就越大,会影响增删改的效率。
7.如果索引列不能存储NULL值,请在创建表时使用NOTNULL约束它。当优化器知道每列是否包含NULL值时,它可以更好地确定哪个索引最有效地用于查询。

注:本文章是用于记录学习笔记!如有错误欢迎指正哟

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大钊灬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值