首页 LNMP Mysql 正文

Mysql 索引长度与区分度

金鹏头像 金鹏 Mysql 2021-12-03 10:12:09 0 507
导读:问题背景现在有这么一个需求,比如说商品表中的商品名称和商品描述两个字段,有时候我们根据商品名称或者描述来查询商品,但是所有的名称或者商品描述又不同,其内容长度又长短不一,但是商品名...

问题背景

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

区分度与索引长度的权衡

  1. 索引长度越低,索引在内存中占的长度越小,排序越快,然而区分度就越低。这样不利于查找。

  2. 索引长度越长,区分度就高,虽然利于查找了,但是索引在内存中占得空间就多了。

解决方案

        比如说,现在有一个商品表,表名为item,里面有一个商品名称字段,字段名称为title。

        查询该字段中,内容最长的一条记录占多少个字节(注意:在mysql中,utf8编码格式下,一个汉字占一个字符,一个字符有三个字节长度)。

    select length(max(title)) from item limit 0,1;

图片.png


        查询该字段中,内容最短的一条记录占多少个字节

   select length(min(title)) from item limit 0,1;

图片.png


        查询title中从左边数第一个不重复的汉字(也就是一个字符)有多少行

select count(distinct left(title,1)) from item;


        计算title中,从左边数第10个不重复的汉字的行数与总行数的比

select count(distinct left(title,10))/count(*) from item;

图片.png


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

图片.png


小结

  • 多做几组测试,这样就能测试出来结果,逐渐的权衡索引长度与区分度之间的比例。

本文地址:https://www.jinpeng.work/?id=19
若非特殊说明,文章均属本站原创,转载请注明原链接。
广告3

欢迎 发表评论:

  • 请填写验证码

日历

«    2025年4月    »
123456
78910111213
14151617181920
21222324252627
282930

控制面板

您好,欢迎到访网站!
  查看权限
广告2

退出请按Esc键