最理想的索引

索引片和过滤因子

索引片

* SQL查询语句在执行中需要扫描的一个索引频段,我们会根据索引片中包含的匹配列的数量不同,将索引分成窄索引和宽索引。
* 如果索引片越宽,需要顺序扫描的索引页就越多,如果索引片越窄,就会减少索引访问的时间。

如何通过宽索引避免回表

* 回表:数据库根据索引找到数据行之后,还需要通过主键,再次到数据表中读取数据的情况。

过滤因子

* 过滤因子:谓词的选择性。就是where条件中,每个条件,都是一个谓词。

三星索引

1. 在where条件语句中,找到所有等值谓词中的条件列,将他们作为索引片中的开始列。
2. 将group by 和 order by 中的列,加入到索引中。
3. 将select字段中剩余的列加入到索引片中。

理由

1. 通过索引查找符合条件的记录,就需要将where子句中的等值谓词列加入到索引片中,这样索引的过滤能力越强,最终扫描的数据行就越少
2. 我们对数据记录分组或者排序,都需要重新扫描数据记录,为了避免进行file sort 排序,可以把group by 和 order by 中涉及到的列加入到索引中,因为创建了索引就会按照索引的顺序来存储数据。
3. 我们取数据的时候,会存在回表情况。回表就是通过索引找到了数据行,但是还需要通过主键的方式在数据表中查找完成的记录。这是因为select所需的字段并不都保存在索引中,因此我们可以将select中的字段都保存在索引中,避免回表的情况。

很难存在理想的索引设计

1. 采用三星索引,会让索引变宽,这样每个页能够存储的索引数据会变少,从而增加了页加载的数量。从另一个角度看,如果数据量很大,过多的索引需要的磁盘空间会成为一个问题,对缓冲池所需的空间的压力会增加
2. 增加了索引维护的成本,如果索引个数过多,索引维护的成本会增加。

总结

1. 一张表的索引个数不宜过多。
2. 需要控制索引列的数量。
3. 单列索引和符合索引的长度也需要控制,在MySQL InnoDB中,系统默认单个索引长度最大767,如果单列索引长度超过了这个限制,就会取前缀索引,也就是取前255字符。
4. 数据表设计的时候,尽量采用数值类型代替字符类型,尽量避免用字符类型做主键,同时针对字符字段,最好只创建前缀索引。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值