【mysql索引】之多列索引

2023-11-14

第零步:简单说一说

多列索引并不是指建立多个单列索引,而是指在多个字段建立一个索引。
在多个列上建立独立的单列索引大部分情况下并不能提高MySQL的查询性能,MySQL在5.0之后推出了索引合并策略(index merge),一定程度上可以使用多个单列索引来定位指定的行,但实际上更多时候说明了表上的索引建的很糟糕:
1.当数据库服务器对多个单列索引做相交操作(intersection,通常伴有多个AND条件)时,通常意味着需要一个包含多个相关列的多列索引,而不是多个单列索引。
2.当数据库服务器对多个单列索引做联合操作(union,通常伴有多个OR条件)时,需要消耗大量的CPU和内存在算法缓存、排序与合并上,特别在某些索引选择性不高、且需要合并扫描并返回大量数据的时候。

3.更重要的是,优化器不会把以上的计算成本加入到查询成本之中,优化器只关心随机页面读取,这会导致查询成本被低估。

第一步:选择合适的索引顺序

这里适用于B-Tree索引,因为哈希索引并不像B-Tree那样按顺序存储。
有一个经验法则:将选择性最高的列放到索引的最前列,这个法则通常情况下有用,但通常没有避免随机IO和排序那么重要。当不需考虑排序和分组时,这个法则通常是很好的,但还需要留意的是值的分布,拿sakila数据库里的payment表举例(关于选择性和sakila这里有上一篇的链接【mysql索引】之前缀索引),查询结果如图1:
SELECT
COUNT(DISTINCT staff_id)/COUNT(*) staff_id_selectivity,
COUNT(DISTINCT customer_id)/COUNT(*) customer_id_selectivity,
COUNT(*) total
FROM payment
图1:
可以看出customer_id的选择性更高,因此应该把customer_id作为多列索引的第一项,第二项是staff_id。

第二步:添加多列索引

执行下面语句即可:
ALTER TABLE payment ADD KEY `idx_customer_id_staff_id` (customer_id, staff_id);


最后需注意的一点:

上面的经验法则对于下面的情况,需要额外的处理:
如果某个条件值得基数过大,例如一个商城网站数据库里customer表里字段username为guest(游客)的数量太大,几乎占了整个表的9/10,那么如果用索引来查询username为guest的用户时,那个索引基本上是起不了作用的,这样有可能会极大损耗服务器的性能,解决方法是在代码层面上解决,如限制查询username值为guest的用户等。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【mysql索引】之多列索引 的相关文章

