【金三银四】Mysgl优化了解?什么情况下会导致SQL索引失效?如何写出高效SQL与优化慢SQL

Mysgl优化

MySQL 优化是指对 MySQL 数据库的配置、表设计、查询语句等进行针对性的优化,以提高数据库的性能和效率。这包括但不限于合理设计数据库表结构、编写高效的 SQL 查询语句、创建合适的索引以及调整数据库服务器的参数等。

当MySQL单表记录数过大时,性能下降是一个常见问题。这是因为随着数据量的增加,数据库在执行增删改查操作时需要处理更多的数据。

当涉及到 MySQL 数据库优化时,可以从以下几个方面进行详细讨论:

一、单表优化:

  1. 字段优化

    • 选择合适的数据类型以减少存储空间和提高查询效率。
    • 使用 TINYINT、SMALLINT、MEDIUM_INT 代替 INT,非负数加 UNSIGNED。
    • VARCHAR 长度根据实际需要分配。
    • 首选 TIMESTAMP 而非 DATETIME。
    • 单表字段不超过 20 个。
    • 尽量使用NOT NULL约束,避免NULL带来的额外开销。
    • 枚举(ENUM)或整数(INT)比字符串(VARCHAR)更高效,特别是有大量重复值时。
    • 使用整数存储IP地址以提高查询效率。
  2. 索引优化

    • 根据查询模式创建索引,重点关注WHERE和ORDER BY中的列,可根据EXPLAIN命令来查看是否用了索引还是全表扫描。
    • 避免在 WHERE 子句中对字段进行 NULL 值判断,否则将导致引擎放弃使用索引而进行全表扫描。
    • 稀少值的字段不适合建索引,如性别。
    • 避免使用外键和 UNIQUE 约束。
    • 对字符字段可以考虑创建前缀索引以减少索引大小。
    • 避免对索引列进行运算,以免引起索引失效。
  3. 查询SQL优化

    • 开启慢查询日志以定位性能瓶颈。
    • 避免列运算,尽量简化 SQL。
    • 不使用 SELECT *。
    • 将 OR 改写成 IN。
    • 避免函数和触发器,推迟至应用程序层实现。
    • 少用 JOIN,使用同类型比较。
    • 使用索引避免全表扫描,提高查询效率。
    • 使用LIMIT进行分页查询,避免一次性获取大量数据。
    • 尽量避免在WHERE子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
  4. 存储引擎选择

    • MyISAM适用于读多写少的场景,提供全文索引和压缩表功能。
    • InnoDB适用于写多读少的场景,支持事务、行锁和外键,提供更高的并发处理能力和数据保护。
      当然可以,以下是一个简单的表格,列出了MyISAM和InnoDB存储引擎的特点:
特点MyISAMInnoDB
读写特性读多写少写多读少
事务支持不支持支持
锁定方式表级锁定行级锁定
外键支持不支持支持
全文索引支持不支持
压缩表支持不支持
并发处理较差较好
数据保护不提供数据保护机制提供数据保护机制

总体来讲,MyISAM适合SELECT密集型的表,而InnoDB适合INSERT和UPDATE密集型的表。
希望这个表格能够清晰地展示出MyISAM和InnoDB存储引擎的特点。

  1. 系统调优参数

sysbench:一个模块化,跨平台以及多线程的性能测试工具。

https://github.com/akopytov/sysbench

iibench-mysql:基于Java的MySQL / Percona / MariaDB 索引进行插入性能测试工具。

https://github.com/tmcallaghan/iibench-mysql

tpcc-mysql:Percona开发的TPC-C测试工具。

https://github.com/Percona-Lab/tpcc-mysql
在优化数据库时,建议定期监控性能并评估优化效果。在进行大规模优化前,应在测试环境中验证,确保安全有效。

二、读写分离:

通过将读操作和写操作分开到不同的数据库服务器上,提高系统的并发处理能力和读取性能。写操作集中在主库上,读操作则可以分摊到多个从库上,有效减轻主库的压力。

读写分离是一种数据库优化策略,通过将数据库的读操作和写操作分别分配到不同的数据库服务器上,以提高系统的并发处理能力和读取性能。在这种策略下,写操作集中在主数据库服务器上,而读操作则可以分摊到多个从数据库服务器上。这样做的好处是可以有效减轻主库的压力,提高系统的吞吐量。

读写分离的关键在于使用数据库代理程序,如MySQL Proxy、MyCAT,这些代理程序充当了数据库服务器和应用程序之间的中介。读操作可以通过代理程序进行缓存,而写操作则被转发到主数据库服务器进行实际的数据存储。这种分离使得读操作可以轻松地从缓存中获得高性能,而写操作则可以确保数据的一致性和完整性。

