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哈希处理;
两种方法都不错,当然要配合客户端程序完成;
MySQL 索引长度和区分度的更多相关文章
- Mysql索引长度和区分度
		
首先 索引长度和区分度是相互矛盾的, 索引长度太短,那么区分度就很低,吧索引长度加长,区分度就高,但是索引也是要占内存的,所以我们需要找到一个平衡点: 那么这个平衡点怎么来定? 比如用户表有个字段 ...
 - MySQL索引长度限制问题
		
在修改表结构时出现了错误:Specified key was too long;max key length is 1000 bytes. MySQL版本为Server version: 5.1.36 ...
 - mysql索引长度
		
http://blog.csdn.net/qsc0624/article/details/51335632 大家应该知道InnoDB单列索引长度不能超过767bytes,联合索引还有一个限制是长度不能 ...
 - MySQL索引长度限制
		
索引 TextField是不支持建立索引的 MySQL对索引字段长度有限制 innodb引擎的每个索引列长度限制为767字节(bytes),所有组成索引列的长度和不能大于3072字节 myisam引擎 ...
 - mysql 索引长度限制
		
MyISAM存储引擎引键的长度综合不能超过1000字节 InnoDB单列索引长度不能超过767bytes,联合索引还有一个限制是3072
 - mysql索引长度的一些限制
		
一.myisam存储引擎 1. 数据库版本:阿里云RDS MySQL5.1 mysql> select @@version;+-------------------------------+| ...
 - mysql 索引长度的限制
		
myisam表,单列索引,最大长度不能超过 1000 bytes: innodb表,单列索引,最大长度不能超过 767 bytes: utf8 编码时 一个字符占三个字节 varchar 型能建 ...
 - 【MySQL】索引长度的一些限制
		
有同学问到InnoDB的索引长度问题,简单说几个tips. MySQL的每个单表中所创建的索引长度是有限制的,且对不同存储引擎下的表有不同的限制. myisam表,单列索引,最大长度不能超过 1000 ...
 - 索引长度过长 ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes
		
1.发现问题 今天在修改innodb表的某个列的长度时,报如下错误: alter table test2 modify column id varchar(500); ERROR 1071 (4200 ...
 
随机推荐
- day11---函数对象、名称空间、作用域、闭包函数
			
一.函数对象: 定义:函数对象就是函数名,函数名就是存放了函数的内存地址,存放了内存地址的变量就是对象 函数对象的应用: 可以直接被引用:(fn = cp_fn) 可以当做参数传递传递: comput ...
 - mysql查询表结果排序
			
要求:将数据表tab1中DeviceName为‘XI003’,'DO107'的数据放在查询结果的前面,同时对其他查询结果进行降序排序 sql语句: SELECT DISTINCT DeviceName ...
 - Linux Namespace : Mount
			
Mount namespace 为进程提供独立的文件系统视图.简单点说就是,mount namespace 用来隔离文件系统的挂载点,这样进程就只能看到自己的 mount namespace 中的文件 ...
 - Item 14: 如果函数不会抛出异常就把它们声明为noexcept
			
本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 在C++98中,异常规范(exception specificat ...
 - babel-preset-env使用指南
			
文章概览 babel-preset-env是非常重要且常用的一个插件预设,掌握它的用法以及实现原理非常有必要. 本文主要内容包括:babel-preset-env是什么.入门实例.如何配置以支持特定版 ...
 - H5 34-背景图片
			
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
 - H5 18-序选择器
			
18-序选择器 我是标题 我是段落1 我是段落2 我是段落3 我是段落4 我是段落5 我是段落6 我是段落7 我是段落8 --> 我是段落1 我是段落2 我是段落2 我是标题 <!DOCT ...
 - Python-类的绑定方法与非绑定方法
			
类中定义的函数分成两大类 一:绑定方法(绑定给谁,谁来调用就自动将它本身当作第一个参数传入): 绑定到类的方法:用classmethod装饰器装饰的方法. 为类量身定制 类.boud_method() ...
 - Codeforces Round #481 (Div. 3)Petya's Exams CodeForces - 978G
			
Petya studies at university. The current academic year finishes with nn special days. Petya needs to ...
 - NSAssert和NSParameterAssert
			
2016.05.05 18:34* 字数 861 阅读 5127评论 0喜欢 17 https://www.jianshu.com/p/3072e174554f NSAssert和NSParamete ...