进阶功法:SQL 优化指南

news2024/11/28 3:36:52

目录标题

  • SQL 优化指南
    • 1. 插入数据优化
      • 1.1 批量插入数据
      • 1.2 手动提交事务
      • 1.3 主键顺序插入
      • 1.4 大批量插入数据
        • 步骤:
    • 2. 主键优化
      • 主键设计原则
      • 拓展知识
    • 3. ORDER BY 优化
      • 3.1 Using filesort
      • 3.2 Using index
        • 示例
      • 3.3 ORDER BY 优化原则
    • 4. GROUP BY 优化
        • 示例
      • 4.1 GROUP BY 优化原则
    • 5. LIMIT 优化
        • 示例
    • 6. COUNT 优化
      • 6.1 MyISAM
      • 6.2 InnoDB
      • 6.3 优化思路
      • 6.4 COUNT 的四种常见情况
      • 6.5 注意事项
    • 7. UPDATE 优化
        • 示例
      • 7.1 UPDATE 优化原则

SQL 优化指南

1. 插入数据优化

1.1 批量插入数据

在插入数据时,可以一次插入多条数据以进行 SQL 优化。通常建议一次插入 500 到 1000 条数据。

INSERT INTO tb_test VALUES (1, 'TOM'), (2, 'JERRY'), ...;

1.2 手动提交事务

SQL 在每条语句后都进行提交会影响整体性能。可以通过手动提交事务来减轻负担。

START TRANSACTION;

INSERT INTO tb_test VALUES (1, 'TOM'), (2, 'JERRY');
INSERT INTO tb_test VALUES (3, 'TaM'), (4, 'JyRRY');
INSERT INTO tb_test VALUES (5, 'TeM'), (6, 'JiRRY');

COMMIT;

1.3 主键顺序插入

主键的顺序插入会减轻 SQL 排序操作,直接插入加快速度。

示例:

  • 主键插入:1, 2, 3, 6, 9, 12, 40, 60…

1.4 大批量插入数据

如果一次性插入超大量数据,INSERT 语句的插入性能会很低。可以使用 LOAD DATA INFILE 方法插入数据。

步骤:
  1. 客户端连接服务端时,加上参数 --local-infile
    mysql --local-infile -u root -p
    
  2. 设置全局参数 local_infile 为 1,开启从本地加载文件导入数据的开关。
    SET GLOBAL local_infile = 1;
    
  3. 执行 LOAD DATA INFILE 指令将准备好的数据加载到表结构中。
    LOAD DATA LOCAL INFILE '/root/sql1.log' INTO TABLE tb_user FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';
    

2. 主键优化

在 InnoDB 存储引擎中,表数据都是根据主键顺序组织存放的,这种存储方式的表称为索引组织表。

主键设计原则

  1. 降低主键长度:满足业务需求的情况下,尽量降低主键的长度。
  2. 顺序插入:插入数据时,尽量选择顺序插入,使用 AUTO_INCREMENT 自增主键。
  3. 避免使用 UUID 或自然主键:如身份证号等。
  4. 避免修改主键:业务操作时,避免对主键的修改。

拓展知识

  • 页合并和页分裂

3. ORDER BY 优化

ORDER BY 排序具有两种排序方式:

3.1 Using filesort

通过表的索引或全表扫描,读取满足条件的数据行,然后在排序缓冲区 sortbuffer 中完成排序操作。所有不是通过索引直接返回排序结果的排序都叫 FileSort 排序。

3.2 Using index

通过有序索引顺序扫描直接返回有序数据,这种情况即为 using index,不需要额外排序,操作效率高。

示例
-- 使用 Using filesort
EXPLAIN SELECT id, age, phone FROM tb_user ORDER BY name;

-- 使用 Using index
CREATE INDEX idx_user_age_phone_aa ON tb_user(age, phone);

EXPLAIN SELECT id, age, phone FROM tb_user ORDER BY age, phone;
EXPLAIN SELECT id, age, phone FROM tb_user ORDER BY age DESC, phone DESC;

-- 创建混合排序索引
CREATE INDEX idx_user_age_phone_aa ON tb_user(age ASC, phone DESC);

