一、索引长度:在SQL执行计划中,key_len 表示索引长度,经常用于判断复合索引是否被完全使用。

注:在utf8编码方式下,一个字符占3个字节;utf8mb4一个字符占4个字节;gbk中一个字符占2个字节;latin中一个字符占1个字节。索引长度可以指定,不指定的情况下会按照规则使用默认的长度。

1、默认索引长度定义:在没有指定索引长度的情况下,如果索引字段不为空且长度不可变,索引长度等于该字段的长度;可以为null,mysql会用1个字节标识;长度可变,MySQL会使用2个字节标识。以utf8编码为例

(1)如果索引字段不为空且长度不可变,索引长度等于该字段的长度;

CREATE TABLE `test` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` char(20) NOT NULL,PRIMARY KEY (`id`),KEY `index_name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

随便插入几条数据:

索引查询: key_len = 60,索引段name的长度是20个字符,key_len = 20*3 = 60。

(2)如果索引字段不为空,长度可变:改成varchar:

查询:key_len = 20*3 +2= 62

(3)如果索引字段可以为空,长度不可变:

查询:key_len = 20*3 +1= 61

(4)以此类推,字段既可以为空长度也可变,索引长度+2+1:

查询:

(5)复合索引:索引列长度之和

CREATE TABLE `test` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(20) DEFAULT NULL,`address` varchar(20) DEFAULT NULL,PRIMARY KEY (`id`),KEY `index_name_address` (`name`,`address`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

key_len长度为63,说明只用到了复合索引的前半部分;

key_len长度为126,说明该SQL查询语句用了整个复合索引。

综上,key_len 表示索引长度,经常用于判断复合索引是否被完全使用。

2、指定索引长度:

CREATE INDEX index_name ON table_name column_name(length);

如对于表

设置索引长度:

ALTER TABLE test ADD INDEX index_name_address (`name`(10),`address`(10));

key_len = 10*3+2+1+10*3+2+1=66。

二、索引区分度:区分度百分比 = select count(distinct left(索引字段,索引长度))/count(1) from table。区分度越高,查询越快,如主键索引,主键是唯一的,主键索引的区分度就是1。区分度低的索引原则上已失去意义,没有明显的查询效率,而且添加了索引每次查询会先走索引树,再回表查询,增加了额外的io消耗,就不如直接查询原表来的效率高

三、总结:索引长度和区分度是相互矛盾的,索引长度太短,那么区分度就很低,把索引长度加长,区分度就高,但是索引也是要占内存的,所以我们需要找到一个平衡点。

举个例子:(张,张三,张三哥),如果索引长度取1的话,那么每一行的索引都是 张 这个字,完全没有区分度,无法排序,结果这样三行完全是随机排的,因为索引都一样;如果长度取2,那么排序的时候至少前两个是排对了的,如果取3,区分度达到100%,排序完全正确;但是并不是索引越长越好,比如 (张,李,王) 和 (张三啦啦啦,张三呵呵呵,张三呼呼呼);前者在内存中排序占得空间少,排序也快,后者明显更慢更占内存,在大数据应用中这一点点影响都是很大的。

查询(五)索引长度和索引区分度相关推荐

  1. mysql使用的索引长度_MySQL索引的索引长度问题

    MySQL索引的索引长度问题: Specified key was too long;max key length is 1000 bytes. 一.修改mysql的默认存储引擎: 1.查看mysql ...

  2. mysql字段的区分度_详解MySQL索引长度和区分度之间的平衡,值得收藏

    概述 前面我们讲了怎么去计算索引所占用的长度?那么换个方式想?索引又应该设置多少长度比较合理呢? 区分度与索引长度的权衡 首先索引长度和区分度是相互矛盾的, 索引长度太短,那么区分度就很低,吧索引长度 ...

  3. 五、MongoDB的索引

    一.MongoDB的下载.安装与部署 二.MongoDB的基础知识简介 三.MongoDB的创建.更新和删除 四.MongoDB的查询 五.MongoDB的索引 1.简介 它就像是一本书的目录,如果没 ...

  4. 【MySQL优化(六)】InnoDB索引优化与索引规约

    序 上一篇讲解了建表规范后,本章重点分析下创建索引的一些规范 由于索引是工作在存储引擎层,所以以下规约都是基于InnoDB引擎 题外话 在满足语句需求的情况下, 尽量少地访问/消耗资源是数据库设计的重 ...

  5. Mysql索引区分度、索引长度

    八.索引区分度.索引长度 索引长度越长,索引区分度越高.索引长度越短,索引区分度越低.区分度越高,意味着排序越快,或者说本身就是按照大概率正确的顺序排好的.但索引长度越长,也意味着相同空间内能容纳的数 ...

  6. 五八搜索实时索引实现和重构

    假设一个用户查询"java高级工程师"(即查询query),我们需要返回所有包含"java高级工程师"相关的文档(doc).直观反应就是把所有的文档遍历一遍,在 ...

  7. Mysql数据库查询好慢,除了索引,还能因为什么?

    mysql查询为什么会慢,关于这个问题,在实际开发经常会遇到,而面试中,也是个高频题. 遇到这种问题,我们一般也会想到是因为索引. 那除开索引之外,还有哪些因素会导致数据库查询变慢呢? 有哪些操作,可 ...

  8. MongoDB ( 五 )高级_索引

    索引 在认识索引的之前我们先建立一张表,并往其中插入200万条数据. // test.js //生成随机数 function GetRandomNum(min,max){let range = max ...

  9. MySQL前缀索引与覆盖索引:前缀索引对于索引精简 覆盖索引对于查询数据索引化

    前缀索引 当索引的字符串列很大时,创建的索引也就变得很大,为了减小索引体积,提高索引的扫描速度,就用索引的前部分字串索引,这样索引占用的空间就会大大减少,并且索引的选择性也不会降低很多. 列的前缀的长 ...

最新文章

  1. 3行代码,Python数据预处理提速6倍!(附链接)
  2. 控制好节奏,踏实做好每件事
  3. tensorflow中tensor的索引
  4. 天翼云从业认证课后习题(3.3天翼云网络产品)
  5. 当Project xCloud落地移动终端,云游戏靠手游撑起“当打之年”?
  6. 修改linux默认启动级别(包括Ubuntu)
  7. Epoll例子的使用
  8. 更新SQL Server实例所有数据库表统计信息
  9. php mui.picker,www MUI框架里边有很多例子教你如何使用 开发手机界面 WEB(ASP,PHP,...) 251万源代码下载- www.pudn.com...
  10. 开通博客,记录一下。
  11. c语言且或者是优先级,C语言笔试题
  12. CDH/HDP迁移之路
  13. Entrust - Laravel 用户权限系统解决方案 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 - Powered by PHPHub...
  14. 10——Filter过滤器
  15. 用IMAP4访问Exchange邮箱
  16. Alist+PotPlayer实现高清影视在线观看
  17. cdma 复制短息到uim卡的实现
  18. visual studio 如何编写c语言程序,用Visual Studio 编写纯C语言程序
  19. C++ list及数组中数字相连输出问题
  20. 笔记本电脑屏幕当作扩展屏幕(一台PC给另一台PC当扩展屏 win10自带功能)

热门文章

  1. 利用计算机网络盗窃,利用计算机病毒盗窃网络虚拟财产行为定性分析
  2. 数据挖掘分类算法的学习总结
  3. phalcon 配置
  4. 富士 XF30mm F2.8 微距镜头 评测
  5. Win7开机登陆密码的破解
  6. 干货来袭!海康威视java开发做什么
  7. 代码缩进对齐用空格还是制表符?
  8. java 发邮件授权码_javamail - androidmail 发送邮件 各种邮件授权方式
  9. 酷~史上超全的安全思维导图
  10. 百度人脸实时识别软件