概述
什么是索引?
索引是关系型数据库中给数据库表中一列或多列的值排序后的存储结构;
帮助MySQL高效获取数据的数据结构;
所谓索引,就是以某个字段为关键字的B树文件;-阮一峰
为什么需要索引?
数据库以B树格式储存,能解决的问题和不能解决的问题
解决了:按照"主键"(其实是主键索引)查找数据的问题
没有解决:通过其他数据库字段查找数据的问题。
想查找其他字段,就需要建立索引(index)
主键和索引的区别?
主键是表中的一个字段,能够唯一标识一条记录;
索引是一种数据库存储数据时使用的一种数据结构。
索引是底层是如何实现的?
聚集索引以及非聚集索引用的是B+树索引。
什么是聚集索引
也叫聚簇索引,(也叫主键索引?)
定义:数据行的物理顺序与列值(一般是主键的那一列)的逻辑顺序相同,一个表中只能拥有一个聚集索引。
解释1:聚集索引就是按照每张表的主键构造一颗B+树,同时叶子节点中存放的即为整张表的记录数据。
什么是非聚集索引(辅助索引)
非主键索引,叶子节点=键值+书签。Innodb存储引擎的书签就是相应行数据的主键索引值。
聚簇索引和非聚簇索引的叶子节点的不同
聚簇索引的叶子节点就是数据节点,
而非聚簇索引的叶子节点仍然是索引节点,只不过有指向对应数据块的指针。
联合索引是什么?
对多个字段同时建立的索引(有顺序,ABC,ACB是完全不同的两种联合索引。)
联合索引也是索引的一种。
联合索引的作用
以联合索引(a,b,c)为例,
建立这样的索引相当于建立了索引a、ab、abc三个索引
联合索引认识
对于联合索引,MySQL 会一直向右匹配直到遇到范围查询(> , < ,between,like)就停止匹配
联合索引的最左前缀匹配原则
最左优先,在检索数据时从联合索引的最左边开始匹配
例如:
如果建立的索引顺序是 (a,b)那么直接采用 where b = 5 这种查询条件是无法利用到索引的,这一条最能体现最左匹配的特性。
覆盖索引是什么?
SQL只需要通过索引就可以返回查询所需要的数据,而不必通过二级索引查到主键之后再去查询数据。
覆盖索引的前提
覆盖索引必须要存储索引的列,而哈希索引、空间索引和全文索引等都不存储索引列的值,所以MySQL只能使用B-Tree索引做覆盖索引
什么是二级索引?
Hash索引的缺陷
1、Hash是无法进行范围查询的,原因是Hash底层的存储是Hash表,存储的时候是没有顺序的;所以Hash一般只适用于等值查询;
2、Hash无法支持模糊查询;
3、当Hash碰撞问题存在较多时,性能会变低;
4、无法利用索引进行排序
5、Hash索引无法支持使用联合索引时,只用前面一个或几个进行索引查询(即不支持最左前缀匹配原则)
6、无法使用覆盖索引;
B树和B+树的区别主要有两点:
在B树中,你可以将键和值存放在内部节点和叶子节点,但在B+树中,内部节点都是键,没有值。叶子节点同时存放键和值
B+树的叶子节点有一条链相连,而B+树的叶子节点各自独立。
数据库为什么使用B+树而不是B树
由于B+树的内部节点只存放键,不存放值,因此,一次读取,可以在内存页中获取更多的键,有利于更快地缩小查找范围。
B+树的叶节点由一条链相连,因此,当需要进行一次全数据遍历的时候,B+树只需要使用O(logN)时间找到最小的一个节点,然后通过链进行O(N)的顺序遍历即可。而B树则需要对树的每一层进行遍历,雅思学校这会需要更多的内存置换次数,因此也就需要花费更多的时间
B树可以在内部节点同时存储键和值,因此,把频繁访问的数据放在靠近根节点的地方将会大大提高热点数据的查询效率。这种特性使得B树在特定数据重复多次查询的场景中更加高效。
因为就是上面提到的B+树的好处。数据库的数据读取都是需要进行代价巨大的磁盘IO操作,
因此,更快地缩小范围和更少的读取次数是数据库需要关注的重点。而B+树在这些点上比B树做的更好。这就是为什么数据库要选用B+树作为底层实现。
如果我一定把数据库设计为B树,B树就没有好处吗?
Mysql为什么会有最左匹配原则?和底层B+树的具体实现的关联关系是为什么不是最右匹配,?
在Mysql中,B+树的具体排序实现时,非叶子节点排序时,用的时联合索引的第一个值进行排序的。只有到叶子节点相等后,才会用到第二个值…
创建索引时会考虑什么因素?
1、查询概率较高,经常作为where条件的设置为索引;
2、识别度最高的字段放在左侧(最左前缀匹配原则)
使用索引需要注意什么?
索引列不要参与计算
or的两侧要么都索引列,要么都不是索引列
模糊匹配的时候%不要在头部
最后
以上就是标致月饼为你收集整理的数据库-索引相关的全部内容,希望文章能够帮你解决数据库-索引相关所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复