当前位置: 首页 > news >正文

MYSQL高性能索引

正确的选择和创建索引是实现高性能查询的基础,以下是高效使用索引的方法
演示的sql

独立的列

独立的列指的是索引既不是表达式的一部分也不是函数的参数。

mysql> select actor_id from actor where actor_id + 1 = 5;mysql> SELECT actor_id FROM actor WHERE CAST(actor_id AS CHAR) = '5';
前缀索引

如果索引是很长的列,那么索引会变得很大,并且导致索引数层数变高。通常可以索引的部分字符,这样可以节约索引空间。但是同时也要保证区分度。
区分度的计算这里以city表city字段为例

mysql> select count(distinct LEFT(city,3))/count(*) as e1, count(distinct LEFT(city,4))/count(*) as e2,  count(distinct LEFT(city,5))/count(*) as e3, count(distinct LEFT(city,6))/count(*) as e4, count(distinct LEFT(city,7))/count(*) as e5, count(distinct LEFT(city,8))/count(*) as e6 , count(distinct LEFT(city,9))/count(*) as e7 , count(distinct LEFT(city,10))/count(*) as e8 from city_demo ;
+--------+--------+--------+--------+--------+--------+--------+--------+
| e1     | e2     | e3     | e4     | e5     | e6     | e7     | e8     |
+--------+--------+--------+--------+--------+--------+--------+--------+
| 0.0236 | 0.0293 | 0.0305 | 0.0309 | 0.0310 | 0.0310 | 0.0310 | 0.0311 |
+--------+--------+--------+--------+--------+--------+--------+--------+

可以看到当字符长度是5或者6时,区分度已经不怎么增长了。
可以创建前缀索引

mysql> alter table city_demo add key (city(6));

前缀索引可以使得索引更小更快,但是他不可以做order by和group by。

多列索引

很多人对多列索引的理解不够,一种常见的是为每个列都创建索引,或者错误顺序创建索引。或者把where条件后面所有的列都创建索引。

在多个列上创建独立的单列索引大多数情况下不能提高MYSQL的查询性能。比如

mysql> select film_id,actor_id from film_actor where actor_id =1 or film_id =1;

在老的版本,这个查询会全表扫描,但是在新版本中会对这两个单列索引进行扫描,并将结果合并,索引合并策略是一种优化的结果。

mysql> explain select film_id,actor_id from film_actor where actor_id =1 or film_id =1 \G;
*************************** 1. row ***************************id: 1select_type: SIMPLEtable: film_actorpartitions: NULLtype: index_merge
possible_keys: PRIMARY,idx_fk_film_idkey: PRIMARY,idx_fk_film_idkey_len: 2,2ref: NULLrows: 29filtered: 100.00Extra: Using union(PRIMARY,idx_fk_film_id); Using where
1 row in set, 1 warning (0.00 sec)

基本等价于

mysql> select film_id,actor_id from film_actor where actor_id =1  union all select film_id,actor_id from film_actor where film_id =1 and actor_id != 1;
合适的索引顺序

索引列的顺序,意味这首先按照最左序列进行排序,其次是第二列,索引可以根据升序或者降序扫描,以满足order by,group by,distinct等子句的需求。

索引列的顺序问题,将选择性高区分度高的列放在最前面是有帮助的,但是排序以及避免随机IO的优先级更高,当不需要排序和分组时,选择性高的列放前面,举例说明。

mysql> select * from payment where staff_id=2 and customer_id=584;

联合索引的顺序取决于哪个区分度更高

mysql> select sum(staff_id=2),sum(customer_id=584) from payment \G
*************************** 1. row ***************************sum(staff_id=2): 7990
sum(customer_id=584): 30

这时是staff_id=2基数更大,应该把customer_id放到前面
以上是根据具体值的,对于全量数据来说

mysql> SELECT COUNT(DISTINCT staff_id)/count(*) as e1,count(distinct customer_id)/count(*) as e2 ,count(*) from payment \G
*************************** 1. row ***************************e1: 0.0001e2: 0.0373
count(*): 16044
1 row in set (0.00 sec)

全局来说customer_id区分度更高,作为索引列第一列。

聚簇索引

