详解MySQL索引长度和区分度之间的均衡,值得保藏
概述 前面我们讲了怎么去计较索引所占用的长度?那么换个方法想?索引又应该配置几多长度较量公道呢? ![]() 区分度与索引长度的衡量 起首索引长度和区分度是彼此抵牾的, 索引长度太短,那么区分度就很低,吧索引长度加长,区分度就高,可是索引也是要占内存的,以是我们必要找到一个均衡点; 那么这个均衡点怎么来定? 好比用户表有个字段 username ,要给他加索引,题目是索引长度几多吻合? 着实我们知道 百家姓内里有百多个姓 ,可是大大都人的姓 齐集在前十多个;假如我配置索引索引长度为1,占内存少,可是区分度低,区分度低索引的服从越低。太长则占内存; 起首 mysql的索引都是排好序的。假如区分度高排序越快,区分度越低,排序慢; 举个例子: (张,张三,张三哥),假如索引长度取1的话,那么每一行的索引都是 张 这个字,完全没有区分度,你让他怎么排序?功效这样三行完满是随机排的,由于索引都一样;假如长度取2,那么排序的时辰至少前两个是排对了的,假如取3,区分度到达100%,排序完全正确; 那是不是索引越长越好? 谜底必定是错的,好比 (张,李,王) 和 (张三啦啦啦,张三呵呵呵,张三呼呼呼);前者在内存中排序占得空间少,排序也快,后者明明更慢更占内存。 总之: 索引长度越低,索引在内存中占的长度越小,排序越快,然而区分度就越低。这样倒霉于查找。 索引长度越长,区分度就高,固然利于查找了,可是索引在内存中占得空间就多了。 mysql建设索引的时辰指定索引长度 大部门的索引前面一部门的长度就可以或许有很好的区分度了。 通过减小索引长度,这样可以或许减小索引文件的巨细,可以或许加速数据的insert。 语法:
怎样确认当前字段配置一个吻合的长度呢? 索引长度与区分度要做一个弃取;这个弃取不是没有一个牢靠的量;必要按照数据库内里的数据来判定;较量通例的公式是:
个中password是要加索引的字段,5是索引长度,求出一个浮点数,这个浮点数是逐渐趋向1的,上面这个比值,也算是区分度,也可以算作索引长度测试值,多测试几组,找出最吻合的来,一样平常的区分值在0.1阁下就差不多了。 网上找了个图片来说明下; ![]() 这个处所调查到,当索引长度到达4的时辰就已经趋向1了,以是长度设为4是最佳的,在大点增进的索引结果已经很小了,这个处所不是说必需靠近1才行;总之要找一个均衡点; 尚有一些非凡的字段通例要领用起不太顺畅,好比有一个url字段,绝大部门的url都是 http://www. 开头的,这种环境下索引长度取取到11都是无效的,必要更长的索引,那么有没有优雅的方法来办理呢;
两种要领都不错,虽然要共同客户端措施完成; 简朴测试: ![]() 这个要领也许是优化最后才思量的点了,不提议过分穷究,相识到这就行了。后头会分享更多devops和DBA方面的内容,感乐趣的伴侣可以存眷一下~ 【编辑保举】
点赞 0 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |