mysql索引当中的几个概念和原理

索引是什么东西我就不在说了。在mysql中索引是在存储引擎中实现的,索引并没有统一的标准,本文主要介绍在innodb和mysiam上的索引,也就是B+树索引。


mysiam使用前缀压缩可以是索引变得很小,innodb则按照原数据进行存错。B+树索引意味着所有的数据都是按照顺序存错的,并且每个叶子节点到根节点的距离相同。


由于b+树的一些性质,因此索引也有一些注意事项和特点:


1,匹配列前缀,举个例子吧:

select name from user where name = 'dong%'; 这种情况下是可以用到索引的,

但是,

select name from user where name = '%'dong; 这种情况就用不到索引


2,不要在索引列上进行计算:

select   *   from  user  where  id + 1;


聚簇索引:

聚簇索引并不是一种单独的索引类型,而是一种数据存储方式。具体的细节依赖于其实现方式,但是innodb的聚簇索引实际是在同一个结构中保存了索引和数据行。但是由于无法把数据行存放在两个不同的地方,索引一个表只能有一个聚簇索引,innodb会吧主键索引当做聚簇索引。

下图展示了聚簇索引的结构,一个典型的b+树



聚簇索引的有点:可以最大限度的提高io性能,因为只需要根据索引列进行查询到结果后就可以得到此行上的全部数据,不过对于innodb来说意味着只能通过主键查找才能获得这样的优势。

聚簇索引的缺点:索引的更新操作的代价会很大,由于聚簇索引指向整个块的数据,数据量较大,如果需要移动那么代价自然就会比较高;二级索引(非聚簇索引)由于叶子节点指向的是主键,索引需要二次索引查询,但是对于innodb,通过自适应hash索引可以减少这样的工作。


注:innodb引擎的二级索引中储存了主键ID,事务ID,回滚指针,非主键ID。


innodb和myisam的数据插入过程:

innodb因为一定会应用到主键,而且又用到是聚簇索引,因此插入的话索引和数据直接关系到表的物理结构。因此如果直接不是按照顺序插入的话,会有大量的数据更新,移动的情况出现,因此会比较慢;

myisam在插入过程中没插入一行会在行上加上行号,在无聊上是按照顺序插入的,而在这其中建立索引的过程也就是人叶子节点指向行号,因此会很快。

上面的两个过程也就解释了为什么myisam的导入数据的速度比innodb快很多。


覆盖索引:(感觉概念还是有点太麻烦,用一个例子解释一下)


table1中有id ,name,address字段,其中name上面建立了索引,如下sql

 

select address from table1 where name = ‘dong’;

这种查询和索引看似已经最优了,其实还可以通过覆盖索引来达到更优:

建立索引create INDEX name (name, address);

其实这样解释了需要那个列的字段就select那个列的字段。




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值