概述

前面我们讲了怎么去计算索引所占用的长度?那么换个方式想?索引又应该设置多少长度比较合理呢?

区分度与索引长度的权衡

首先索引长度和区分度是相互矛盾的,

索引长度太短,那么区分度就很低,吧索引长度加长,区分度就高,但是索引也是要占内存的,所以我们需要找到一个平衡点;

那么这个平衡点怎么来定?

比如用户表有个字段 username ,要给他加索引,问题是索引长度多少合适?

其实我们知道 百家姓里面有百多个姓 ,但是大多数人的姓 集中在前十多个;如果我设置索引索引长度为1,占内存少,但是区分度低,区分度低索引的效率越低。太长则占内存;

首先 mysql的索引都是排好序的。如果区分度高排序越快,区分度越低,排序慢;

举个例子: (张,张三,张三哥),如果索引长度取1的话,那么每一行的索引都是 张 这个字,完全没有区分度,你让他怎么排序?结果这样三行完全是随机排的,因为索引都一样;如果长度取2,那么排序的时候至少前两个是排对了的,如果取3,区分度达到100%,排序完全正确;

那是不是索引越长越好? 答案肯定是错的,比如 (张,李,王) 和 (张三啦啦啦,张三呵呵呵,张三呼呼呼);前者在内存中排序占得空间少,排序也快,后者明显更慢更占内存。

总之:

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

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

mysql创建索引的时候指定索引长度

大部分的索引前面一部分的长度就能够有很好的区分度了。

通过减小索引长度,这样能够减小索引文件的大小,能够加快数据的insert。

语法:

CREATEINDEXindex_nameONtable_name (column_name(length), clolumn_name(length)…);

如何确认当前字段设置一个合适的长度呢?

索引长度与区分度要做一个取舍;这个取舍不是没有一个固定的量;需要根据数据库里面的数据来判断;比较常规的公式是:

selectcount(distinctleft(password, 5))/count(*)fromuser

其中password是要加索引的字段,5是索引长度,求出一个浮点数,这个浮点数是逐渐趋向1的,上面这个比值,也算是区分度,也可以算作索引长度测试值,多测试几组,找出最合适的来,一般的区分值在0.1左右就差不多了。

网上找了个图片来分析下;

这个地方观察到,当索引长度达到4的时候就已经趋向1了,所以长度设为4是最佳的,在大点增加的索引效果已经很小了,这个地方不是说必须接近1才行;总之要找一个平衡点;

还有一些特殊的字段常规方法用起不太顺畅,比如有一个url字段,绝大部分的url都是 http://www. 开头的,这种情况下索引长度取取到11都是无效的,需要更长的索引,那么有没有优雅的方式来解决呢;

第一种方法: 可以将数据倒序存入数据库;

第二种方法:对字符串进行crc32哈希处理;

两种方法都不错,当然要配合客户端程序完成;

简单测试:

这个方法可能是优化最后才考虑的点了,不建议太过深究,了解到这就行了。后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注一下~

【编辑推荐】

【责任编辑:华轩 TEL:(010)68476606】

点赞 0

