数据库之索引
什么是索引:
索引就相当于书的目录,是mysql中一种专门的数据结构,称为key,
索引的本质原理就是通过不断的缩小查询范围,来降低io次数从而提升查询性能
强调:一旦为表创建了索引,以后的查询都会先查索引,再根据索引定位的结果去找数据
三种:primary key 约束,加速
unique 约束,加速
index key 仅加速
为什么要用索引:
对于一个应用来说,对数据的读写比例基本是10:1,即读多写少,而且对于写来
说极少出现性能问题,大多数性能问题都是慢查询,提到加速查,就必须用到索引
索引的影响:
1.在表中有大量数据的前提下,创建索引速度会很慢
2.在索引创建完毕后,对表的查询性能会大幅度提升,但是写性能会降低
索引的查找原理:
B+树
浅蓝色 磁盘块
深蓝色 数据项,包含具体数据
黄色 指针,每个磁盘块三个指针
最下面一层,叶子节点,硬盘存的数据
IO次数跟树的层级有关
如何保证层级:
首先磁盘块容量是固定的,数据所占容量越少,能存放的数据项越多
层级越低,故我们需要对表中占硬盘容量越小的字段作为索引
聚集索引:
myisam 存储引擎在硬盘存的文件数量3个,其中MYI为索引文件
innodb存储引擎在硬盘存的文件数量为2个,frm表结构,ibd为表数据,索引放在ibd中
innodb默认主键为索引,按照索引树形结构保存数据
按照id查可以加速,按照name不可以
特点:叶子节点存放的是一整条数据,只有主键字段才能成为聚集索引,以主键查找速度快
辅助索引(unique,index)
特点:如果按照name字段创建索引,那么叶子节点存放的是{name:name所在那条记录的主键的值}
覆盖索引:在辅助索引的叶子节点就已经找到了我们想要的数据
如我们将name设置为辅助索引,要找的就是name,那name就是覆盖索引
如果未找到我们想要的数据,我们在辅助索引的叶子节点中找到了记录的id,会通过id再次查找我们想要的数据,叫做回表
联合索引
索引的最左匹配,先从左面开始匹配
create idex idx_all on s1(email,name,gender,id);
只要查询中含有email的都可以命中,加速查询
将区分度高的往左放,范围查询往最后放
索引的添加:
在没有数据时添加索引是很快的,在数据已经保存好时,添加索引很慢
因为它要扫描所有数据添加索引
索引并不是越多越好:
写入时,会重新创建索引,硬盘疯转,磁盘IO高
正确使用索引:
- 索引未命中:
范围问题,< ,> != - 区别度低,相似度高 ,建成了棍型
- 模糊查询时
- 索引字段一定不要参与运算
创建索引的方式
方式一
create table t1(
id int,
name char,
unique key uni_id(id),
index ix_name(name) #index没有key
);
方式二
create index ix_age on t1(age);
方式三
alter table t1 add index ix_sex(sex);
查看索引
show create table t1;
删除索引:
drop index 索引名 on 表名 ;