高效使用索引

1,独立的列

索引列不能是表达式的一部分,也不能作为函数参数出现。

2,前缀索引和索引选择性

解决索引很长的字符列导致查询变慢的策略:

  • 模拟哈希索引(采用哈希函数得到的哈希值作为索引)
  • 采用前缀索引(选用选择性高的前缀做索引)

索引的选择性是指不重复的索引值与数据表的记录总数的比值,选择性越高查询效率越高,因为选择性高的索引会在查询时过滤掉更多的行。

使用前缀索引的对象主要有:BLOB,TEXT,很长的varchar类型的列,因为mysql不允许索引这些列的完整长度。

如何决定前缀索引:
计算不同前缀长度的选择性,选择与完整列选择性相近的前缀长度做前缀索引。同时要注意避免最常出现前缀的出现次数比最常出现字段的出现次数大很多的话,。

//计算完整列的选择性
mysql>select count(Distinct 字段名)/count(*) from 表名 

//计算不同前缀长度的选择性
mysql>select count(distinct left(字段名,前缀长度))/count(*) from 表名

前缀索引的优缺点

优点缺点
索引更小,更快无法进行order by和group by的操作
无法进行覆盖扫描

Mysql原生并不支持反向索引,但可以把字符串反转后存储,并基于此建立前缀索引,可以通过触发器维护这种索引。

3,选择合适的索引列顺序
当不考虑排序和分组的时候,一般情况下是按照经验法则:将选择性高的列放到最前面(和前缀索引一样),通常情况下也可以根据避免随机IO和排序去选择。需要注意where子句中的排序,分组,范围条件等因素都可能会对查询带来很大影响。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值