随机推荐

  • C语言:getchar( ) 函数详解

    文章目录 一 getchar 函数定义 二 函数返回值 三 注意区分 getchar 和 scanf 四 getchar 的使用实例 一 getchar 函数定义 getchar 字符输入函数 没有参数 从输入缓冲区里面读取一个字符 一次只
  • 解决EasyExcel导出文件LocalDateTime报错问题

    文章目录 问题引出 解决方案 自定义Converter 引用 LocalDateTimeConverter 搞定收工 问题引出 狗子我在参与一个项目的时候接触到数据表格导出为Excel表格的需求 但是在导出的时候会出现报错 Cannot f
  • 代码走查和代码审查_代码审查是个好主意的其他原因

    代码走查和代码审查 什么是代码审查 What are Code Reviews A Code Review is essentially what it sounds like a review of code before it is a
  • 虚拟机由于电脑未正常关机打不开问题-两种情况

    虚拟机由于电脑未正常关机打不开问题 我来总结我遇到的两种情况 文章目录 虚拟机由于电脑未正常关机打不开问题 第一种情况 报错 锁定文件失败 第二种情况 报错 指定的虚拟磁盘需要进行修复 第一种情况 报错 锁定文件失败 如果出现锁定文件失败
  • Unity自动创建脚本及预制体并绑定

    自己写了一套流程控制的框架 根据不同的状态执行不同的命令 每个状态判断和命令都是一个场景中的物体 不想每次重复同样的操作 创建脚本再创建预制体再绑定脚本 所以尝试写了一个自动创建脚本与预制体的工具 StateMachineEditorUti
  • 指针解析 (*&p和&*p)

    p指向a p的值是a的地址 的作用 定义 int p 定义一个int类型的指针变量 取地址对应的数据 p 获取 下的值 p的值 对应的值 即 0x1000 5 p和 p的区别 p p 获取p的地址 即0x1008 p 即 0x1008 获取
  • matlab MinGW-w64 C/C++ Compiler 的配置(附百度云下载资源)

    环境 win10 matlab r2019b 起因 安装某matlab工具包时需要使用命令 mex setup 弹出常见错误 即需要编译器 两种编译器的尝试 由于那道墙的存在 让试错成本变得如此巨大 首先 matlab推荐了两种编译器 1
  • 漏洞公布平台汇总

    https www cnvd org cn https www seebug org https fr 0day today https www exploit db com https packetstormsecurity com
  • LU分解(matlab实现)

    LU分解 LU Decomposition 是矩阵分解的一种 可以将一个矩阵分解为一个下三角矩阵和一个上三角矩阵的乘积 主要的算法思路是从下至上地对矩阵A做初等行变换 将对角线左下方的元素变成零 这些行变换的效果等同于左乘一系列单位下三角矩
  • 区块链GAMEFI游戏——NFT+DeFi+游戏

    GameFi指的是将去中心化金融产品以游戏的方式呈现 将DeFi的规则游戏化 将游戏道具产品NFT化 即GameFi NFT DeFi 游戏 DeFi是GameFi的内核 NFT是去中心化的必备手段 而游戏是GameFi的外壳 NFT De
  • 视频编码格式发展史

    1 编码标准之战 想预测未来 就回顾历史 先来看看H 264这些编码的从标准化到现在普及的过程 人们一直在想尽办法提高视频编码的效率 让它在尽可能小的体积内提供最好的画面质量 从而满足人们对于视频传输 存储的需求 长期以来 视频编码标准主要
  • MySQL标准差和方差函数使用

    一 方差 方差是在概率论和统计方差衡量随机变量或一组数据时离散程度的度量 概率论中方差用来度量随机变量和其数学期望 即均值 之间的偏离程度 统计中的方差 样本方差 是每个样本值与全体样本值的平均数之差的平方值的平均数 在许多实际问题中 研究
  • matlab求二元函数极值算法_[小白头秃]多元函数基本概念总结

    1 基本概念 点集 区间 领域 一维 直线 实数集 线段 端点 不含端点 二维 平面 实平面 平面区域 边界 不含边界 三维 空间 实空间 曲面 边界 体 表面 不含边界 表面 点和点集的关系 内点 外点 边界点
  • 四叉树初步研究

    JS 四叉树初步研究 四叉树 为何要叫四叉树 二叉树与八叉树又是生么东东 看样子理解起来比较困难 实现该如何入手 树 就是树的结构 树根 树干 树枝 树叶 还有好吃的果实 o 其实树这种结构 很常见的 JSON 不就是最普通的树吗 四叉树的
  • html js清除缓存,js清除浏览器缓存的几种方法

    JS 缓存的问题一直都是我们又爱又恨的东西 也是我们比较头痛的问题 一方面为了提高网站响应速度 减少服务器的负担 和节省带宽 将需要将静态资源缓存在客户端 但是另一方面 当js 文件有改动的时候 如何快速的将客户端缓存的js文件都失效 这是
  • win环境下emacs实现markdown的html预览

    1 参考文档 https libraries io github jrblevin markdown mode 2 实现的核心思想是用pandoc生成html进行markdown的预览 把pandoc exe直接放到emacs bin目录下
  • windows 虚拟机相关功能、组件梳理

    简介 英文名称 中文名称 说明 Container 容器 Guarded Host 受保护的主机 利用远程证明创建并运行受防护的虚拟机 Hyper V Hyper V Management Tools Hyper V 管理工具 包含 GUI
  • Java Stream 实用特性:排序、分组和 teeing

    排序 基本数据类型排序 基本数据类型就是字符串 整型 浮点型这些 也就是要排序的列表中的元素都是这些基本类型的 比如 List
  • C#__资源访问冲突和死锁问题

    线程的资源访问冲突 多个线程同时申请一个资源 造成读写错乱 解决方案 上锁 lock 执行的程序段 同一时刻 只允许一个线程访问该程序段 死锁问题 程序中的锁过多 某一线程需要多个锁资源 而某个资源被另一线程占用 另一个线程同样如此 谁也不
  • 【mysql索引】之多列索引

    第零步 简单说一说 多列索引并不是指建立多个单列索引 而是指在多个字段建立一个索引 在多个列上建立独立的单列索引大部分情况下并不能提高MySQL的查询性能 MySQL在5 0之后推出了索引合并策略 index merge 一定程度上可以使用