1、索引是什么,作用是什么?
索引是数据库中一个排序的数据结构。
数据是以文件的形式存放在磁盘上面的,每一行数据都有他的磁盘地址,如果没有索引,比如100万条数据,在查询其中一条数据的时候就要遍历整张表,直到找到这条数据。(遍历表是循环调用存储引擎读取下一行数据的接口)。效率非常低。
有了索引之后,索引是用来快速检索的数据结构,我们根据索引的数据找到磁盘地址,就可以直接拿到数据。
2、索引类型
普通索引(Normal):非唯一,没有其他约束
唯一索引(Unique):唯一索引要求值不能重复
主键索引(Primary Key):键值不能重复,不能为空。
全文索引(Fulltext):值存储的数据比较大,有几KB 的数据,要解决like 查询效率低,就用全文索引。只有文本类型的字段才能创建:char 、 varchar、 text。
联合索引 :
3、索引
4、二叉树的特点,如果用二叉树做索引会发生什么
5、平衡二叉树的特点,如果用二叉树做索引会发生什么
6、多路平衡查找树 (B Tree)
7、B+Tree (加强版多路平衡查找树)
特点:
1、关键字的数量和路数是相等的。
2、B+ Tree 的根节点和枝节点中都不会存储数据,只有叶子节点才存储数据。
3、B+ Tree 的每个叶子节点增加了一个指向相邻叶子节点的指针,他的最后一个数据会指向下一个叶子节点的第一个数据,形成一个有序链表的结构。
4、B Tree 解决了两大问题。每个节点存储更多的关键字;路数更多。(B+ Tree 一样)
5、B + Tree 扫描库、扫描表的能力更强,(全表扫描,只需要遍历叶子节点就可以了,不需要遍历整棵 B + Tree )
6、B + Tree 的磁盘读写能力比B Tree 来说更强(根节点和枝节点不保存数据区,所以一个节点可以保存更多的关键字,一次磁盘加载的关键字更多)
7、排序能力更强 (因为叶子节点上有下一个数据区的指针,数据形成了链表)
8、效率更加稳定 (B+ Tree 永远是在叶子节点上拿到数据,所以IO次数是稳定的)
8、Hash 索引
1、创建索引有两种选择,其中一种Hash 索引。
2、Hash 索引: 以key value 形式检索数据,他会根据索引字段生成哈希码和指针,指针指向数据。
3、特点:
1、时间复杂度是O(1) (这里表示欧1时间效率算法),查询速度比较快,但是hash 索引里面的数据不是按顺序存储的,所以不能用于排序。
2、在查询数据的时候要根据键值计算哈希码,所以只能支持等值查询 ( = ,IN ),不支持范围查询 ( > < >= <= between and )
3、如果字段重复值很多的时候,会出现大量的哈希冲突(采用了拉链法解决),效率会降低
注意: InnoDB 不能显示地创建一个哈希索引
9、B + Tree
1、
10、InnoDB 的索引:
1、在InnoDB 里面,是以主键为索引来组织数据的存储的
2、InnoDB 的主键索引的叶子节点上,它直接存储了数据。
3、聚集索引 (聚簇索引):
索引键值的逻辑顺序和表数据行的物理存储顺序是一致的。(比如字典的目录是按照拼音排序的,内容也是按照拼音排序的,按拼音排序的这种目录就叫聚集索引)
4、InnoDB里面,它组织数据的方式叫做聚集索引组织表,主键索引叫聚集索引,非主键都是非聚集索引。
5、非主键索引是怎么存储的?
非主键索引存储的是非主键索引和主键值,如果使用非主键索引查询,会根据主键值在主键索引中查询,然后在叶子节点取得最终数据。
也就是其他的索引也存储了主键的值。
6、一张表没有主键怎么办?
1、如果定义了主键 primary key , 那么InnoDB会选择主键作为聚集索引。
2、如果没有显示定义主键,InnoDB会选择第一个不能为空的唯一索引作为主键索引。
3、如果也没有这样的唯一索引,InnoDB 会选择内置6字节长的RowId作为隐藏的聚集索引,他会随着记录的写入而逐渐递增。
11、索引使用原则:
1、列的离散度
就是重复数据越少,列的离散度越高。
2、联合索引最左匹配:
两个字段联合索引,
比如: Alter Table user add Index name_phone_index (name , phone);
如果查询时候,where 后面有 name = 'xx',
where name = 'xx' and phone = 'yyy'
where phone = 'yyy' and name = 'xx'
where name = 'xx'
上面这三种查询 会用到 联合索引。
where phone = 'yyy'
这种查询不会用到联合索引。
这个联合索引相当于创建了两个索引:(name)、(name, phone)
3、覆盖索引
回表:
12、索引的创建与使用
1、在用于where 判断、 order 排序 和 join 的 on 字段上创建索引
2、索引的个数不要太多
浪费空间、更新变慢
3、过长的字段,简历前缀索引
4、离散度低的字段,不要建索引。
5、频繁更新的值,不要作为主键或者索引。
容易导致页分裂。
6、随机无序的值,不建议作为主键索引,例如身份证、UUID
因为无序,分裂。
7、组合索引把离散度高的字段放在前面。
8、复合索引比单列索引有优势。
13、什么时候用不到索引?
1、索引列上使用函数 、表达式计算时。
2、like 条件前面有 % ,就用不到索引。
3、负向查询:
NOT LIKE 不能用到索引
!= <> 和 NOT IN 有些时候会用到索引,有些时候用不到索引。看优化器