当前位置: 首页 > 科技观察

MySQL索引长度与判别度平衡的详解值得收藏

时间:2023-03-14 14:07:04 科技观察

概述前面我们讲了如何计算索引占用的长度?那么换个角度想想呢?指标应该设置多长时间比较合理?判别与索引长度权衡首先,索引长度与判别是矛盾的。如果索引长度太短,那么区分度就会很低。索引长度越长,区分度就越高,但是索引也很占内存,所以我们需要找到一个平衡点。观点;那么如何确定这个平衡点呢?比如user表中有一个字段username,需要为其添加索引。问题是索引多长合适?其实,我们知道百姓中有一百多个姓氏,但大多数人的姓氏都集中在前十名;如果我把索引indexlength设置为1,占用内存少,但是区分度低,区分度低的索引效率比较低。太长会占用内存;首先对mysql的索引进行排序。辨别度高,排序快,辨别度低,排序慢;比如:(张,张三,张三),如果索引长度为1,那么每一行的索引就是张这个词,完全没有歧视,你问他怎么排序?结果三行完全是随机排列的,因为索引都是一样的;如果长度为2,那么排序时至少前两个是正确的。如果3,判别率达到100%,排序完全正确;索引越长越好吗?答案一定是错的,比如(张,李,王)和(张三啦啦啦,张三呵呵呵呵,张三呵呵);前者在内存中排序占用空间小,速度快,而后者明显慢,占用内存多。简而言之:索引长度越小,索引在内存中的长度越小,排序越快,但区分度越低。这样不利于查找。索引长度越长,区分度越高。索引虽然方便查找,但占用内存空间较大。mysql在创建索引时,指定大部分索引的长度,索引前面部分的长度可以有很好的区分度。通过减少索引长度,可以减小索引文件的大??小,加快数据插入速度。语法:CREATEINDEXindex_nameONtable_name(column_name(length),clolumn_name(length)…);如何确认当前字段的长度是否合适?索引长度和歧视之间存在权衡;这种权衡并非没有固定数额;需要根据数据库比较常规的公式是:selectcount(distinctleft(password,5))/count(*)fromuser其中password是要索引的字段,5是索引长度,一个浮点数被计算。这个浮点数是逐渐趋于1的,上面的比值也可以看作是判别度,也可以看作是索引长度的检验值。测试几组以找到最合适的一组。一般判别值约为0.1。在网上找了一张图分析;这里观察到index长度到4的时候趋于1,所以长度设置为4是最好的,在大的点上增加index的效果已经很小了。这个地方不是说一定要接近1;总之,我们要找到一个平衡点;还有一些特殊的领域,用常规的方法是不容易使用的。比如有一个url字段,大部分url以http://www开头。是的,这种情况下,取索引长度为11是无效的,需要更长的索引,请问有没有优雅的方法解决;第一种方法:可以将数据倒序存储在数据库中;第二种方法:对字符串进行crc32哈希处理;两种方法都可以,当然必须用客户端程序来完成;简单测试:这个方法可能是最后一个优化点,不建议深入太深,理解这个就可以了。.更多devops和DBA内容稍后会分享,感兴趣的朋友可以关注~