除了提高性能外,读写分离还可以帮助组织实现高可用性。通过将读和写操作分离到不同的服务器上,组织可以在不影响读操作的情况下进行数据库的维护和升级。这使得组织能够更轻松地保持系统的正常运行,并减少停机时间。

需要注意的是,读写分离并不总是适用于所有情况。在某些情况下,这种分离可能会导致数据不一致。例如,如果两个用户同时进行读操作,可能会读到旧的数据。因此,在实现读写分离时,需要采取一定的措施来保证数据的一致性。

三、缓存:

利用缓存技术(如 Memcached、Redis 等)缓存热点数据,减少对数据库的频繁访问,提高访问速度和并发能力。
缓存技术是提高系统性能的关键手段之一,它通过存储频繁访问的数据或结果,从而减少对数据库或其他数据源的直接访问,加快数据检索速度,并提高系统的并发处理能力。

常用的缓存技术包括Memcached和Redis。Memcached是一个高性能、分布式内存对象缓存系统,主要用于缓存数据库中的对象,以减少数据库的访问次数。而Redis是一个开源的、支持网络、可基于内存也可以持久化的日志型、Key-Value数据库,并提供多种类型的数据结构来适应不同场景下的缓存需求。

在实现缓存时,需要关注以下几个关键点:

  1. 缓存命中率:缓存命中率是衡量缓存效果的重要指标,高命中率意味着更多的请求可以直接从缓存中获取,减少了对后端数据库的访问。
  2. 缓存更新策略:包括过期时间、懒加载和主动更新等,选择合适的更新策略可以确保缓存数据的及时性和有效性。
  3. 缓存穿透:为了避免缓存未命中时对数据库的巨大压力,需要采取措施如缓存空值或布隆过滤器等来防止缓存穿透。
  4. 缓存雪崩:在缓存失效时,大量请求直接打在数据库上,可能导致系统瘫痪。可以通过设置不同的过期时间、限流、增加缓存实例等方式来避免缓存雪崩。
  5. 缓存预热:在系统启动或缓存数据初始化时,提前将热点数据加载到缓存中,以避免系统上线初期大量请求直接访问数据库。
  6. 缓存粒度:根据业务需求,选择合适的缓存粒度,如数据行、数据页或数据块,以平衡缓存效率和内存利用率。

通过合理使用缓存技术,可以有效降低系统响应时间,提高系统的并发处理能力,从而改善用户体验。

四、表分区:

将大表按照一定的规则分割成小的分区,可以加速查询和提高性能。常见的分区方式有范围分区、哈希分区、列表分区等。

五、垂直拆分:

将原本一个大表按列拆分成多个表,每个表包含部分列,可以提高查询效率,降低数据冗余。

六、水平拆分:

将原本一个大表按行拆分成多个表,每个表包含部分行数据,可以分散数据存储,提高并发能力和负载均衡。

七、水平拆分跟垂直拆分的区别

水平拆分和垂直拆分是在数据库设计和优化中常用的两种数据分割策略。它们的区别在于数据如何被拆分和存储。

  1. 水平拆分(Horizontal Sharding):

    • 水平拆分是指将数据按照某种规则(比如按照用户ID、时间范围等)分割成多个部分,然后分别存储到不同的数据库节点或表中。
    • 这种方式适合于需要横向扩展的场景,可以更好地应对数据量大、并发读写压力大的情况。
    • 例子:将全国用户的数据按照地理位置分割存储到不同的数据库节点上。
  2. 垂直拆分(Vertical Partitioning):

    • 垂直拆分是指将数据表按照字段的关系和访问模式进行拆分,将不同的字段分别存储到不同的表或数据库中。
    • 这种方式适合于减少单个表的宽度,提高数据读取效率,同时可以根据不同的业务需求将数据存储到不同的物理存储介质上。
    • 例子:将包含大量稀疏字段的表进行拆分,将常用的字段存储到主表,将稀疏字段存储到关联表中。

总的来说,水平拆分注重的是数据的分布和扩展能力,而垂直拆分注重的是数据的结构和访问模式。在实际应用中,通常会综合考虑两种拆分方式,根据具体的业务需求和系统特点来选择最合适的拆分策略。

综合来看,MySQL 数据库优化是一个综合性的工作,需要结合具体业务场景和需求,从表结构设计、索引优化、查询语句编写、缓存应用、分区与拆分等多个方面综合考虑,以提高数据库性能和系统稳定性。

什么情况下会导致SQL索引失效?

