索引
索引是一种帮助Mysql提高查询效率的数据结构。
缺点:维护索引需要耗费数据库资源,也会占用磁盘空间,会影响curd的速率
总的来说 并不是索引建立的越多越好。
索引有四种
1.主键索引
当我们创建主键的时候会默认创建主键索引,innodb聚簇索引
2.普通索引(非聚簇索引)
一个索引只包含单个列,两种方式创建普通索引,建表时和建表后
建表时创建的索引的索引名默认是字段名
Create table ff (id int primary key,name varchar(20),key(name));
建表后创建的索引可以自定义索引名字
Create index 索引名字 on 表名(字段) ; Create index name_index on ff(name);
3.唯一索引
索引列的值必须唯一,但允许有空值 ,也可以建表时和建表后创建唯一索引
Create table ff(id int primary key,name varchar(20),unqiue(name));
Create unique index 索引名字 on 表名(字段)
4.复合索引
一个索引包含多个列,也可以建表时和建表后创建
Create table ff (id int primary key,name varchar(20),name2 varchar(20),name3 varchar(20)key(name,name2,name3));
Create index index_name on ff(name,name2,name3)
复合索引查询的时候 遵循一个最左前缀原则,然后会动态调整查询字段的顺序
查询索引的sql语句:show index from 表名
删除索引的sql语句:drop index 索引名 on 表名
索引的底层原理
插入数据的时候主键索引会自动进行排序,插入id 3 5 2 1 4 查询的时候就是1 2 3 4 5
绿色的是主键索引,橙色的是主键索引对应的数据,蓝色的P是指针,这其实是一个链表
主键索引在我们每次插入数据的时候会进行一个排序,并且会通过指针一个个连接起来。
这样这个数据结构的时间复杂度就是On了
MySQL优化这个链表,会对这些数据进行分页,每一页的大小默认为16kb,然后再做一个页目录,页目录也是页,默认大小为16kb。
页目录只存储每一页的第一个主键索引和指针,这个指针指向的是对应的页。
一个int类型占4个字节varchar(20)占20个字节,指针占4-8个字节
B+树
什么是B+树,B+树是一种树类型的数据结构,由B树优化而来
B树和B+树最大的区别是B树的非叶子结点也必须存储数据,B+树只在叶子结点存储数据
B+树的优点是只有叶子结点存储数据,非叶子结点只存储键值,叶子结点图中就是最下面那一层。
B树的非叶子结点必须存储数据,这样会导致非叶子结点存储的数据变少,导致树的深度也会更深
B+树和B树的最顶层的根结点常驻与内存的,所以三层B+树只需要2次读写IO
聚簇索引和非聚簇索引
聚簇索引查询的时候会将数据元素放在缓存里,下一次查询就会比较快。
非聚簇索引索引是指向物理地址的,每次查询的时候都是从物理地址上读取。