数据库7 索引

1. 索引:
什么是索引?
在关系数据库,索引是一种单独的,物理的对数据库表中一列或多列的值进行排序的一种存储
结构;也称之为key
索引的作用:
索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需要的内容。
为什么需要索引?
因为项目运行中,查询操作非常频繁,为了提高用户体验,要提高查询速度,如何提高就靠索
引提高查询效率的有效手段。

索引的实现:
数据库中的索引,实现思路与字典是一致的;需要一个独立的存储结构,专门存储索引数据;
本质上索引通过不断缩小查询范围来提高查询效率。

索引带来的影响:
1.加速查询
2.降低写入(增删改)速度
3.会额外占用磁盘空间

索引的分类;
1.聚集索引 (主键索引)。
行中的完整记录存在聚集索引的叶子节点
2.辅助索引 除了主键外的索引
叶子节点 存储索引字段的值 还有 主键的值
使用辅助索引时 会产生两种现象
1. 回表 要查的数据就不在辅助索引中 需要到聚集索引中查找
2.覆盖索引 要查的数据就在辅助索引中

mysql中的索引:
1.主键索引
2.外键索引
3.index索引

B+树:
在树枝中存储的不是数据,是索引。取数据经历3次io操作就可以了。
光有数据结构还不可以,还需要对应算个发做支持,就是二分法。
遵循最左匹配特性
注意:尽可能将数据量小的数据来作为索引

聚集索引*:
聚焦索引的特点:
叶子节点保存的就是完整的一行记录,如果设置了主键,主键就作为聚集索引,
如果没有主键,则找第一个NOT NULL 且QUNIQUE的列作为聚集索引,
如果也没有这样的列,innoDB会在表内自动产生一个聚集索引,它是自增的

辅助索引*:
除了聚集索引之外的索引都称之为辅助索引或第二索引,包括 foreign key 与 unique

辅助索引的特点:
其叶子节点保存的是索引数据与所在行的主键值,InnoDB用这个 主键值来从聚集索引中搜
查找数据。

覆盖索引:
覆盖索引指的是需要的数据仅在辅助索引中就能找到。这样的话则不需要在查找聚集索引
数据已经找到。

回表:
如果要查找的数据在辅助索引中不存在,则需要回到聚集索引中查找,这种现象称之为回表。
需要从辅助索引中获取主键的值,在拿着主键值到聚集索引中找到sex的值。

查询速度对比:
聚集索引 > 覆盖索引 > 非覆盖索引

命中索引(正确使用索引):
条件中有索引字段匹配上。
1. 无论索引如何让设计 无法降低范围查询的查询速度
select *from usr where id>1;
即使命中也无法提高效率

2. 索引不应该加在值重复度很高的字段上 应该加在重复度低的字段上


3. 当条件中出现多个索引命中时 会自动找一个区分度高的索引来使用and的时候,
如果有索引存在;挑一个重复度低的索引执行。不遵循从左往右顺序。

4. 使用or的时候 如果两边都有索引 才会使用索引,但需要注意的是 or两边都会执行。
如果or两边只有一边有索引则不会达到使用索引的效果,无法加速查询。
顺序是从左往右。

5.优化查询 不仅仅要加索引 sql语句也需要优化 十七命中索引
你的条件中应该使用区别度高的索引

6.联合索引
为什么使用联合索引
降低资源的占用,降低增删改的时间 会比单个字段的索引快
建立联合索引时 应该把区分度高的放在最左边 区分度低的依次往右放;按照区分度
的高低 从左往右 依次排序
查询中应该优先使用左边的索引
使用and时 无所谓书写顺序 会自动找区分度最高的

注意使用联合索引时 如果压根没用到最左侧索引 不能加速查询


总结:
正常开发时;
优先使用聚集索引
再次使用联合索引 如果你的条件不包含最左侧索引 不能加速查询 这时候就应该
使用单个字段索引



补充:
count(n)计数的

创建索引 create index 索引名称 on 表明(索引字段)

alter table user add primarry key(id);加主键索引

alter table user drop primarry key;删主键索引

重点掌握:
1.什么是索引,为什么使用索引。
原文地址:https://www.cnblogs.com/yanhui1995/p/10027592.html