SQL索引失效的情况包括:

  1. 使用OR条件:当查询条件中包含OR时,即使部分条件涉及索引列,也可能导致索引失效。
SELECT * FROM users WHERE age = 30 OR name = 'Alice';
  1. 类型转换:对索引列进行类型转换,如使用函数,可能导致索引失效。
SELECT * FROM users WHERE UPPER(name) = 'ALICE';
  1. 范围条件右侧列:在复合索引中,范围条件(如>、<、BETWEEN等)右侧的列无法使用索引。
SELECT * FROM users WHERE age > 25 AND name = 'Alice';
  1. 不等于条件:使用!=或<>会导致索引失效。
SELECT * FROM users WHERE age != 25;
  1. IS NULL/IS NOT NULL:这些条件会导致索引失效。
SELECT * FROM users WHERE name IS NULL;
  1. LIKE通配符开头:如果LIKE查询以通配符%开头,会导致索引失效。
SELECT * FROM users WHERE name LIKE '%Alice';
  1. 字符串未加引号:字符串类型字段未加单引号可能导致索引失效。
SELECT * FROM users WHERE name = Alice;
  1. 索引列上计算:在索引列上进行计算或其他操作,会导致索引失效。
SELECT * FROM users WHERE age + 10 = 30;
  1. 最佳左前缀法则:在复合索引中,必须从最左边的列开始查询,并且不能跳过中间列。
SELECT * FROM users WHERE name = 'Alice' AND age = 25;
  1. 存储引擎限制:某些存储引擎对索引的使用有限制。
  2. 优化器选择:优化器可能根据成本考虑不使用索引。
  3. 数据分布不均:索引列数据分布不均,可能导致索引失效。
  4. 表数据量小:对于小表,全表扫描可能比索引更快。
  5. 查询条件覆盖索引:尽量使用覆盖索引,避免回表查询。

如何使用EXPLAIN查看SQL有没有走索引

要使用EXPLAIN来查看SQL语句是否使用了索引,可以按照以下步骤进行:

  1. 在待查询的SQL语句前加上EXPLAIN关键字,例如:

    EXPLAIN SELECT * FROM table_name WHERE column_name = 'value';
    
  2. 执行该带有EXPLAIN关键字的SQL语句,数据库系统将返回一个结果集,其中包含了查询的执行计划。

  3. 查看执行计划中的type列,该列表示查询使用了哪种类型的访问方法:

    • 如果type列显示为index,表示查询使用了索引。
    • 如果type列显示为range,表示查询使用了范围索引。
    • 如果type列显示为ALL,表示查询进行了全表扫描,没有使用索引。
  4. 可以查看key列,该列表示查询实际使用的索引名称。

  5. 如果查询涉及多个表,还可以查看possible_keys列,表示查询可能使用的索引列表。

  6. 最后,查看rows列,表示查询预计需要检查的行数,行数越少表示查询效率可能越高。

通过分析EXPLAIN的结果,可以判断SQL语句是否使用了索引,以及索引的使用是否合理。如果查询未使用索引或使用了不合适的索引,可以考虑修改查询语句或创建更合适的索引以提高查询性能。

下面是一个表格格式的展示,包含了在使用EXPLAIN命令时通常可以查看的参数:

参数说明
id每个查询的序号,如果有子查询则会有多行记录,父查询的id值会与子查询相关联
select_type查询的类型,如SIMPLE(简单查询)、PRIMARY(主查询)、SUBQUERY(子查询)等
table正在访问的表
partitions匹配的分区信息
type连接类型,包括system、const、eq_ref、ref、range、index等
possible_keys可能应用在表中的索引,但不一定被查询使用
key实际使用的索引
key_len索引字段的长度
ref使用的索引的哪一列,通常是常数或字段
rows数据库系统认为必须检查的行数
filtered表的过滤行百分比
Extra提供关于执行查询的额外信息,如Using index、Using temporary、Using filesort等

如何写出高效SQL与优化慢SQL

要编写高效的 SQL 并优化慢 SQL,可以遵循以下一些建议:

编写高效 SQL:

  1. 选择合适的数据类型:使用最适合数据存储需求的数据类型,避免过度使用大型数据类型。

  2. 编写简洁的查询:只检索需要的列,避免不必要的数据传输和处理。

  3. 避免使用“SELECT *”:明确指定需要的列,减少不必要的数据载入。

  4. 使用索引:确保表上的经常查询的列有索引,以加快检索速度。

  5. 避免在 WHERE 子句中对列进行函数操作:这会导致无法利用索引,影响查询性能。

  6. 合理使用 JOIN:选择合适的 JOIN 类型,避免笛卡尔积,确保连接条件正确。

  7. 避免使用子查询:尽量优化为 JOIN 操作,避免多次执行子查询。

  8. 避免在查询中使用通配符:如 %,这会导致全表扫描。