EXPLAIN SELECT id, age, phone FROM tb_user ORDER BY age ASC, phone DESC;

3.3 ORDER BY 优化原则

  1. 建立合适的索引:根据排序字段建立合适的索引,多字段排序时,遵循最左前缀法则。
  2. 覆盖索引:尽量使用覆盖索引。
  3. 多字段排序:一个升序一个降序时,注意联合索引在创建时的规则(ASC/DESC)。
  4. 增大排序缓冲区:如果不可避免地出现 FileSort,大数据量排序时,可以适当增大排序缓冲区大小 sort_buffer_size(默认 256k)。

4. GROUP BY 优化

GROUP BY 优化同样借助索引进行优化。

示例
-- 效率较低
EXPLAIN SELECT profession, COUNT(*) FROM tb_user GROUP BY profession;

-- 建立索引后,效率提升
CREATE INDEX idx_user_pro_age_sta ON tb_user(profession, age, status);

EXPLAIN SELECT profession, COUNT(*) FROM tb_user GROUP BY profession;

4.1 GROUP BY 优化原则

  1. 通过索引提高效率:在分组操作时,可以通过索引来提高效率。
  2. 最左前缀法则:分组操作时,索引的使用也是满足最左前缀法则的。

5. LIMIT 优化

LIMIT 用于分页操作,当数据量较大时,需要进行优化。

示例
# 当我们希望获得第900000个数据后的十个数据,就需要完全获得前9000000个数据才可以,这会损耗许多时间

# 优化思路:
# 我们通过select只获得第9000000个后的十个数据的id
# 然后通过id对比来获得整行数据:

EXPLAIN SELECT * FROM tb_sku t, (SELECT id FROM tb_sku ORDER BY id LIMIT 900000, 10) a WHERE t.id = a.id;

6. COUNT 优化

不同存储引擎处理 COUNT 的方式不同:

6.1 MyISAM

直接把表的总行数存储在磁盘中,运行 COUNT(*) 时直接输出。

6.2 InnoDB

需要一行一行读取数据,进行累加。

6.3 优化思路

在添加数据和删除数据时,同时存储其数据数量。

6.4 COUNT 的四种常见情况

COUNT 用法含义
COUNT(主键)InnoDB 引擎会遍历整张表,把每一行的主键值都取出来,返回给服务层。服务层按行进行累加(主键不可能为 null)。
COUNT(字段)没有 NOT NULL 约束:InnoDB 引擎会遍历整张表,把每一行的字段值都取出来,返回给服务层,服务层判断是否为 null,不为 null 计数累加。
NOT NULL 约束:InnoDB 引擎会遍历整张表,把每一行的字段值都取出来,返回给服务层,直接按行进行累加。
COUNT(1)InnoDB 引擎遍历整张表,但不取值。服务层对于返回的每一行,放一个数字“1”进去,直接按行进行累加。
COUNT(*)InnoDB 引擎并不会把全部字段取出来,而是专门做了优化,不取值,服务层直接按行进行累加。

6.5 注意事项

  • COUNT(1)COUNT(*) 速度基本相近,均为最快速度。
  • 按照效率排序:COUNT(字段) < COUNT(主键 id) < COUNT(1) ≈ COUNT(*),所以尽量使用 COUNT(*)

7. UPDATE 优化

InnoDB 的行锁是针对索引加的锁,不是针对记录加的锁,并且该索引不能失效,否则会从行锁升级为表锁。

示例
-- 采用行锁
UPDATE course SET name = 'javaEE' WHERE id = 1;

-- 采用表锁
UPDATE course SET name = 'SpringBoot' WHERE name = 'PHP';

7.1 UPDATE 优化原则

  1. 使用索引:更新操作尽量采用索引进行改变,这样锁就会变成行锁,只控制这一行数据。
  2. 避免表锁:如果更新操作没有使用索引,那么会采用表锁,导致整个表的数据都无法改变,影响其他人同步修改该表。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们处理,核实后本网站将在24小时内删除侵权内容。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2201344.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

社工字典生成工具 —— CeWL 使用手册

