iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >基于MySQL 的 SQL 优化总结
  • 643
分享到

基于MySQL 的 SQL 优化总结

基于MySQLSQL优化总结 2017-06-28 02:06:56 643人浏览 绘本
摘要

在数据库运维过程中,优化 sql 是 DBA 团队的日常任务。例行 SQL 优化,不仅可以提高程序性能,还能减低线上故障的概率。 目前常用的 SQL 优化方式包括但不限于:业务层优化、SQL 逻辑优化、索引优化等。其中索

基于MySQL 的 SQL 优化总结

数据库运维过程中,优化 sql 是 DBA 团队的日常任务。例行 SQL 优化,不仅可以提高程序性能,还能减低线上故障的概率。 目前常用的 SQL 优化方式包括但不限于:业务层优化、SQL 逻辑优化、索引优化等。其中索引优化通常通过调整索引或新增索引从而达到 SQL 优化的目的。索引优化往往可以在短时间内产生非常巨大的效果。

文章首发于我的个人博客,欢迎访问。https://blog.itzhouq.cn/Mysql1

基于mysql 的 SQL 优化总结

数据库运维过程中,优化 SQL 是 DBA 团队的日常任务。例行 SQL 优化,不仅可以提高程序性能,还能减低线上故障的概率。

目前常用的 SQL 优化方式包括但不限于:业务层优化、SQL 逻辑优化、索引优化等。其中索引优化通常通过调整索引或新增索引从而达到 SQL 优化的目的。索引优化往往可以在短时间内产生非常巨大的效果。

--- 来自美团技术团队

SQL 优化是一个复杂的问题,不同版本和种类的数据库、不同数据级的数据需要选择不同的优化策略。

说明:我这里简单总结一下 SQL 优化,很多的大佬写过这方面的细节和用法,甚至还有相关的案例。我只是作为一个阶段性的总结,肯定是不全面的。如有错误和不当之处,欢迎批评指正,不胜感激。

从日常开发写 SQL 的角度看,需要遵循一些规则,但是这些规则只能解决部分问题。因为随着开发和数据量的增长,SQL 还是会变慢,这个时候需要一些针对性的措施,比如针对性地添加索引,通过命令或者工具分析变慢的 SQL 等等。

说说 SQL 优化的其中两个大的原则(肯定还有别的):

原则一:尽量避免全表扫描。

原则二:通过索引优化。

这两个涉及的点比较多,他们之间也是有联系的,下面详细说说。

1、避免全表扫描

为啥要避免全表扫描呢?因为全表扫描耗费更多的时间。

那么从哪些方法避免全表扫描呢?

对 where 和 order by 涉及的列建立索引可以提高访问速度。但是要注意,并不是你建立了索引,索引就一定会生效。如果没有生效查询时还是全表扫描,速度还是得不到提升。那如何判断索引没有生效呢?可以借助 explain + SQL 语句的结果判断。大佬写的MySQL EXPLAIN 命令: 查看查询执行计划中总结了用法。简单的说,使用该命令分析的结果中很多字段,其中type 描述了查询的方式,如果 type 的结果是ALL,那么索引肯定没起作用。下面总结一下如何避免索引失效。

避免在 where 子句中对字段进行 null 判断

select id from user where name is null

避免在 where 子句使用 != 或者 <>

避免在 where 子句中对表达式进行操作

select id from user where age/2 = 20

修改为:

select id from user where age = 20 * 2

避免在 where 子句中对字段进行函数操作

避免在 like 查询中将 %放在开头

select id from user where username like "%wh"

2、索引优化

适当地添加索引可以提高 SQL 的速度,但也有些注意点。

使用联合索引时,注意索引列的顺序,一般遵循最左匹配原则

比如一个索引:

KEY `idx_userid_age` (`userId`, `age`) USING BTREE

符合最左匹配原则的写法是把userid放在前面

select userid, name from user where userid = 1001 and age = 10

当我们创建的这个联合索引,就相当于创建了(userid)(userid, age)两个索引。联合索引不满足最左原则,一般会失效,但是这个还跟 MySQL 优化器有关系。

在适当的时候,使用覆盖索引

通常在使用索引检索数据之后,需要访问磁盘上数据表文件读取所需要的列,这种操作成为“回表”。

若索引中包含查询的所有列,则不需要回表操作,直接从索引文件中读取数据即可,这种索引成为“覆盖索引”。

在查询时尽量减少select *,只查询需要的行,条件允许时尽量建立覆盖索引

删除冗余索引

索引并不是越多越好,冗余的索引会影响性能。

比如,索引(A, B)相当于创建了索引(A)和索引(A, B)

注意索引的数量

索引不是越多越好,一般不要超过 5 个。索引虽然提高了查询效率,但是也会降低插入和更新的效率。插入或更新可能会重建索引,索引建立索引也需要慎重考虑。

索引不适合建立在有大量重复的字段上,如性别这类字段

3、其他

其他原则包括但不限于:

查询 SQL 尽量不要使用 select *,而是 select 某字段

连表查询的时候尽量将数据量少的表驱动数据多的表。

如果插入的数据较多时,考虑批量插入。

原则上不要有超过 5 张以上的表连接

阿里巴巴开发手册中规定超过三个表禁止 join的,但是这些规范的适用性还是要考虑环境。当连表数量较少时,连表路径算法选择的是动态规划算法;但是连表太多的情况下,路径算法可能退化成贪心算法,连表的方案可能不是最优的的。

这种情况下,如何写 SQL 呢?答案是通过可以通过冗余实现,细节就不展开了。

4、通过工具分析 SQL

说说几个用到的 SQL 分析工具

4.1 MySQL 自带的慢查询日志

MySQL 的慢查询日志是 MySQL 提供的一种日志,记录,用于记录在 MySQL 中响应时间超过设定的阈值的语句。在 MySQL 的配置文件 my.ini中开启后,支持将慢查询日志写入文件或者数据库。通过explain关键词模拟优化器执行 SQL,分析慢查询 SQL。

分析相关语句使用了哪些表、连接的类型、扫描的行数、使用的索引等。

4.2 日志分析工具 MySQLdumpslow

在生产环境中,手工分析日志、查找 SQL 比较费时间。MySQL 提供的 MySQLdumpslow 工具可以得到一些 SQL 访问的统计数据,比如访问次数最多的 10 条 SQL 等。

4.3 第三方工具:美团技术团队的 SQLAdvisor

由美团技术团队维护的一个开源的分析 SQL,给出索引优化建议的工具。

只是大概做了个总结,细节都没有展开,有兴趣的同学自行学习吧。

参考文章:

MySQL 快速入门

MySQL 事务机制

MySQL EXPLAIN 命令: 查看查询执行计划

MySQL 索引与查询优化

书写高质量的 SQL 总结

索引优化的原则总结

美团点评SQL优化工具SQLAdvisor开源

您可能感兴趣的文档:

--结束END--

本文标题: 基于MySQL 的 SQL 优化总结

本文链接: https://www.lsjlt.com/news/6155.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • oracle怎么查询当前用户所有的表
    要查询当前用户拥有的所有表,可以使用以下 sql 命令:select * from user_tables; 如何查询当前用户拥有的所有表 要查询当前用户拥有的所有表,可以使...
    99+
    2024-05-14
    oracle
  • oracle怎么备份表中数据
    oracle 表数据备份的方法包括:导出数据 (exp):将表数据导出到外部文件。导入数据 (imp):将导出文件中的数据导入表中。用户管理的备份 (umr):允许用户控制备份和恢复过程...
    99+
    2024-05-14
    oracle
  • oracle怎么做到数据实时备份
    oracle 实时备份通过持续保持数据库和事务日志的副本来实现数据保护,提供快速恢复。实现机制主要包括归档重做日志和 asm 卷管理系统。它最小化数据丢失、加快恢复时间、消除手动备份任务...
    99+
    2024-05-14
    oracle 数据丢失
  • oracle怎么查询所有的表空间
    要查询 oracle 中的所有表空间,可以使用 sql 语句 "select tablespace_name from dba_tablespaces",其中 dba_tabl...
    99+
    2024-05-14
    oracle
  • oracle怎么创建新用户并赋予权限设置
    答案:要创建 oracle 新用户,请执行以下步骤:以具有 create user 权限的用户身份登录;在 sql*plus 窗口中输入 create user identified ...
    99+
    2024-05-14
    oracle
  • oracle怎么建立新用户
    在 oracle 数据库中创建用户的方法:使用 sql*plus 连接数据库;使用 create user 语法创建新用户;根据用户需要授予权限;注销并重新登录以使更改生效。 如何在 ...
    99+
    2024-05-14
    oracle
  • oracle怎么创建新用户并赋予权限密码
    本教程详细介绍了如何使用 oracle 创建一个新用户并授予其权限:创建新用户并设置密码。授予对特定表的读写权限。授予创建序列的权限。根据需要授予其他权限。 如何使用 Oracle 创...
    99+
    2024-05-14
    oracle
  • oracle怎么查询时间段内的数据记录表
    在 oracle 数据库中查询指定时间段内的数据记录表,可以使用 between 操作符,用于比较日期或时间的范围。语法:select * from table_name wh...
    99+
    2024-05-14
    oracle
  • oracle怎么查看表的分区
    问题:如何查看 oracle 表的分区?步骤:查询数据字典视图 all_tab_partitions,指定表名。结果显示分区名称、上边界值和下边界值。 如何查看 Oracle 表的分区...
    99+
    2024-05-14
    oracle
  • oracle怎么导入dump文件
    要导入 dump 文件,请先停止 oracle 服务,然后使用 impdp 命令。步骤包括:停止 oracle 数据库服务。导航到 oracle 数据泵工具目录。使用 impdp 命令导...
    99+
    2024-05-14
    oracle
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作