mysql索引和索引的原理

首先为什么要加索引?

数据库服务器有两种存储介质,我们需要把索引放到硬盘上,在硬盘上进行查询时会产生I/O 操作 ,我们通过索引来查找某⾏数据的时候,需要计算产⽣的磁盘 I/O 次数,当磁盘 I/O 次数越多,所消耗的时间也就越⼤。如果我们能让索引的数据结构尽量减少硬盘的 I/O 操作,所消耗的时间也就越⼩。

什么情况下创建索引?

在数据表中的数据⾏数⽐较少的情况下,⽐如不到 1000 ⾏,是不需要创建索引的。另外,当数据重复度⼤,⽐如⾼于 10% 的时候,也不需要对这个字段使⽤索引。

索引的种类有哪些?

从功能逻辑上说,索引主要有 4 种,分别是普通索引、唯⼀索引、主键索引和全⽂索引。普通索引是基础的索引,没有任何约束,主要⽤于提⾼查询效率。唯⼀索引就是在普通索引的基础上增加了数据唯⼀性的约束,在⼀张数据表⾥可以有多个唯⼀索引。主键索引在唯⼀索引的基础上增加了不为空的约束,也就是 NOT NULLUNIQUE,⼀张表⾥最多只有⼀个主键索引。全⽂索引⽤的不多,MySQL ⾃带的全⽂索引只⽀持英⽂。我们通常可以采⽤专⻔的全⽂搜索引擎,⽐如 ESElasticSearch) 和 Solr。其实前三种索引(普通索引、唯⼀索引和主键索引)都是⼀类索引,只不过对数据的约束性逐渐提升。在⼀张数据表中只能有⼀个主键索引,这是由主键索引的物理实现⽅式决定的,因为数据存储在⽂件中只能按照⼀种顺序进⾏存储。但可以有多个普通索引或者多个唯⼀索引。 

按照物理实现⽅式,索引可以分为 2 种:聚集索引和⾮聚集索引。 聚集索引可以按照主键来排序存储数据,这样在查找⾏的时候⾮常有效。举个例⼦,如果是⼀本汉语字典,我们想要查找“数”这个字,直接在书中找汉语拼⾳的位置即可,也就是拼⾳“shu”。这样找到了索引的位置,在它后⾯就是我们想要找的数据⾏。 在数据库系统会有单独的存储空间存放⾮聚集索引,这些索引项是按照顺序存储的,但索引项指向的内容是随机存储的。也就是说系统会进⾏两次查找,第⼀次先找到索引,第⼆次找到索引对应的位置取出数据⾏。⾮聚集索引不会把索引指向的内容像聚集索引⼀样直接放到索引的后⾯,⽽是维护单独的索引表(只维护索引,不维护索引指向的数据),为数据检索提供⽅便。我们还以汉语字典为例,如果想要查找“数”字,那么按照部⾸查找的⽅式,先找到“数”字的偏旁部⾸,然后这个⽬录会告诉我们“数”字存放到第多少⻚,我们再去指定的⻚码找这个字。 

联合索引的最左原则就是建立索引KEY union_index (a,b,c)时,等于建立了(a)、(a,b)、(a,b,c)三个索引,从形式上看就是索引向左侧聚集,所以叫做最左原则,因此最常用的条件应该放到联合索引的组左侧。

利用联合索引加速查询时,联合查询条件符合“交换律”,也就是where a = 1 and b = 1 等价于 where b = 1 and a = 1,这两种写法都能利用索引KEY union_index (a,b,c)。

在 MySQL 中采⽤的是 B+ 树,B+树在查询性能上更稳定,在磁盘⻚⼤⼩相同的情况下,树的构造更加矮胖,所需要进⾏的磁盘 I/O 次数更少,更适合进⾏关键字的范围查询。 



 



posted @ 2020-07-12 22:16  Nancy-Yang  阅读(185)  评论(0)    收藏  举报