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算法 引言 这个最短路问题可以说是图论当中的基础问题,不管你干什么只要涉及图论中的问题的话,最短路问题都是你不可避免的ÿ…...
【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类型,可以使用ODBC库和UNICODE编码函数。 首先,确保已安装SQL Server的ODBC驱动程序,并在项目中包含ODBC头文件<sql.h>和<sqlext.h>。 接下来,可以按照以下步骤进…...
WPF应用程序生存期以及相关事件
WPF 应用程序的生存期会通过 Application 引发的几个事件来加以标记,相关事件对应着应用程序何时启动、激活、停用和关闭。 应用程序生存期事件 • 独立应用程序(传统风格的 Windows 应用程序,这些应用程序作为要安装到客户端计算机并从客户端计算机运…...
【Git】任何位置查看git日志
需求 现需要查看指定项目中的某个文件的 Git 日志。如有 项目代码 jflowable ,需要查看其下文件 D:\z_workspace\jflowable\src\main\java\com\xzbd\jflowable\controller\TestController.java 的日志。 分析 一般的思路是,进入 jflowable 项目&#…...
Socket通讯使用的坑-消息合并发送-解决方法
关联文章 Socket通讯使用的坑-消息合并发送-CSDN博客 解决方法 /// <summary> /// 公共方法 /// </summary> public static class CommonMethods {/// <summary>/// 多个JSON对象字符串转成JSON字符串列表/// </summary>/// <param name"j…...
【Linux】基本指令
Hello everbody!这次咱们紧接着上一篇文章,继续介绍Linux操作系统的一些基本指令。这些指令是入门级别的,比较基础的。相当于windows中文件的复制,重命名,创建文件,创建目录之类的,还有如何在Linux中写c语言…...
JS中数组的相关方法介绍
push() 将一个或多个元素添加到数组的末尾,并返回新的长度。 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,arr 现在是 [1, …...
mybtis动态SQL注解 脚本动态SQL\方法中构建SQL\SQL语句构造器
mybtis动态SQL注解 动态SQL注解脚本动态SQL方法中构建SQLSQL语句构造器 动态SQL注解 分类: 脚本动态SQL:XML配置方式的动态SQL,是用<script>的方式把它照搬过来,用注解来实现。适用于xml配置转换到注解配置方法中构建SQL&…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...
ui框架-文件列表展示
ui框架-文件列表展示 介绍 UI框架的文件列表展示组件,可以展示文件夹,支持列表展示和图标展示模式。组件提供了丰富的功能和可配置选项,适用于文件管理、文件上传等场景。 功能特性 支持列表模式和网格模式的切换展示支持文件和文件夹的层…...
TJCTF 2025
还以为是天津的。这个比较容易,虽然绕了点弯,可还是把CP AK了,不过我会的别人也会,还是没啥名次。记录一下吧。 Crypto bacon-bits with open(flag.txt) as f: flag f.read().strip() with open(text.txt) as t: text t.read…...
字符串哈希+KMP
P10468 兔子与兔子 #include<bits/stdc.h> using namespace std; typedef unsigned long long ull; const int N 1000010; ull a[N], pw[N]; int n; ull gethash(int l, int r){return a[r] - a[l - 1] * pw[r - l 1]; } signed main(){ios::sync_with_stdio(false), …...
用 FFmpeg 实现 RTMP 推流直播
RTMP(Real-Time Messaging Protocol) 是直播行业中常用的传输协议。 一般来说,直播服务商会给你: ✅ 一个 RTMP 推流地址(你推视频上去) ✅ 一个 HLS 或 FLV 拉流地址(观众观看用)…...
