美文网首页
mysql 索引长度和区分度

mysql 索引长度和区分度

作者: willcoder | 来源:发表于2019-07-28 03:19 被阅读0次

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

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

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

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

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

区分度低索引的效率越低。太长则占内存;

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

举个例子: (张,张三,张三哥),如果索引长度取1的话,那么每一行的索引都是 张 这个字,完全没有区分度,你让他怎么排序?结果这样三行完全是随机排的,因为索引都一样;

如果长度取2,那么排序的时候至少前两个是排对了的,如果取3,区分度达到100%,排序完全正确;

等等,那你说是不是索引越长越好? 答案肯定是错的,比如 (张,李,王) 和 (张三啦啦啦,张三呵呵呵,张三呼呼呼);前者在内存中排序占得空间少,排序也快,后者明显更慢更占内存,在大数据应用中这一点点都是很恐怖的;

所以要做一个取舍;这个取舍不是没有一个固定的量;需要跟你自己的数据库里面的数据来判断;比较常规的公式是:

test是要加索引的字段,5是索引长度,

select count(distinct left(test,5))/count(1) from table; 

求出一个浮点数,这个浮点数是逐渐趋向1的,网上找了个图片来分析下;

image

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

其实这个值达到0.1就已经可以接受了;总之要找一个平衡点;

还有一些特殊的字段常规方法用起不太顺畅,比如有一个url字段,绝大部分的url都是 http://www. 开头的

这种情况下索引长度取取到11都是无效的,需要更长的索引,那么有没有优雅的方式来解决呢;

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

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

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

相关文章

  • mysql 索引长度和区分度

    首先 索引长度和区分度是相互矛盾的, 索引长度太短,那么区分度就很低,吧索引长度加长,区分度就高,但是索引也是要...

  • mysql 索引长度、区分度和前缀索引

    好的索引 1、查询频繁 2、 区分度高 3、长度小 4、尽量能覆盖常用查询字段 索引长度的重要性 索引长度直接影响...

  • MySQL——如何截取合适的左前缀索引长度

    1、 理想的索引 ①:查询频繁 :②区分度高 ③:长度小 ④: 尽量能覆盖常用查询字段. 注意: 索引长度直接...

  • MySQL 常见SQL优化、索引优化

    索引优化 索引区分度 前言 索引长度直接影响索引文件的大小,影响增删改的速度,并间接影响查询速度(占用内存多) 针...

  • MySQL中采用类型varchar(20)和varchar(25

    MySQL建立索引时如果没有限制索引的大小,索引长度会默认采用的该字段的长度,也就是说varchar(20)和va...

  • varchar(20)和varchar(255)的空间开销区别

    MySQL建立索引时如果没有限制索引的大小,索引长度会默认采用的该字段的长度,也就是说varchar(20)和va...

  • Mysql索引长度问题

    今天在做测试的时候,遇到一个问题,百撕不得其姐。先描述下场景,本想测试索引使用情况:explain select ...

  • MySQL索引长度限制

    问题引入 想必不少开发者在工作过程中会听到同事或者在网上看到以下内容: MySQL索引长度不能超过191,需限制为...

  • 高性能的索引策略

    MySQL查询基础-查询执行过程 MySQL聚簇索引 MySQL覆盖索引 MySQL索引扫描排序 MySQL冗余和...

  • MySQL索引的使用

    MySQL索引 MySQL索引可以快速提高MySQL的检索速度。索引分单列索引和组合索引单列索引:即一个索引只包含...

网友评论

      本文标题:mysql 索引长度和区分度

      本文链接:https://www.haomeiwen.com/subject/iapcrctx.html