索引

什么是索引?

索引(在MySQL中也叫做“键”)是存储引擎用于快速找到记录的一种数据结构。索引存储在文件系统中。索引的文件存储形式与存储引擎有关。

为什么索引可以加快查询速度?

1.索引大大减少了服务器需要扫描的数据量。

2.索引可以帮助服务器避免排序和临时表

3.索引可以将随机I/O变为顺序I/O

哪些数据结构可以提高查询速度,MySQL为什么使用B+树?

1.hash表

    缺点:① 利用hash存储的话需要将所有的数据文件添加到内存,比较耗费内存空间

               ② 如果所有的查询都是等值查询,那么hash确实很快,但是在企业或者实际工作环境中范围查找的数据更多,而不是等                    值查询,因此hash就不太适合了

2. 二叉树,红黑树

    缺点:无论是二叉树还是红黑树,都会因为树的深度过深而造成io次数变多,影响数据读取效率

3.B-Tree

    缺点:① 每个节点有key同时也有data,而每个页存储空间是有限的,如果data比较大的话会导致每个节点存储的key数量变小                 从而导致树深增加。

               ② 当存储的数据量很大时会导致树的深度较大,增大查询时磁盘io次数,进而影响查询性能

B-Tree适用条件和限制

B-Tree对如下类型的查询有效:全值匹配,匹配最左前缀,匹配列前缀,匹配范围值,精确匹配某一列并范围匹配另一列,只访问索引的查询(覆盖索引)

B-Tree索引的限制:① 如果不是按照索引的最左列开始查找,则无法使用索引

                                 ② 不能跳过索引中的列

                                 ③ 如果查询中有某个列的范围查询,则其右边所有的列都无法使用索引

InnoDB和MyISAM区别

 InnoDBMyISAM
索引类型聚簇索引非聚簇索引
支持事务
支持表锁
支持行锁
支持外键
支持全文索引5.6后支持
适合操作类型大量增删改大量查

回表

在InnoDB中,有且仅有一个聚簇索引,这个聚簇索引是建立在主键上的(如果没有主键,InnoDB会选择一个唯一的非空索引替代,如果还没有,则会隐式定义一个主键来作为聚簇索引),聚簇索引在叶子节点保存数据。除了聚簇索引,还会有非聚簇索引(二级索引),二级索引的叶子节点保存的是主键值。所以二级索引在查找数据时,首先先查找非聚簇索引获得主键值,再拿主键值去聚簇索引上查找数据,也就是经历了两次索引的查找。这个过程叫回表。如果还不懂去看这篇文章https://www.cnblogs.com/yanggb/p/11252966.html

覆盖索引

索引覆盖是一种避免回表查询的优化策略。具体的做法就是将要查询的数据作为索引列建立普通索引(可以是单列索引,也可以一个索引语句定义所有要查询的列,即联合索引),这样的话就可以直接返回索引中的的数据,不需要再通过聚集索引去定位行记录,避免了回表的情况发生。

比如:表inventory有一个多列索引(store_id, film_id)。MySQL如果只需要访问这两个列,就可以使用这个索引做覆盖索引

执行explain select store_id,film_id from inventory;

最左前缀匹配原则

在联合索引中查找中,mysql会按照建立索引的列的顺序,从左右向右依次找满足条件的数据。

索引下推

“索引条件下推”,称为 Index Condition Pushdown (ICP)是mysql中一个常用的优化,尤其是当mysql需要从一张表里检索数据时。 如果没有ICP,存储引擎将会根据WHERE子句的条件遍历整个表单数据,然后返回给mysql服务器。启用ICP,如果可以通过使用索引的列来满足WHERE条件,MySQL服务器将WHERE条件的这部分推送到存储引擎。然后,存储引擎通过使用索引来确定推送的条件,并且通过这样的方式从表中读取行。 ICP可以减少存储引擎必须访问基础表的次数以及MySQL服务器必须访问存储引擎的次数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值