mysql 索引长度和区分度

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

时间: 2024-11-16 16:11:28

mysql 索引长度和区分度的相关文章

MySQL索引长度限制问题

在修改表结构时出现了错误:Specified key was too long;max key length is 1000 bytes. MySQL版本为Server version: 5.1.36, 执行SQL为: alter table pre_common_diy_data modify column targettplname varchar(255); 如果是按一个字符占两个字节计算 2*255=510 并没有超过1000字符,怎么会报错呢? 在查询相关资料后发现,MySQL MyI

mysql索引长度

http://blog.csdn.net/qsc0624/article/details/51335632 大家应该知道InnoDB单列索引长度不能超过767bytes,联合索引还有一个限制是长度不能超过3072. mysql> CREATE TABLE `tb` ( ->   `a` varchar(255) DEFAULT NULL, ->   `b` varchar(255) DEFAULT NULL, ->   `c` varchar(255) DEFAULT NULL,

修改Mysql索引长度限制

mysql 索引过长1071-max key length is 767 byte问题create table: Specified key was too long; max key length is 767 bytes 原因数据库表采用utf8编码,其中varchar(255)的column进行了唯一键索引而mysql默认情况下单个列的索引不能超过767位(不同版本可能存在差异) 于是utf8字符编码下,255*3 byte 超过限制 解决1 使用innodb引擎:2 启用innodb_l

mysql索引长度的一些限制

一.myisam存储引擎 1. 数据库版本:阿里云RDS MySQL5.1 mysql> select @@version;+-------------------------------+| @@version |+-------------------------------+| 5.1.61-Alibaba-rds-201404-log |+-------------------------------+1 row in set (0.00 sec) 2. 测试的表结构信息 mysql>

mysql 索引长度解释及不使用索引的一种特殊情况

如果两个表关联的字段,在表结构中设置的字符集不一样,即使设置了索引,也无法使用. 详情可参考: https://yq.aliyun.com/articles/69138?spm=5176.100239.bloglist.185.xQpesw 关于mysql explain时,key_len字段的计算方法: varchr(10)变长字段且允许NULL    =  10 * ( character set:utf8=3,gbk=2,latin1=1)+1(NULL)+2(变长字段)varchr(10

【MySQL】索引长度的一些限制

有同学问到InnoDB的索引长度问题,简单说几个tips. MySQL的每个单表中所创建的索引长度是有限制的,且对不同存储引擎下的表有不同的限制. myisam表,单列索引,最大长度不能超过 1000 bytes,否则会报警,但是创建成功,最终创建的是前缀索引(取前333个字符). myisam表,组合索引,索引长度和不能超过 1000 bytes,否则会报错,创建失败: innodb表,单列索引,超过 767 bytes的,给出warning,最终索引创建成功,取前缀索引(取前 255 字符)

mysql设置合适的索引长度

理想的索引: 相对于写操作来说,表查询很频繁的表建立索引 字段区分度高 长度小(合适的长度,不是越小越好) 尽量能够覆盖常用字段 这些条件综合起来才能够达到最优索引,本次我们着重聊一下建立合适长度的索引,索引的长度直接影响索引文件的大小,因此会影响增删改查的速度 给字符类型的字段设置长度字段查询时区分度要高,如果字段只是设置了一个那么回查询很多相似的匹配度不高,长度要恰到好处,否则太长索引文件就会大,因此 要在区分度和长度上做一个平衡. 1.先来看一下没设置索引的查询 mysql> explai

MySQL InnoDB引擎索引长度受限怎么办?

大家应该知道InnoDB单列索引长度不能超过767bytes,联合索引还有一个限制是长度不能超过3072. mysql> CREATE TABLE `tb` ( ->   `a` varchar(255) DEFAULT NULL, ->   `b` varchar(255) DEFAULT NULL, ->   `c` varchar(255) DEFAULT NULL, ->   `d` varchar(255) DEFAULT NULL, ->   `e` var

mysql:索引原理与慢查询优化

一 介绍 二 索引的原理 三 索引的数据结构 三 MySQL索引管理 四 测试索引 五 正确使用索引 六 查询优化神器-explain 七 慢查询优化的基本步骤 八 慢日志管理 九 参考博客 一 介绍 为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句的优化显然是重中之重.说起加速查询,就不得不提到索引了. 什么是索引? 索引在MySQL中也叫做"键&quo