优化慢 SQL:

  1. 使用 EXPLAIN 分析查询计划:了解查询是如何执行的,找出潜在的性能瓶颈。

  2. 优化查询语句:根据 EXPLAIN 结果,考虑是否可以调整查询、添加索引或重写查询以提高性能。

  3. 创建索引:分析查询中涉及的列,为经常用于搜索和连接的列创建索引。

  4. 避免在 WHERE 子句中进行不必要的计算:将计算移到应用程序层面,减轻数据库负担。

  5. 定期分析慢查询日志:识别哪些查询较慢,并针对性地进行优化工作。

  6. 使用缓存:利用缓存技术如 Redis 缓存热点数据,减少数据库压力。

  7. 定期维护数据库:包括优化表结构、清理无用数据、重建索引等操作,保持数据库的健康状态。

通过以上方法,可以提高 SQL 查询的效率并优化慢 SQL,从而提升数据库性能和用户体验。

超级全面的MySQL优化指南1


  1. 本文参考上述文章进行整理。 ↩︎

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

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

相关文章

【测试工具】Fiddler

1.Fiddler简介 Fiddler是位于客户端和服务器端的HTTP代理&#xff0c;能够记录客户端和服务器之间的所有 HTTP请求&#xff0c;是web调试的利器。既然是代理&#xff0c;也就是说&#xff1a;客户端的所有请求都要先经过Fiddler&#xff0c;然后转发到相应的服务器&#xff0c…

【应用多元统计分析】--数据矩阵及R语言表示

在多元分析中&#xff0c;数据通常以矩阵的形式出现&#xff0c;下面结合R语言介绍基本的矩阵运算。主要包括&#xff1a;创建矩阵向量&#xff0c;矩阵加减、乘积&#xff0c;矩阵的逆&#xff0c;行列式的值&#xff0c;特征值与特征向量&#xff0c;QR分解&#xff0c;奇异值…

微前端-乾坤《》

微前端 一个应用&#xff0c;当不断迭代的时候&#xff0c;功能会越来越多&#xff0c;代码量随着也会变得越来越大。进而代码之间的耦合性会变高&#xff0c;这样导致开发和维护很糟心&#xff0c;动一发而牵全身。于是有了微前端来解这个问题&#xff0c;按功能可以将这个应…

day02-JavaScript-Vue

文章目录 1 JavaScript1.1 介绍 1.2 引入方式1.3 基础语法1.3.1 书写语法1.3.2 变量1.3.3 数据类型和运算符 1.4 函数1.4.1 第一种定义格式1.4.2 第二种定义格式 1.5 JavaScript对象1.5.1 基本对象1.5.1.1 Array对象语法格式特点属性和方法 1.5.1.2 String对象语法格式属性和方…

17.来自Sora的夺舍妄想——享元模式详解

OpenAI 的 Sora 模型面世之后&#xff0c;可以说人类抵御AI的最后阵地也沦陷了。 在此之前&#xff0c;人们面对AI交互式对话&#xff0c;AI制图&#xff0c;AI建模之类的奇迹时&#xff0c;还可以略微放肆的说&#xff1a;“的确很神奇&#xff0c;这毕竟还是比人类世界低了一…

Redis基本知识

一、什么是Redis Redis是一种基于内存的数据库&#xff0c;对数据的读写操作都是在内存中完成&#xff0c;因此读写速度非常快&#xff0c;用于存储键值对、缓存、消息队列、分布式锁等。 二、Redis和mencached的区别 相同&#xff1a;都是基于内存的数据库&#xff0c;读写都…

2024年腾讯云部署幻兽帕鲁服务器,如何选择合适的服务器配置套餐畅玩游戏?

选择合适的服务器配置套餐以畅玩《幻兽帕鲁》游戏&#xff0c;首先需要考虑的是玩家数量和对服务器性能的需求。根据腾讯云提供的配置推荐&#xff0c;对于4到8人的玩家&#xff0c;推荐配置为4核16G12M&#xff1b;而10到20人的玩家则建议选择8核32G22M配置。这是因为《幻兽帕…

小程序页面指定区域局部滚动,做上拉和触底刷新

业务需求&#xff1a;在页面某个固定区域滑动 思路&#xff1a;滑动高度 页面高度 - 自定义导航高度&#xff08;不是自己自定义的导航可以省略&#xff09;- 按钮高度 - 单词数高度 实现 &#xff1a; 1.数据展示区内使用scroll-view&#xff0c;设置y轴滚动&#xff08;…

