首先为什么要加索引?
数据库服务器有两种存储介质,我们需要把索引放到硬盘上,在硬盘上进行查询时会产生I/O 操作 ,我们通过索引来查找某?数据的时候,需要计算产?的磁盘 I/O 次数,当磁盘 I/O 次数越多,所消耗的时间也就越?。如果我们能让索引的数据结构尽量减少硬盘的 I/O 操作,所消耗的时间也就越?。
什么情况下创建索引?
在数据表中的数据?数?较少的情况下,?如不到 1000 ?,是不需要创建索引的。另外,当数据重复度?,?如?于 10% 的时候,也不需要对这个字段使?索引。
索引的种类有哪些?
从功能逻辑上说,索引主要有 4 种,分别是普通索引、唯?索引、主键索引和全?索引。普通索引是基础的索引,没有任何约束,主要?于提?查询效率。唯?索引就是在普通索引的基础上增加了数据唯?性的约束,在?张数据表?可以有多个唯?索引。主键索引在唯?索引的基础上增加了不为空的约束,也就是 NOT NULLUNIQUE,?张表?最多只有?个主键索引。全?索引?的不多,MySQL ?带的全?索引只?持英?。我们通常可以采?专?的全?搜索引擎,?如 ESElasticSearch) 和 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 次数更少,更适合进?关键字的范围查询。