聚簇索引并不是一种索引类型,而是一种数据存储方式,在Innodb中保存了B-tree索引和数据行,叶子页包含行的全部数据,节点页只包含索引列,这个索引列就是主键列,如果没有创建主键,那么Innodb会隐式创建主键。

聚集数据的好处:

  • 这个索引列和行数据是紧凑存储在一起的,根据主键查找行数据时,可减少磁盘IO次数,
  • 使用覆盖索引可以直接使用叶节点的主键值
    聚集数据的缺点:
  • 按照顺序插入的,每次更新会导致其他行移动新的位置
  • 在移动过程中会导致页分裂,删除的时候会引起页的合并
覆盖索引

MYSQL可以使用索引来获取列的数据,这样就可不需要读取整行的数据了,如果索引的叶子节点已经包含要查询的数据了,那么就不需要回表查询,如果一个索引包含需要查询字段的值,那么就成为覆盖索引

相关文章:

MYSQL高性能索引

正确的选择和创建索引是实现高性能查询的基础,以下是高效使用索引的方法 演示的sql 独立的列 独立的列指的是索引既不是表达式的一部分也不是函数的参数。 mysql> select actor_id from actor where actor_id 1 5;mysql> SELECT actor_id FROM actor WHER…...

2024年华数杯国际赛A题赛题

问题A:来自日本的放射性废水 背景 2011年3月,日本东海岸发生的地震引发了福岛第一核电站的事故。一场大规模海啸摧毁了该核电站的冷却系统,导致三个核反应堆熔毁,核燃料碎片熔化。为了冷却熔化的核燃料,海水不断地注入…...

EMC整改

生产的工艺一致性,所使用元器件的一致性,实验室测试设备不确定度,传导骚扰的整改至少要有4dB的裕量;辐射骚扰的整改至少要有6dB的裕量。 电压波动和闪烁: 对一般开关电源来说很少出现电压波动和闪烁项目超标。若该项目出问题,很大…...

uniCloud ---- uni-captch实现图形验证码

目录 用途说明 组成部分 目录结构 原理时序 云端一体组件介绍 验证码配置(可选): 普通验证码组件 公共模块 云函数公用模块 项目实战 创建云函数 创建注册页 创建云函数 关联公用模块 uni-captcha 刷新验证码 自定义实现 验…...

LLaMa2 Chat gpt 大模型本地部署初体验

一直想在自己电脑或者测试环境随便找台服务器尝试部署一下“大模型”,但“大模型”对于内存和GPU的要求令人望而却步,层出不穷的各种术语也令人困惑,有点难以下手。 经过一段时间,在百度千帆大模型平台、讯飞星火大模型平台、魔搭…...

leetcode-344. 反转字符串、9. 回文数

题目1: 解题方法 直接用reverse()即可 代码: class Solution(object):def reverseString(self, s):""":type s: List[str]:rtype: None Do not return anything, modify s in-place instead."""return s.reverse()如果不…...

卖二手的教训:坏了要及时售后

自去年12月开始,把手头闲置或坏的电子产品(CPU风扇,充电宝,台灯等),统统卖掉了。每个还是赚钱了,不多,主要就是想卖掉,好的继续发挥余热,坏的有人修好利用。 …...

记录下载安装rabbitmq(Linux) 并整合springboot--详细版(全)

下载rabbitmq(Linux): erlang压缩包: https://share.weiyun.com/TGhfV8eZ rabbitMq-server压缩包: https://share.weiyun.com/ZXbUwWHD (因为RabbitMQ采用 Erlang 实现的工业级的消息队列(MQ)服务器&#…...

算法学习系列(二十二):最短路问题

目录 引言一、最短路问题二、朴素Dijkstra算法三、堆优化版的Dijkstra算法四、Bellman-Ford算法五、SPFA算法六、Floyd算法 引言 这个最短路问题可以说是图论当中的基础问题,不管你干什么只要涉及图论中的问题的话,最短路问题都是你不可避免的&#xff…...

【Spring Boot】SpringMVC入门

1.什么是springMVC MVC就是把一个项目分成了三部分: MVC是一种思想。Spring进行了实现,称为Spring MVC。SpringBoot是创建SpringMVC项目的一种方式而已。springMVC对于MVC做出了一些改变: 当前阶段,MVC的概念又发生了一些变化,后端开发人员不涉及前端页…...

