1.什么是索引
索引相当于我们的目录,目的是为了提高我们的查询速率
2.索引的分类
(1)从物理存储的角度分为
- 聚簇索引:一张表只有一个聚簇索引
- 非聚簇索引,又叫二级索引:可以有多个
(2)从逻辑角度分为
- 普通索引
- 唯一索引
- 主键索引
- 全文索引
(3)从作用段字数分为
- 单列索引
- 联合索引
3.那些情况下不适合建立索引
- 在where中用不到的字段
- 数据量小的情况下
- 经常更改数据的表上不适合建立索引
- 有大量重复的列上不适合建立索引
4.什么情况下索引会失效
- 以%开头的like查询,如%zjy,此时索引会失效;但是不以%开头的则不会失效,如zjy%
- 如果mysql使用全表查询要比索引查询快
- 查询条件以or连接的
- 在索引列上使用 !=、函数
- 查询条件中类型为字符串,但是查询过程中么有使用' '的,如:select * from user where name = zjy
- 组合索引中未使用最左前缀的,如组合索引(name,age),where age=18
5.索引的缺点
- 降低维护速度,比如说在增、删、改的时候
- 耗费时间,数据量越大,查询时间越长
- 占用物理和数据空间
6.B+树和B树的区别
- B+树中数据只存储在叶子节点中,叶子节点构成一个有序链表,非叶子结点只用于索引;而B树的叶子节点和非叶子结点都存储了数据
-
B+树有k个孩子的节点就有k个关键字。也就是孩子数量=关键字数,而B树中,孩子数量=关键字数+1。
7.为什么B+树比B树更适合索引
- B+树查询更稳定。对于三层的B+数而言,每次查询都需三次;而B树查询则不一定,1-3次都有可能。
- B+树磁盘读写代价更低。B+树的节点只存储索引key值,具体信息的地址存在于叶子节点的地址中。这就使以页为单位的索引中可以存放更多的节点。
8.B+树的存储能力?为何一般查找行记录,最多只需1-3次磁盘IO?
InnoDB存储引擎的大小是16KB,主键为int(4个字节)或BIGINT(8个字节),指针类型一般是4或8个字节,一页=16KB/(8B+8B)= 1K = 1000个键值,深度为3的B+树可以存1000*1000*1000=10亿记录。
其实每个节点不一定都能填满,所以在数据库中B+树深度为2-4层,InnoDB中根节点常驻内存,所以最多只需1-3次磁盘IO。
9.InnoDB中的B+树
10.InnoDB的注意事项
11.MyISAM中的B+树
12.B-Tree
13.hash结构
14.最左匹配
组合索引中,从最左边开始索引,当遇到范围查询(>
、<
、between
、like
)就会停止匹配,后面的字段不会用到索引
- 对
(a,b,c)
建立索引,查询条件使用 a/ab/abc 会走索引,使用 bc 不会走索引。 - 索引是先根据a排序,a相同时b有序,a不同无序,以此类推。总之遇到范围查询就停。
15.覆盖索引
如果索引的叶子节点包含了要查询的数据,那么就不用回表查询了,也就是说这种索引包含(亦称覆盖)所有需要查询的字段的值,我们称这种索引为覆盖索引。
16.前缀索引
前缀索引也叫局部索引,前缀索引是指对文本或者字符串的前几个字符建立索引,这样索引的长度更短,查询速度更快。