一种可衡量的确定MySQL前缀索引长度方法

前缀索引,是指对于varchar/text/blob类型的字段建立索引时一般都会选择前N个字符作为索引。索引很长的字符列,会让索引变得大且慢。索引开始的部分字符,这样可以大大节约索引空间,从而提高索引效率,但这样也会降低索引的选择性。索引的选择性是指不重复的索引值(也称为基数,cardinality)和数据表的记录总数的比值。
计算公式:

SELECT COUNT(DISTINCT(a))/COUNT(*) FROM table1;

比值约接近于1,说明选择性越好,说明不重复的值的行数约接近总数。


那怎么选择一个varchar/text/blob的字段应该选择前N个字符呢?如何确定N的大小呢?有没有科学衡量的方法?
答案是有的。
计算方法如下:

mysql> SELECT COUNT(DISTINCT(a))/COUNT(*) e,
    -> COUNT(DISTINCT(LEFT(a,1)))/COUNT(*) e1,COUNT(DISTINCT(LEFT(a,2)))/COUNT(*) e2,COUNT(DISTINCT(LEFT(a,3)))/COUNT(*) e3,
    -> COUNT(DISTINCT(LEFT(a,4)))/COUNT(*) e4,COUNT(DISTINCT(LEFT(a,5)))/COUNT(*) e5,COUNT(DISTINCT(LEFT(a,6)))/COUNT(*) e6,
    -> COUNT(DISTINCT(LEFT(a,7)))/COUNT(*) e7,COUNT(DISTINCT(LEFT(a,8)))/COUNT(*) e8 FROM text_blob;
+--------+--------+--------+--------+--------+--------+--------+--------+--------+
| e      | e1     | e2     | e3     | e4     | e5     | e6     | e7     | e8     |
+--------+--------+--------+--------+--------+--------+--------+--------+--------+
| 1.0000 | 0.0225 | 0.4663 | 0.8618 | 0.9734 | 0.9958 | 0.9992 | 0.9992 | 1.0000 |
+--------+--------+--------+--------+--------+--------+--------+--------+--------+
1 row in set (0.02 sec)

left按照不同的长度计算比值,找到一个和完整列比例接近的值,比如上面e5前5个长度比例达到0.9958,已经很接近1了,综合考虑比较合适。
最后,开开心心把索引建上:)

ALTER TABLE text_blob ADD KEY (a(5));
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值