itextpdf 之 html 转 pdf 问题处理

1. Font Provider contains zero fonts. At least one font shall be present 此问题出现的原因是 字体设置不成功,解决方法就是排查设置字体的代码。 需要特别注意的是项目打包后项目中所有文件层次会出现变动,使用何种方式获取字体文件会直接影响到字…...

关于tex中的表格设置

文章目录 控制表格列宽和行高控制表格列宽的同时实现居中tex中多表格排列单元格的合并与分割对单个单元格进行操作 控制表格列宽和行高 将下面的代码放在table环境内,放在tabular环境外 调整表格宽度和高度: \resizebox{\textwidth}{2cm}{%第一个{}是表…...

huggingface学习 | 云服务器使用git-lfs下载huggingface上的模型文件

文章目录 一、找到需要下载的huggingface文件二、准备工作(一)安装git-lfs(二) 配置git ssh 三、检查ssh连接huggingface是否成功 一、找到需要下载的huggingface文件 huggingface官网链接:https://huggingface.co/ 以…...

使用C++读取SQL Server数据库中的数据并转换为UNICODE类型

要使用C读取SQL Server数据库中的数据并转换为UNICODE类型&#xff0c;可以使用ODBC库和UNICODE编码函数。 首先&#xff0c;确保已安装SQL Server的ODBC驱动程序&#xff0c;并在项目中包含ODBC头文件<sql.h>和<sqlext.h>。 接下来&#xff0c;可以按照以下步骤进…...

WPF应用程序生存期以及相关事件

WPF 应用程序的生存期会通过 Application 引发的几个事件来加以标记&#xff0c;相关事件对应着应用程序何时启动、激活、停用和关闭。 应用程序生存期事件 • 独立应用程序(传统风格的 Windows 应用程序&#xff0c;这些应用程序作为要安装到客户端计算机并从客户端计算机运…...

【Git】任何位置查看git日志

需求 现需要查看指定项目中的某个文件的 Git 日志。如有 项目代码 jflowable &#xff0c;需要查看其下文件 D:\z_workspace\jflowable\src\main\java\com\xzbd\jflowable\controller\TestController.java 的日志。 分析 一般的思路是&#xff0c;进入 jflowable 项目&#…...

Socket通讯使用的坑-消息合并发送-解决方法

关联文章 Socket通讯使用的坑-消息合并发送-CSDN博客 解决方法 /// <summary> /// 公共方法 /// </summary> public static class CommonMethods {/// <summary>/// 多个JSON对象字符串转成JSON字符串列表/// </summary>/// <param name"j…...

【Linux】基本指令

Hello everbody!这次咱们紧接着上一篇文章&#xff0c;继续介绍Linux操作系统的一些基本指令。这些指令是入门级别的&#xff0c;比较基础的。相当于windows中文件的复制&#xff0c;重命名&#xff0c;创建文件&#xff0c;创建目录之类的&#xff0c;还有如何在Linux中写c语言…...

JS中数组的相关方法介绍

push() 将一个或多个元素添加到数组的末尾&#xff0c;并返回新的长度。 let arr [1, 2, 3]; arr.push(4); // arr 现在是 [1, 2, 3, 4] pop() 删除并返回数组的最后一个元素 let arr [1, 2, 3, 4]; let last arr.pop(); // last 现在是 4&#xff0c;arr 现在是 [1, …...

mybtis动态SQL注解 脚本动态SQL\方法中构建SQL\SQL语句构造器

mybtis动态SQL注解 动态SQL注解脚本动态SQL方法中构建SQLSQL语句构造器 动态SQL注解 分类&#xff1a; 脚本动态SQL&#xff1a;XML配置方式的动态SQL&#xff0c;是用<script>的方式把它照搬过来&#xff0c;用注解来实现。适用于xml配置转换到注解配置方法中构建SQL&…...

从一道SWPUCTF题复盘PHP文件包含漏洞:allow_url_include开启后,除了伪协议还能怎么玩?

从SWPUCTF赛题探索PHP文件包含漏洞的深层攻防 在CTF竞赛和实际渗透测试中&#xff0c;PHP文件包含漏洞一直是Web安全领域的重要课题。这道来自SWPUCTF新生赛的题目看似简单&#xff0c;却蕴含了丰富的攻防对抗思路。当allow_url_include配置被开启时&#xff0c;攻击面会显著扩…...

终极指南:3种方案快速突破城通网盘下载限制,实现全速免费下载

终极指南&#xff1a;3种方案快速突破城通网盘下载限制&#xff0c;实现全速免费下载 【免费下载链接】ctfileGet 获取城通网盘一次性直连地址 项目地址: https://gitcode.com/gh_mirrors/ct/ctfileGet 你是否曾为城通网盘缓慢的下载速度而烦恼&#xff1f;ctfileGet 是…...

AFM虚拟实验避坑指南:PID参数怎么调?相位图为何比形貌图更“敏感”?

AFM虚拟实验避坑指南&#xff1a;PID参数调节与相位图敏感性的深度解析 1. 从零开始理解AFM虚拟实验的核心逻辑 原子力显微镜&#xff08;AFM&#xff09;虚拟实验作为现代材料表征技术的重要教学工具&#xff0c;其核心价值在于让学习者无需接触昂贵设备就能掌握微观世界探测…...

三步搞定Windows和Office永久激活:KMS智能激活终极指南

三步搞定Windows和Office永久激活&#xff1a;KMS智能激活终极指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统频繁弹出激活提示而烦恼吗&#xff1f;Office文档突然变成只…...

大牛直播SDK(SmartMediaKit)Windows平台多路RTSP转RTMP推流集成说明

文档概述 在安防监控、智慧园区、应急指挥、工业视觉、低空经济、无人机回传和多路摄像头上云等场景中&#xff0c;现场设备通常以 RTSP 方式输出视频流&#xff0c;而云端平台、直播分发平台或业务中台往往更倾向于接收 RTMP 流。此时&#xff0c;系统需要在边缘侧或 Windows…...

终极指南:3步快速掌握Reloaded-II游戏Mod加载器

终极指南&#xff1a;3步快速掌握Reloaded-II游戏Mod加载器 【免费下载链接】Reloaded-II Universal .NET Core Powered Modding Framework for any Native Game X86, X64. 项目地址: https://gitcode.com/gh_mirrors/re/Reloaded-II Reloaded-II是一款基于.NET Core开发…...

RAID5故障抢救实战:从物理诊断到文件系统修复

1. 这不是数据丢失预警&#xff0c;而是RAID5信任危机的现场直播“硬盘灯全灭了&#xff0c;但系统还在跑——这比蓝屏更让人手抖。”这是我凌晨三点蹲在机房冷柜前的第一反应。当时负责维护的是一套运行了4年多的CentOS 7文件服务器&#xff0c;6块4TB企业级SATA盘组成的RAID5…...

RAID5瘫痪抢救实录:硬盘物理故障下的数据恢复实战

1. 这不是数据丢失预警&#xff0c;而是RAID5信任危机的现场直播“凌晨三点&#xff0c;监控告警邮件炸了——/dev/md0状态DEGRADED&#xff0c;紧接着是两块盘离线。”这是我上个月在值班日志里写下的第一行字。没有夸张&#xff0c;没有铺垫&#xff0c;就是这么一句干巴巴的…...

JMeter登录Cookie提取与传递全链路实战指南

1. 为什么“提取登录Cookie”是接口测试里最常卡壳的一步做JMeter接口测试的人&#xff0c;十有八九在登录环节栽过跟头——明明登录请求返回了200&#xff0c;Header里也明明白白写着Set-Cookie: JSESSIONIDabc123; Path/; HttpOnly&#xff0c;可后续所有带权限的接口全报401…...

AI驱动的JMeter脚本生成:基于OpenAPI契约与作用域约束的DSL构建

1. 这不是“AI写脚本”&#xff0c;而是把JMeter从“手绘电路图”升级成“EDA自动布线”你有没有在凌晨两点&#xff0c;对着Postman里复制粘贴的27个接口参数发呆&#xff1f;一边点开Swagger文档截图&#xff0c;一边在JMeter里手动拖拽HTTP请求、填Header、加JSON提取器、设…...