码迷,mamicode.com
首页 > 数据库 > 详细

数据库之索引

时间:2019-01-13 18:12:26      阅读:142      评论:0      收藏:0      [点我收藏+]

标签:记录   问题   参与   sam   模糊   gen   rop   比例   表数据   

什么是索引:
索引就相当于书的目录,是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高

正确使用索引:

  1. 索引未命中:
    范围问题,< ,> !=
  2. 区别度低,相似度高 ,建成了棍型
  3. 模糊查询时
  4. 索引字段一定不要参与运算

创建索引的方式

方式一

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 表名 ;

数据库之索引

标签:记录   问题   参与   sam   模糊   gen   rop   比例   表数据   

原文地址:https://www.cnblogs.com/robert-zhou/p/10263328.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!