首页 > 数据库 >MYSQL----------------sql 优化

MYSQL----------------sql 优化

时间:2025-01-12 23:57:56浏览次数:3  
标签:---------------- name SQL 查询 索引 sql MYSQL table 优化

优化 SQL 语句的一般步骤

1. 了解 SQL 的执行频率
SHOW STATUS LIKE 'Com_%';

代码解释

  • SHOW STATUS LIKE 'Com_%';:此命令可以查看各种 SQL 语句的执行频率,例如 Com_select 表示 SELECT 语句的执行次数,Com_insert 表示 INSERT 语句的执行次数等。通过查看这些信息,可以大致了解哪些类型的 SQL 语句被频繁执行,为后续的优化提供方向。
2. 定位执行效率较低的 SQL 语句
  • 通常可以通过慢查询日志来定位执行时间较长的 SQL 语句。在 MySQL 的配置文件中设置 slow_query_log = 1long_query_time(例如 long_query_time = 2,表示执行时间超过 2 秒的查询会被记录),然后查看慢查询日志文件。
3. 通过 EXPLAIN 分析 SQL 的执行计划
EXPLAIN SELECT * FROM table_name WHERE column = 'value';

代码解释

  • EXPLAIN 关键字用于查看 SQL 语句的执行计划,它会输出一系列信息,包括:
    • id:查询的序列号。
    • select_type:查询类型,如 SIMPLEPRIMARYSUBQUERY 等。
    • table:涉及的表名。
    • type:连接类型,从最优到最差依次为 systemconsteq_refrefrangeindexALL
    • possible_keys:可能使用的索引。
    • key:实际使用的索引。
    • rows:估计要扫描的行数。
    • Extra:额外信息,如 Using where 表示使用了 WHERE 子句进行筛选,Using index 表示使用了覆盖索引等。

索引问题

索引的存储分类
  • B-Tree 索引

    • 最常见的索引类型,适用于范围查询、排序和精确匹配。
    • 存储结构是一种平衡多叉树,数据按顺序存储,叶子节点存储实际的数据或指向数据的指针。
  • Hash 索引

    • 适用于精确的等值查询,通过哈希函数将键值映射到存储位置。
    • 不支持范围查询和排序操作。
MySQL 如何使用索引
  • MySQL 会根据查询条件、表结构和索引情况自动选择使用索引。例如,在 SELECT * FROM table WHERE column = 'value'; 中,如果 column 上有索引,MySQL 可能会使用该索引进行查找。

在这里插入图片描述

查看索引的使用情况
SHOW INDEX FROM table_name;

代码解释

  • SHOW INDEX FROM table_name;:该命令可以查看表 table_name 的索引信息,包括索引名称、列名、索引类型等,有助于检查索引的使用情况。

两个简单实用的优化方法

定期分析表和检查表
ANALYZE TABLE table_name;
CHECK TABLE table_name;

代码解释

  • ANALYZE TABLE table_name;:更新表的统计信息,帮助优化器更好地选择执行计划。
  • CHECK TABLE table_name;:检查表的完整性,发现和修复可能的问题。
定期优化表
OPTIMIZE TABLE table_name;

代码解释

  • OPTIMIZE TABLE table_name;:对表进行碎片整理和空间回收,对于经常更新、删除的表很有用。

常用 SQL 的优化

大批量插入数据
INSERT INTO table_name (column1, column2) VALUES (value1, value2), (value3, value4),...;

代码解释

  • 一次插入多行数据可以减少通信开销,提高插入效率,而不是多次执行单行插入。
优化 INSERT 语句
  • 尽量减少不必要的索引,因为插入数据时需要更新索引,过多的索引会影响插入性能。
优化 GROUP BY 语句
  • 确保 GROUP BY 子句中的列有索引,避免使用 GROUP BY 进行排序时产生临时表。
优化 ORDER BY 语句
  • 尽量在 ORDER BY 列上创建索引,使排序操作更高效。
优化嵌套查询
  • 尽量将嵌套查询转换为连接查询,因为连接查询通常比嵌套查询性能更好。
MySQL 如何优化 OR 条件
  • 对于 WHERE column1 = 'value1' OR column2 = 'value2' 这样的语句,如果 column1column2 上都有索引,MySQL 可能无法同时使用两个索引。可以考虑使用 UNION 来改写,例如:
(SELECT * FROM table WHERE column1 = 'value1') UNION (SELECT * FROM table WHERE column2 = 'value2');
使用 SQL 提示
  • 可以使用 USE INDEXFORCE INDEX 等 SQL 提示强制使用某个索引或避免使用某个索引,例如:
SELECT * FROM table USE INDEX (index_name) WHERE column = 'value';

