MySQL调优之索引一 (前缀、覆盖索引)

1.什么是前缀索引?

 假如某个字段的类型是字符串,并设置这个字段加索引,索引就会很长,导致索引变大且慢,一般情况下可以用这个字段的部分字符串,

 这样大大的减少索引的空间,从而提高索引效率,但这会降低索引的选择性。

什么是索引的选择性?

  定义:是指不重复的索引值和数据表记录总数的比值,范围从1/T 到1之间。

  索引的选择性越高则查询效率越高,因为选择性更高的索引可以让mysql在查找的时候过滤掉更多的行。

什么时候用前缀索引?

blob,text,varchar 类型的列,必须使用前缀索引。

选择足够长的前缀来保证字段较高的选择性,但又不能太长

计算完整列的选择性:

select count(distinct left(city,3))/count(*) as sel3 from city;

计算完成之后可以创建前缀索引 

alter table city add key(city(7));

优缺点

前缀索引是一种能使索引更小更快的有效方法,但是也包含缺点:mysql无法使用前缀索引做order by 和 group by。

 

2.什么是覆盖索引?

  1. 如果一个索引包含所有需要查询的字段的值,称为覆盖索引。即 select name from user where name="123";
  2. 不是所有类型的索引都可以称为覆盖索引,覆盖索引必须要存储索引列的值
  3. 不同的存储实现覆盖索引的方式不同,不是所有的引擎都支持覆盖索引,memory 不支持覆盖索引。

优点:

     1.索引条目比数据行小,如果只读索引,mysql查询效率会更快

     2.索引是按照列值的顺序存储的,所以对于IO密集型的范围查询会比较随机IO少得多

     3. 因为InnoDB 是聚簇索引,覆盖索引对InnDB 表特别有用

实战

1、当发起一个被索引覆盖的查询时,在explain的extra列可以看到using index的信息,此时就使用了覆盖索引

 explain select store_id,film_id from inventory\G

2、在大多数存储引擎中,覆盖索引只能覆盖那些只访问索引中部分列的查询。不过,可以进一步的进行优化,可以使用innodb的二级索引来覆盖查询。

例如:actor使用innodb存储引擎,并在last_name字段又二级索引,虽然该索引的列不包括主键actor_id,但也能够用于对actor_id做覆盖查询

mysql> explain select actor_id,last_name from actor where last_name='HOPPER'\G

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值