MySQL索引原理是什么

介绍

这篇文章主要介绍MySQL索引原理是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

摘要:就一起来聊一聊MySQL索引。什么是索引?百度百科是这样描述的:索引是为来加速对表中数据行中的检索而创建的一种分散的数据结果,时针对表而建立的,它是由数据页面以外的索引页面组成,每个索引页中的行都含有逻辑指针,以便加速检索物理数据其实,索引的概念大家都很清楚,也知道索引能够提升查询效率,但大部分童鞋在怎么建索引,建在哪些字段上有以下常见误解:新建表时不需要建索引,后续才添加索引的条件后的字段均建索引简单SQL不需要索引,联合查询才需要索引联合索引的顺序是在条件后字段的先后顺序对于区分度小的字段上也新建索引,如状态,性别等字段等。

就一起来聊一聊MySQL索引。

什么是索引?

百度百科是这样描述的:

索引是为来加速对表中数据行中的检索而创建的一种分散的数据结果,时针对表而建立的,它是由数据页面以外的索引页面组成,每个索引页中的行都含有逻辑指针,以便加速检索物理数据

其实,索引的概念大家都很清楚,也知道索引能够提升查询效率,但大部分童鞋在怎么建索引,建在哪些字段上有以下常见误解:

新建表时不需要建索引,后续才添加索引

,条件后的字段均建索引

简单SQL不需要索引,联合查询才需要索引

联合索引的顺序是在条件后字段的先后顺序

对于区分度小的字段上也新建索引,如状态,性别等字段等。

索引区分度

在说上述问题之前,我们先来看看另一个概念,就是区分度。

区分度:指字段在数据库中的不重复比

区分度在新建索引时有着非常重要的参考价值,在MySQL中,区分度的计算规则如下:

字段去重后的总数与全表总记录数的商。

例如:

select count(不同的(名字))/count(*)从t_base_user;

结果如下:

计数(不同的(名字))/count (*) 1.0000

其中区分度最大值为1.000,最小为0.0000,区分度的值越大,也就是数据不重复率越大,新建索引效果也越好,在主键以及唯一键上面的区分度是最高的,为1.0000。在状态,性别等字段上面的区分度值是最小的。(这个就要看数据量了,如果只有几条数据,这时区分度还挺高的,如果数据量多,区分度基本为0.0000。也就是在这些字段上添加索引后,效果也不佳的原因。)

值得注意的是:,,如果表中没有任何记录时,计算区分度的结果是为空值,其他情况下,区分度值均分布在0.0000 - -1.0000之间。

如何建索引

(一),:区分度
个人强烈建议,建索引时,一定要先计算该字段的区分度,原因如下:

1。单列索引
可以查看该字段的区分度,根据区分度的大小,也能大概知道在该字段上的新建索引是否有效,以及效果如何区。分度越大,索引效果越明显。

2。多列索引(联合索引)
多列索引中其实还有一个字段的先后顺序问题,一般是将区分度较高的放在前面,这样联合索引才更有效,例如:

select * from t_base_user name=?“和状态=1;

像上述语句,如果建联合索引的话,就应该是:

alter table t_base_user添加索引idx_name_status(名称、地位);

而不是:

alter table t_base_user添加索引idx_status_name(地位、名称);

(二)最左前缀匹配原则
, MySQL会一直向右匹配直到遇到范围查询(祝辞,& lt;之间,像)就停止匹配,比如

select * from t_base_user类型=?0”;和created_at<?017 - 11 - 03 -“;和状态=1,(该语句仅作为演示)

在上述语句中,地位就不会走索引,因为遇到& lt;时,MySQL已经停止匹配,此时走的索引为:(类型、created_at),其先后顺序是可以调整的,而走不到状态索引,此时需要修改语句为:

select *从t_base_user类型=1=10和状态和created_at<?017 - 11 - 03 -“

即可走状态索引。

(三)函数运算
,不要在索引列上,进行函数运算,否则索引会失效。因为b +树中存的都是数据表中的字段值,但进行检索时,需要把所有元素都应用函数才能比较,显然成本太大。

(四)扩展优先
,扩展优先,不要新建索引,尽量在已有索引中修改。如下:

select *从t_base_user name=癮ndyqian"和电子邮件=癮ndytohome"

MySQL索引原理是什么