八、索引区分度、索引长度

索引长度越长,索引区分度越高。索引长度越短,索引区分度越低。区分度越高,意味着排序越快,或者说本身就是按照大概率正确的顺序排好的。但索引长度越长,也意味着相同空间内能容纳的数目越少,所以需要找到一个平衡点。

(一) 索引区分度

索引区分度即是否能够区分不同索引,或者说是不同索引的数目。如用户表有三条数据,其中mobile字段分别为"110"、“119”、“120”,如果以前一个字符为前缀索引,则只会有"1"这一个索引,没有索引区分度,该三条记录的排序将会是乱序。如果取前两个字符,则有"11"、"12"这两种索引,则"120"会排在最后,"110"和"119"则可能会乱序。如果取三个字符,则索引区分度可以100%,三条记录的排序则会完全正确。

(二) 索引长度

索引长度的单位是字节,对于不同版本、不同引擎、不同编码方式以及不同类型的索引长度是不同的。

因为工作原因,本文只讨论MySQL8 + utf8mb4编码 + InnoDB引擎的索引情况。

(1) 索引长度上限

网上很多文章有关于索引长度上限是多少,但都是MySQL5.*版本的,不适用于MySQL8.*版本,包括参数变量也在8版本中被移除了。MySQL8.*索引长度上限官网地址

MySQL8.*的索引长度上限由建表时候的ROW_FORMAT(缺省值是Dynamic)决定。REDUNDANTCOMPACT的上限为767字节,DYNAMICCOMPRESSED上限为3072字节。如下图:

(2) 索引长度计算

以下计算基于utf8mb4编码,且默认为非null情况。如果字段允许为null,则以下的索引长度还要各加上1的长度。

类型 索引长度
int 固定为4
bitint 固定为8
char(n) n * 4
varchar(n) n * 4 + 2 因为varchar是变长,需要额外占用1-2个字节来存储字段长度信息
--------------------------------------------:
int 固定为4
bitint 固定为8
char(n) n * 4
varchar(n) n * 4 + 2 因为varchar是变长,需要额外占用1-2个字节来存储字段长度信息

针对超出长度限制的字段建立索引的话,会报错,可以通过前缀索引的方式来避免。
explain查看sql执行计划的时候,key_len属性就是用到的索引的索引长度总长。

Mysql索引区分度、索引长度相关推荐

  1. 查询(五)索引长度和索引区分度

    一.索引长度:在SQL执行计划中,key_len 表示索引长度,经常用于判断复合索引是否被完全使用. 注:在utf8编码方式下,一个字符占3个字节:utf8mb4一个字符占4个字节:gbk中一个字符占 ...

  2. MySQL索引的索引长度问题

    转自:http://samyubw.blog.51cto.com/978243/223773 MySQL的每个单表中所创建的索引长度是有限制的,且对不同存储引擎下的表有不同的限制. 在MyISAM表中 ...

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

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

  4. mysql 大量数据 更改索引_Mysql索引数据结构详解与索引优化

    本篇文章主要学习了MySQL的索引的数据结构的认识,做一个大概的了解即可. 一.索引 在关系数据库中,索引是一种单独的.物理的对数据库表中一列或多列的值进行排序的一种存储数据结构,它是某个表中一列或若 ...

  5. MySQL数据库之索引的应用

    前面几篇文章详细介绍了MySQL数据库的DML,DDL,DCL,DQL常用操作,本篇文章将介绍MySQL中一块对于开发和维护都比较重要的内容--MySQL索引的应用! 1.索引的作用 (1)如果索引为 ...

  6. mysql 织梦 索引_Mysql索引详解 建立索引的优势劣势以及索引规范

    索引是什么 索引(index)是帮助MySQL高效获取数据的数据结构 如果没有特别指明,都是指的是B树索引(多路搜索树,并不一定是二叉树)结构组织的索引 建立索引的优势和劣势 优势 提高数据检索的效率 ...

  7. 面试mysql中怎么创建索引_阿里面试:MySQL如何设计索引更高效?

    有情怀,有干货,微信搜索[三太子敖丙]关注这个不一样的程序员. 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试完整考点.资料以及我的系列文章. ...

  8. mysql字段简索引_Mysql索引优化攻略(全)

    所谓索引就是为特定的mysql字段进行一些特定的算法排序,比如二叉树的算法和哈希算法,哈希算法是通过建立特征值,然后根据特征值来快速查找.而用的最多,并且是mysql默认的就是二叉树算法 BTREE, ...

  9. 浅谈MySQL的B树索引与索引优化

    转载自   浅谈MySQL的B树索引与索引优化 MySQL的MyISAM.InnoDB引擎默认均使用B+树索引(查询时都显示为"BTREE"),本文讨论两个问题: 为什么MySQL ...

最新文章

  1. Python之Python 安装环境搭建
  2. roboware studio_关于安装Roboware的教程
  3. RecyclerView局部刷新机制——payload
  4. C# 得到本机局域网IP地址
  5. MySQL相关日志介绍
  6. Microsoft Azure 中的 SharePoint Server 2013 灾难恢复
  7. 【Janino】Janino Java表达式计算引擎 案例
  8. php海思hi3531d,海思hi3531DV200 h.265编解码AI处理器
  9. 基于bootstrap,个人简历网页模板,响应式布局
  10. 使用 K8S 部署 RSS 全套自托管解决方案- RssHub + Tiny Tiny Rss
  11. 【每天学习一点新知识】常见逻辑漏洞
  12. UE4入门序列08(Unreal制作MMO游戏范围巡逻AI)
  13. Facebook广告投放策略与优化Facebook广告成效的技巧方式
  14. raid配置ssd为缓存_固态硬盘做缓存如何设置
  15. Qt开源作品35-秘钥生成器
  16. 桌面路径改到D盘的目录下
  17. 暑期实训CPU设计(四)
  18. 基于HI600的低成本最小RTK系统详细搭建过程
  19. 网站推广实战:100条不容错过的经验
  20. 禁用 MyBatis 一级缓存

热门文章

  1. RTL8762DK 点灯/LED(三)
  2. 四川中医药高等专科学校计算机,四川中医药高等专科学校2020年招生录取分数线...
  3. 国家项目答辩PPT注意事项
  4. Android RecyclerView 使用方法:垂直、横向、瀑布流
  5. python制作萝莉御姐语音包
  6. BMP085气压传感器驱动 MS5611经验
  7. 博弈心理学:拿来就用的超强操控术
  8. Aria2Android 免root,Linux Bash脚本:在本地机上部署用户自用aria2服务
  9. HCNP 学习 day1
  10. 物流看板、大数据驾驶舱、物流监控、运输跟踪、车辆运输管控、车辆管理、运单统计、商品流通数据库、配送费、发货件数、行驶耗油、违规管理、告警信息、车队统计、车辆信息查询、运输状态、运输数量、运输进度