swoole

php是单线程。php是靠多进程来处理任务&#xff0c;任何后端语言都可以采用多进程处理方式。如我们常用的php-fpm进程管理器。线程与协程,大小的关系是进程>线程>协程,而我们所说的swoole让php实现了多线程,其实在这里来说,就是好比让php创建了多个进程,每个进程执行一条…

初阶数据结构:二叉树

目录 1. 树的相关概念1.1 简述&#xff1a;树1.2 树的概念补充 2. 二叉树2.1 二叉树的概念2.2 二叉树的性质2.3 二叉树的存储结构与堆2.3.1 存储结构2.3.2 堆的概念2.3.3 堆的实现2.3.3.1 堆的向上调整法2.3.3.2 堆的向下调整算法2.3.3.3 堆的实现 1. 树的相关概念 1.1 简述&a…

域名及地址正确外,若依后台无法正常加载页面和退出报404问题

写小程序退出的时候&#xff0c;另外写了一个自定义退出处理类&#xff0c;里面的响应浏览器的代码每次都走。因为原来也有个退出处理类&#xff0c;所以先后走了2次&#xff0c;因为就出现了问题。 LogoutSuccessHandlerImpl类里的&#xff1a; ServletUtils.renderString(r…

【C++ AVL树】

文章目录 AVL树AVL树的概念AVL树节点的定义AVL树的插入AVL树的旋转右单旋左单旋左右双旋右左双旋 代码实现 总结 AVL树 AVL树的概念 二叉搜索树在顺序有序或接近有序的情况下&#xff0c;而插入搜索树将退化为单叉树&#xff0c;此时查找的时间复杂度为O(n)&#xff0c;效率低…

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:颜色渐变)

设置组件的颜色渐变效果。 说明&#xff1a; 从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 linearGradient linearGradient(value: { angle?: number | string; direction?: GradientDirection; colors: Array; repea…

mamba-ssm安装building wheel卡着不动后error...避坑解决方法

文章目录 方法1、下载whl文件到本地后pip install安装成功后验证&#xff1a; 方法2、拉取Docker镜像 对于项目中用到MambaIR的小伙伴&#xff0c;需要pip安装 causal_conv1d和 mamba-ssm两个包及其依赖&#xff1a; torch packing transformersMambaIR-Github主页&#xff0…

【C++】vector的使用及其模拟实现

这里写目录标题 一、vector的介绍及使用1. vector的介绍2. 构造函数3. 遍历方式4. 容量操作及空间增长问题5. 增删查改6. vector二维数组 二、vector的模拟实现1. 构造函数2. 迭代器和基本接口3. reserve和resize4. push_back和pop_back5. insert和erase5. 迭代器失效问题5. 浅…

【Java】基础算法练习题

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ 目录 基础算法练习题&#x1f680;1. 两数之和…

Django 管网项目 三

Django 官网文档 ​​Writing your first Django app, part 2 | Django documentation | Django 本文内容涉及创建视图 View&#xff0c;路由&#xff0c;和模版。并对内容进行渲染。 创建视图 在我们的投票应用中&#xff0c;我们需要下列几个视图&#xff1a; 问题索引页—…

ChatGPT支持下的PyTorch机器学习与深度学习技术应用

近年来&#xff0c;随着AlphaGo、无人驾驶汽车、医学影像智慧辅助诊疗、ImageNet竞赛等热点事件的发生&#xff0c;人工智能迎来了新一轮的发展浪潮。尤其是深度学习技术&#xff0c;在许多行业都取得了颠覆性的成果。另外&#xff0c;近年来&#xff0c;Pytorch深度学习框架受…

相关知识1111

一、 店铺编号和相关负责人 1、天猫兄弟、锦格 京东凡越 福林哥 如萍姐 2、京东锦格 天猫凡越 林森 雷佳华 3、天猫从简 京东从简 孔哥 4、抖音锦格 拼多多凡越 鸿哥 不知道哪个店铺编号&#xff1a;0 二、天猫京东聊天界面快捷搜索商品 1、 天猫只能根据标题搜索 2、京东是…

神经网络之万能定理python-pytorch实现,可以拟合任意曲线

神经网络之万能定理python-pytorch实现&#xff0c;可以拟合任意曲线 博主&#xff0c;这几天一直在做这个曲线拟合的实验&#xff0c;讲道理&#xff0c;网上可能也有很多这方面的资料&#xff0c;但是博主其实试了很多&#xff0c;效果只能对一般的曲线还行&#xff0c;稍微…