GitHub - digininja/CeWL: CeWL is a Custom Word List GeneratorCeWL is a Custom Word List Generator. Contribute to digininja/CeWL development by creating an account on GitHub.https://github.com/digininja/CeWL/ 0x01&#xff1a;CeWL 简介 CeWL&#xff08;Cust…

[YM]模板-归并排序

概念&#xff1a; 归并排序&#xff0c;其实是一种分治和递归算法 将大问题转化为一个个小问题处理&#xff0c;最终整合成一个大问题 模板&#xff1a; const int N 2e5 5; int a[N],b[N],n;void mergeSort(int l, int r){if(l>r) return;int mid(lr)>>1; merge…

Vue 响应式的本质

在 Vue 开发中&#xff0c;最容易出问题的地方往往是对 Vue 响应式系统的误解。 响应式的核心不在于“数据一变&#xff0c;页面就刷新”&#xff0c;这是表象。真正的本质是数据和函数的关联。 当数据与函数关联后&#xff0c;数据的变化会触发相应函数的重新运行。这里要明…

【深度学习基础模型】玻尔兹曼机BM|受限玻尔兹曼机RBM|深度置信网络DBN详细理解并附实现代码。

【深度学习基础模型】玻尔兹曼机Boltzmann machines (BM)|受限玻尔兹曼机Restricted Boltzmann machines (RBM)|深度置信网络Deep belief networks (DBN)详细理解并附实现代码。 【深度学习基础模型】玻尔兹曼机Boltzmann machines (BM)|受限玻尔兹曼机Restricted Boltzmann m…

65 切面AOP

65 切面AOP 切面基础概念 AOP&#xff1a;Aspect Oriented Programming&#xff0c;面向切面编程。是通过预编译方式&#xff08;aspectj&#xff09;或者运行期动态代理&#xff08;Spring&#xff09;实现程序功能的统一维护的技术。 面试问题&#xff1a; Spring的两大核心…

上市公司企业平台生态嵌入数据(2001-2023年)

一、资料名称&#xff1a;2023-2001年上市公司企业平台生态嵌入数据 二、测算方式&#xff1a;参考C刊《管理学刊》陈南旭&#xff08;2024&#xff09;老师的做法&#xff0c;从上市公司年报中爬取“平台生态嵌入”的有关词频来衡量其嵌入程度具有可行性与科学性。 为更好地…

dfs +剪枝sudoku———poj2676

目录 前言 lowbit函数 数独 suduku 问题描述 输入 输出 问题分析 子网格位置 优化搜索顺序剪枝1 优化搜索顺序剪枝2 可行性剪枝 代码 前言 lowbit函数 这是一个利用二进制位运算取出二进制数最后一位’1‘的函数 数独 数独大家肯定都玩过&#xff0c;…

26届日常实习 momenta一面(牛客)

26届日常实习 momenta一面 八股问答sql 40min java的集合&#xff1a;list map set底层数据结构&#xff0c;特性&#xff0c;线程安全 get post区别 mysql跟redis以外你还知道哪些数据库&#xff1a;回答了大二参加大数据竞赛用的hive hbase 你觉得hbase链式存储的优势是什么…

与鸿蒙同行,Java Solon v3.0 正式发布(向下兼容)

与 HarmonyOS NEXT 10月8日公测同行。Solon &#xff08;开放原子开源基金会&#xff0c;孵化项目&#xff09; v3.0 正式发布&#xff0c; 且将在 2025 年启动华为编程语言 “仓颉” 版开发&#xff08;届时会有 Solon-Java 和 Solon-CJ 两大版本&#xff09;。本次大版本更新…

离散数学概述

离散数学概述 离散数学&#xff08;Discrete Mathematics&#xff09;是计算机科学、信息科学、数学等领域的基础学科之一。与连续数学&#xff08;如微积分&#xff09;不同&#xff0c;离散数学主要研究离散对象&#xff0c;如整数、图、逻辑公式等。在大学的课程中&#xf…

大学的离散数学:探索数学的逻辑之美