mysql字段的区分度_详解MySQL索引长度和区分度之间的平衡,值得收藏相关推荐

  1. mysql通配符escape使用_详解MySQL like如何查询包含'%'的字段(ESCAPE用法)

    在SQl like语句中,比如 SELECT * FROM user WHERE username LIKE '%luchi%' SELECT * FROM user WHERE username L ...

  2. mysql通配符escape使用_详解MySQL like如何查询包含#39;%#39;的字段(ESCAPE用法)-MySQL教程-Web开发者网...

    在SQl like语句中,比如 SELECT * FROM user WHERE username LIKE '%luchi%' SELECT * FROM user WHERE username L ...

  3. mysql 编辑数据库内容_详解mysql数据库增删改操作

    插入数据 insert into 表名(列名1,列名2,列名3) values(值1,值2,值3); insert into user(user_id,name,age) values(1,'nice ...

  4. mysql 的dcl语句_详解MySQL第三篇—DCL语句

    DCL(Data Control Language)语句:数据控制语句,用于控制不同数据段直接的许可和访问级别的语句.这些语句定义了数据库.表.字段.用户的访问权限和安全级别.主要的语句关键字包括 g ...

  5. mysql mgr 三节点_详解MySQL 5.7 MGR单主确定主节点方法

    我们行MGR年底要上线了,每天都要看官方文档学习,做测试,坚持每天写一个小知识点,有想一起学习的么~ MySQL 5.7 MGR单主确定主节点是哪个,我们可以通过成员ID来判断,然后结合read_on ...

  6. mysql临键锁_详解 MySql InnoDB 中的三种行锁(记录锁、间隙锁与临键锁)

    详解 MySql InnoDB 中的三种行锁(记录锁.间隙锁与临键锁) 前言 InnoDB 通过 MVCC 和 NEXT-KEY Locks,解决了在可重复读的事务隔离级别下出现幻读的问题.MVCC  ...

  7. mysql操作json优点和缺点_详解Mysql中的JSON系列操作函数

    前言 JSON是一种轻量级的数据交换格式,采用了独立于语言的文本格式,类似XML,但是比XML简单,易读并且易编写.对机器来说易于解析和生成,并且会减少网络带宽的传输. JSON的格式非常简单:名称/ ...

  8. 操作 mysql 不生成日志_详解MySQL的日志

    MySQL日志 MySQL的日志记录了MySQL的日常操作和错误信息,通过这些日志我们可以知道MySQL内部发生的事情,可以为MySQL的优化和管理提供必要的信息. MySQL的日志主要有:二进制日志 ...

  9. mysql事件调度定时任务_详解MySQL用事件调度器Event Scheduler创建定时任务

    前言 事件调度器相当于操作系统中的定时任务(如:Linux中的cron.Window中的计划任务),但MySql的事件调度器可以精确到秒,对于一些实时性要求较高的数据处理非常有用. 1. 创建/修改事 ...

最新文章

  1. Blender材质和着色基础视频教程 CGCookie – Fundamentals of Blender Materials and Shading
  2. 标准差、协方差、相关性分别是什么?
  3. Java学习笔记33
  4. 小伙伴们惊呆了!10行 JavaScript 实现文本编辑器
  5. python解非线性规划问题讲析_python中线性规划中的单纯形法、scipy库与非线性规划求解问题...
  6. (七)使用Docker进行人脸识别
  7. SAP License:用望闻问切给企业“看病”
  8. gevent的同步与异步
  9. Optional Interview with Benny the Irish Polyglot abo---coursera课程Learn how to learn
  10. 显示器接口针脚定义(D-sub15)
  11. 微信小程序休眠setTimeout
  12. 公司研发人员(含测试)经理、组长能力评价表
  13. windows无法完成安装若要在此计算机,windows无法完成安装.若要在此
  14. matlab求x对应y值,matlab 不知道函数表达式,已知y值求x
  15. 期末总结---为本学期画上圆满的句号
  16. 机器学习中的评估指标与损失函数
  17. 如何给未来的自己写一封信(邮件) -- 方法
  18. win7系统不显示图片的缩略图的终极解决方法
  19. C++多线程:thread_local
  20. SQLite 使用问题记录(一)

热门文章

  1. Nacos如何实现统一配置管理
  2. SEO原创和伪原创文章的一些技巧
  3. 精选100个Python实战项目案例,送给零基础小白的你
  4. 【已失效】免翻在Chrome上使用新必应(New Bing)聊天机器人
  5. 一文带你了解MySQL的前世今生,架构,组成部分,特点,适用场景
  6. 骨传导有什么品牌,骨传导耳机品牌推荐
  7. 朱丹老师课程学习笔记:8、职场晋升-没人带怎么办?这样搜资料的小白也能变大神
  8. 基于拉丁超立方抽样与自适应策略的改进鲸鱼优化算法
  9. 读《哪有没时间这回事》有感
  10. 词根词缀 (一):前缀篇