小结

  • 优化步骤

    • 首先通过 SHOW STATUS 了解 SQL 语句的执行频率,定位慢查询,再使用 EXPLAIN 分析执行计划。
    • 根据 EXPLAIN 的结果确定问题,如是否使用了合适的索引,是否产生了额外的临时表等。
  • 索引方面

    • 了解 B-Tree 和 Hash 索引的特点和适用场景,合理创建和使用索引,通过 SHOW INDEX 查看索引使用情况。
  • 实用优化方法

    • 定期进行 ANALYZE TABLECHECK TABLEOPTIMIZE TABLE 操作,维护表的性能。
  • 具体 SQL 优化

    • 对于大批量插入使用多行插入语句,优化 INSERTGROUP BYORDER BY 语句,尽量将嵌套查询转换为连接查询,优化 OR 条件,使用 SQL 提示辅助优化。

在实际的 SQL
优化过程中,需要综合考虑各种因素,根据具体的查询和表结构,灵活运用上述优化方法,以提高数据库的性能。同时,要注意优化过程中可能带来的其他问题,如索引过多会影响数据更新性能,过度优化可能导致维护成本增加等。通过不断的实践和经验积累,可以更好地掌握
SQL 优化的技巧。

标签:----------------,name,SQL,查询,索引,sql,MYSQL,table,优化
From: https://blog.csdn.net/yuanbenshidiaos/article/details/144965890

相关文章

  • MYSQL--------SQL 注入简介&&MySQL SQL Mode 简介
    SQL注入简介定义:SQL注入是一种常见的安全漏洞,攻击者通过在输入中插入恶意的SQL语句,利用应用程序中未正确处理的输入数据,来改变SQL查询的逻辑,从而执行非预期的操作,如绕过身份验证、获取未授权数据、修改或删除数据等。示例:--正常的登录查询SELECT*FROMusersWHE......
  • ABC388DEG 题解
    ABC388题解ABCDE+G,rk371。D观察到几个性质:一个人只会在成年的时候得到石头,在成年之后给出石头。第\(i\)个人成年之后,他要给之后的每个人一个石头(除非用光了)。也就是说,假设成年时它的石头数量为\(B_i\),则最终他的石头数量为\(\max(0,B_i-(n-i))\)。因此我们只需......
  • LeetCode 2275: 按位与结果大于零的最长组合题解
    LeetCode2275:按位与结果大于零的最长组合题解1.题目分析这道题目考察了位运算的基本概念和应用。我们需要在给定的数组中找出最长的子序列,使得这些数字进行按位与运算后的结果大于0。1.1关键概念按位与运算(&)两个二进制位都为1时,结果为1。只要有一个为0,结果就为0......
  • 深入浅出 SSL/CA 证书及其相关证书文件
    一种是Base64(ASCII)编码的文本格式。这种证书文件是可以通过文本编辑器打开,甚至进行编辑,常见有PEM证书格式,扩展名包括PEM、CRT和KEY。另外一种是Binary二进制文件。常见有DER证书格式,扩展名包括DER和CER。Linux系统使用CRT,Windows系统使用CER。名词含......
  • Hugo|30分钟搭建完整的个人博客
    本文将讲述如何使用Hugo,从0到1完成一个“静态博客”的搭建。展示hugo可以通过简单配置,自定义装饰博客界面的能力,并集成网站数据统计能力。下一篇文章将教会你将站点免费部署至GitHubPages或者Cloudflare。......
  • Qwen2ForSequenceClassification文本分类实战和经验分享
    本文主要使用Qwen2ForSequenceClassification实现文本分类任务。文章首发于我的知乎:https://zhuanlan.zhihu.com/p/17468021019一、实验结果和结论这几个月,在大模型分类场景做了很多实验,攒了一点小小经验。1、短文本1)query情感分类,一般不如BERTps:结论和,https://segmentfault......
  • Ubuntu22.04 解决 E: 无法定位软件包 yum
    1、修改sudovim/etc/apt/sources.list的内容,将下文内容增加至该文件中:debhttp://archive.ubuntu.com/ubuntu/trustymainuniverserestrictedmultiverse#默认注释了源码镜像以提高aptupdate速度,如有需要可自行取消注释debhttps://mirrors.tuna.tsinghua.edu.cn/ubu......
  • 12.矩阵的秩及相关性质
    12.矩阵的秩及相关性质12.1k阶子式12.1.1k阶子式示例设存在以下矩阵:\[X_{mn}=\begin{bmatrix}x_{11}&x_{12}&x_{13}&...&x_{1n}\\x_{21}&x_{22}&x_{23}&...&x_{2n}\\x_{31}&x_{32}&x_{33}&...&x_{3n}\\&......
  • 安装Unitree_sdk2
        unitree@ubuntu:~$unitree@ubuntu:~$unitree@ubuntu:~$unitree@ubuntu:~$unitree@ubuntu:~$unitree@ubuntu:~$unitree@ubuntu:~$unitree@ubuntu:~$unitree@ubuntu:~$cd/unitree/lib/unitree_slamunitree@ubuntu:/unitree/lib/unitree_slam$unit......
  • 【安全运营】第6年实践总结
    一、安全运营全景图安全运营全景图调整的原因:一是公司在文化、部门、人员方面调整,导致有些部分不再适用;二是2024年针对安全运营规划开会讨论过多次,部分逻辑和内容有变化;三是安全运营工作范围有变化,需要进行合并、增加;四是经过2024年的实践,个人的观点有变化,需要更新。调整后的安......