大学的离散数学&#xff1a;探索数学的逻辑之美 离散数学&#xff0c;作为数学的一个分支&#xff0c;它研究的是离散而非连续的对象。在大学课程中&#xff0c;离散数学是计算机科学、信息科学、电子工程等专业的重要基础课程。它不仅为学生提供了必要的数学工具&#xff0c;…

qt打包程序后运行提示缺少dll文件(使用官方打包程序)

qt打包程序后运行提示缺少dll文件(使用官方打包程序) 当使用Qt完成程序打包后&#xff0c;把程序生成的文件全部复制到另外的一台没有Qt开发环境的电脑上&#xff0c;双击运行.exe可执行程序&#xff0c;提示缺少一系列的.dll程序。 提示找不到 libstdc-6.dll libwinpthread-1…

算法.图论-bfs及其拓展

文章目录 广度优先搜索简介经典bfs习题地图分析贴纸拼词 01bfs解析基本过程相关习题 广度优先搜索简介 bfs的特点是逐层扩散, 从源头到目标点扩散了几层, 最短路就是多少 bfs的使用特征是任意两个节点的距离(权值)是相同的(无向图, 矩阵天然满足这一特点) bfs开始的时候可以是…

高性能缓存方案 —— Caffeine

一、简介 Caffeine是一个高性能的Java缓存库&#xff0c;它提供了本地缓存的功能。 Caffeine和Redis都是内存级别的缓存&#xff0c;为什么要使用在这两缓存作为二级缓存&#xff0c;它们两有什么区别呢? 虽然它们都是内存级别的缓存&#xff0c;但是Redis是需要单独部署的&…

DAY42WEB 攻防-PHP 应用MYSQL 架构SQL 注入跨库查询文件读写权限操作

一、PHP-MYSQL-SQL注入-常规查询 1.PHP-MYSQL-Web组成架构 MySQL(统一管理) ​ root&#xff08;自带默认&#xff09; ​ 网站A testA ​ 网站B testB MySQL(一对一管理) ​ testA用户 ​ 网站A testA ​ testB用户 ​ 网站B testB access无数据库用户 mysql里面有内置的管理…

使用 Stata 调用本地部署的大语言模型进行文本主要内容提取——历年政府工作报告中的经济增长目标提取

因此今天给大家分享一个新的方法。也就是通过部署在本地的大模型进行文本内容提取。 安装 Ollama 通过 Ollama 可以快速在本地部署一些常用的大模型。可以根据自己的系统从这里安装下载&#xff1a;https://github.com/ollama/ollama MacOS 下载 Ollama 链接: https://ollama…

计算机的错误计算(一百一十八)

摘要 探讨一个不动点的计算精度问题。 不动点是一类特殊的循环迭代。它有形式 例1. 已知迭代[1] 计算 显然&#xff0c;每个 均为 0.5 . 不妨在Visual Studio 2010 下用下列C语言代码计算&#xff1a; #include <stdio.h> #include <math.h>int main() {do…

Mac上功能全面,免费好用的解压缩工具

在日常使用Mac的过程中&#xff0c;相信不少朋友都有解压缩需求&#xff0c;目前存在的解压缩软件可以说各种各样&#xff0c;但是有的收费&#xff0c;有的解压速度慢&#xff0c;有的解压类型不全&#xff0c;各有优缺点&#xff0c;挑选起来眼花缭乱&#xff0c;挑来挑去也没…

西安凭借入驻企业展示科技“硬”实力的数字媒体产业园

在古城西安的怀抱中&#xff0c;一座以科技“硬”实力为核心竞争力的数字媒体产业园——西安国际数字影像产业园&#xff0c;正以其独特的魅力和无限的潜力&#xff0c;吸引着全球的目光。这里&#xff0c;不仅是数字创意的孵化场&#xff0c;更是科技创新的策源地。 西安国际数…

STM32 HAL库

1. 相关概念 1.1. 回调函数 Callback()回调函数与普通函数的本质区别在于调用者不同&#xff1a;普通函数由用户代码调用&#xff0c;而回调函数则是由系统在适当的条件下调用。回调函数用于对各种事件的响应和处理&#xff0c;如当指定的EXTI线上发生中断或事件时&#xff0…