mysql中索引长度与区分度的选择

作者: Note 分类: mysql学习 发布时间: 2017-04-25 14:33

问题背景

  • 现在有这么一个需求,比如说商品表中的商品名称和商品描述两个字段,有时候我们根据商品名称或者描述来查询商品,但是所有的名称或者商品描述又不同,其内容长度又长短不一,但是商品名称或者描述又是经常查询的字段,我们怎样给商品描述或者商品名称添加索引哪?也就是说在商品名称或者商品描述上面的索引长度应该设置多长最合适哪?

区分度与索引长度的权衡

  1. 索引长度越低,索引在内存中占的长度越小,排序越快,然而区分度就越低。这样不利于查找。
  2. 索引长度越长,区分度就高,虽然利于查找了,但是索引在内存中占得空间就多了。

解决方案

  • 比如说,现在有一个商品表,表名为item,里面有一个商品名称字段,字段名称为title。
  • 查询该字段中,内容最长的一条记录占多少个字节(注意:在MySQL中,utf8编码格式下,一个汉字占一个字符,一个字符有三个字节长度)。
    select length(max(title)) from item limit 0,1;
  • 1
  • 2
  • 1
  • 2

NoteBlog

  • 查询该字段中,内容最短的一条记录占多少个字节
   select length(min(title)) from item limit 0,1;
  • 1
  • 2
  • 1
  • 2

NoteBlog

  • 查询title中从左边数第一个不重复的汉字(也就是一个字符)有多少行
 select count(distinct left(title,1)) from item;
  • 1
  • 2
  • 1
  • 2
  • 计算title中,从左边数第10个不重复的汉字的行数与总行数的比
select count(distinct left(title,10))/count(*) from item;
  • 1
  • 1

NoteBlog
上面这个比值,也算是区分度,也可以算作索引长度测试值,多测试几组,找出最合适的来,一般的区分值在0.1左右就差不多了。下面是我测试结果的曲线图。
NoteBlog

小结

  • 多做几组测试,这样就能测试出来结果,逐渐的权衡索引长度与区分度之间的比例,此方法是优化索引良策啊,如果读者还有其他方法,请多多指教。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

发表评论

电子邮件地址不会被公开。 必填项已用*标注

90 − 81 =