索引有哪些优缺点
优点
索引可以大大提升查询的速度
缺点
从时间上:在增删改的时候,为了保证索引的有序性,需要动态的维护索引,牺牲增删改的速度
从空间上:创建索引需要占用磁盘空间
索引的4大类型
主键索引:关键字 primary key (聚簇索引)
唯一索引:关键字 unique
普通索引(非唯一):关键字 index
全文索引:关键字 fulltext
聚簇索引 = 主键索引 = 一级索引
非聚簇索引 = (唯一索引,普通索引) = 二级索引
MySQL的数据管理
创建和删除索引的语法
(聚簇索引 = 主键索引 是表自带的,我们自己创建的都是非聚簇索引)
(如果表没有主键,那么会选择隐藏列 rowid 来创建聚簇索引)
创建
1、在create table 建表的时候添加索引
2、在create table 建表成功以后,使用alter语句添加索引
ALTER TABLE 表名 ADD INDEX 索引名(字段名)
3、在create table 建表成功以后,使用create index 语句添加索引
CREATE INDEX 索引名 ON 表名(字段名);
删除
1、使用alter语句删除索引
ALTER TABLE 表名 DROP INDEX 索引名
2、使用drop语句删除索引
DROP INDEX 索引名 ON 表名
索引的数据结构
MySQL的索引支持两种数据结构
B + TREE B+树结构的索引(支持范围查询,可以用between and)
HASH 哈希结构的索引(不支持范围查询不可以用between and)
数据结构的演变
二叉树
问题:无法自平衡
平衡二叉树 -AVL树
左旋算法:当右边的叶子节点的深度 - 左边叶子节点的深度 > 1 的时候,触发左旋
右旋算法:当左边的叶子节点的深度 - 右边叶子节点的深度 > 1 的时候,触发右旋
目的:维持平衡
多路平衡二叉树 - B树
树的度数(Degree):每个节点中可以存储的元素的个数
单路树:度数=1
多路树:度数=n,n>1
同等规模的数据,单路树是高瘦的(IO次数多),多路树是矮胖的(IO次数少)
多路树比单路树的优势在于更少次数的磁盘IO就可以找到数据
MySQL是怎么设计索引的
树的每一个节点是一个磁盘块,MySQL将表的ibd文件拆分为很多个磁盘块
每个磁盘块的大小统一是16KB,每次磁盘IO都是读取一个磁盘块的数据
一个磁盘块的数据也称为一页数据
B - 树 和B+ 树的区别
B+ 树 | 最底层的叶子节点组成了一个单链表 |
部分元素做了冗余 | |
只有底层节点存储数据,上层节点只存储索引元素(也就是主键id) |
B - 树 | 没有数据冗余 |
数据与主键存储在一起,也就是说每个节点都存储了一个数据 | |
在使用 B+ 树时
走索引(主键id),二分查找,性能快
不走索引(手机号mobile),全表扫描,遍历底层单链表节点 ,性能慢
聚簇索引通过主键可以快速找到主键id,不存在回表查询
非聚簇索引的意思是在聚簇索引树的基础上再创建一颗非聚簇索引树,非聚簇索引树底层存储的是id,找到id之后再会聚簇索引树找相应的id,此操作称为回表查询
非聚簇索引的回表查询的缺点
建立非聚簇索引时,但它的数据重复性比较高,导致回表查询的次数大大增加,非常影响性能,所以对重复性比较高的字段不建议使用索引,全表扫描更优
什么字段适合做索引
数据离散度低
查字段的时候为了防止回表查询,对要查询的语句建立联合索引,这样就能避免回表查询
那么联合索引谁在前谁在后呢
最左前缀原则,有序字段在最左边,较有序字段在右边,此种情况下,当我们要查询的时候,如果只用右边的字段作为查询条件的话,索引完全不起作用,意思是当联合索引出现的时候我们在查询的过程中条件那应该出现联合索引的字段,且顺序最好按联合索引的顺序