mysql索引详解

索引的最左匹配原则

如果索引中使用了复合索引,如(a,b,c)建立索引。那么相当于建立了三个索引a、ab、abc。以这样的方式查询时,会走索引。
遇到范围查询,后面的字段就不会再走索引了。
索引尽量选择区分度高的,这样每一次io操作,就可以过滤掉更多的数据。

索引的建立原则

  1. 使用区分度高的字段当索引,这样每次查一个节点时,就可以过滤掉更多数据。
  2. 使用递增的键,来建立索引。这样每次添加数据就不会插入到B+树的中间,导致树结构变动,维护树结构造成性能消耗。
  3. 尽量使用短索引,这样的话,每一个节点,(一页16k)就可以存更多的索引关键字。B+树的树高就更低,表示我们io操作就更少。
  4. 索引也不是越多越好,每一个索引都是一颗B+树,数据的删除、添加都会引起树结构变动,维护B+树的成本也更大。
  5. 利用好复合索引,一个索引顶好几个使用。
  6. 利用索引覆盖

索引失效的情况

  1. 以%开头的like查询
  2. 查询条件中使用or
  3. 对索引列进行运算

索引覆盖

我们要查询的数据,本身就包含在索引项中,不需要在回表查询,这就是索引覆盖。使用explain显示时,extra=Using index,就表示发送了索引覆盖。

怎样实现索引覆盖

建立索引(tel,name),查询下面的sql语句就会发送索引覆盖,不需要回表。因为非聚簇索引的叶子节点中有id值。

select id,tel,name from uer name='lisa'

建立索引(tel,name),查询下面的sql语句就不会发送索引覆盖,因为sex,在这个复合索引中没有值,必须回表查询。

select id,tel,name,sex from uer name='lisa'

什么情况不建立索引

  1. where语句中用不到的,不加索引
  2. 表记录少,没必要加
  3. 频繁增、删引起B+树结构变化的,需要考虑要不要加
  4. 参与列计算的不适合加
  5. 区分度不高的,没必要加。比如男女,加了索引效果也不大。

前缀索引

比如要使用一个字段建立索引,我们没必要把重复字段也加入进去,只需要提取字段不重复的部分,当作索引。好处是一个节点可以存更多索引关键字。

高度为3的B+树可以存多少数据

B+树一个节点是一页,大小16kb。
假如一页存1000个关键字,一页存100条行数据,那么三层B+树高就是,1000* 1000* 100=1亿。
在mysql中,每个节点使用关键字作为一个递增数组,二分查找提高了效率。

深度分页

分页越深,查询越慢。

查出前10条数据
select * from user order by id limit 010;

查出前50000+10条数据,抛弃前面的50000select * from user order by id limit 5000010;

优化深度分页:
如果是按照自增主键进行排序分页,那么每次查询结束id值,传给下一次的查询语句

select * from user where id > star_id order by limit 10
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值