【后端面经】【数据库与MySQL】SQL优化:如何发现SQL中的问题?

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 【4月更文挑战第12天】数据库优化涉及硬件升级、操作系统调整、服务器/引擎优化和SQL优化。SQL优化目标是减少磁盘IO和内存/CPU消耗。`EXPLAIN`命令用于检查SQL执行计划,关注`type`、`possible_keys`、`key`、`rows`和`filtered`字段。设计索引时考虑外键、频繁出现在`where`、`order by`和关联查询中的列,以及区分度高的列。大数据表改结构需谨慎,可能需要停机、低峰期变更或新建表。面试中应准备SQL优化案例,如覆盖索引、优化`order by`、`count`和索引提示。优化分页查询时避免大偏移量,可利用上一批的最大ID进行限制。

数据库优化

主要从下面的角度来进行

  • 硬件资源优化:增加机器配置

  • 操作系统优化:调整OS的某些设置

  • 服务器/引擎优化:比如调整事务隔离级别;调整InnoDB引擎的日志刷盘时机

  • SQL优化:针对SQL本身

SQL优化是最容易的一点优化,站在数据库的角度,SQL优化的目标是:

  1. 减少磁盘IO:尽量避免全表扫描、尽量使用索引、尽量使用覆盖索引

  2. 减少内存和CPU的消耗:尽量减少排序、分组和去重之类的操作

EXPLAIN命令

如果想知道优化后的效果,需要掌握一个工具,也就是EXPLAIN命令。用法是EXPLAIN my_sql,数据库就会返回一个执行计划。

比如select * from student where id = 1

执行计划比较关键的字段如下:

  1. type:查询到所需行需要的方式,从好到坏依次是system> const> eq_ref> ref> range> index> ALL

    • system/const可以理解为数据库只会返回一行数据,查询时间是固定的

    • eq_ref/ref可以理解为根据索引的值来查找

    • range 是索引范围扫描

    • index是索引全表扫描,扫描索引所在的B+树

    • ALL是全表扫描,如果表数据都在缓存就不需要磁盘IO

注意:索引的扫描里,索引如果不在缓存的话也需要磁盘IO。扫描二级索引比扫描全表(主键索引)的优势是二级索引一般只存储索引列和id,数据很小。性能从好到差分别是 根据主键取数据 > 根据普通索引取数据 > 索引全表扫描 > 全表扫描

  1. possible_keys:候选的索引

  2. key:实际使用的索引

  3. rows:扫描的行数

  4. filtered:查找到所需要的数据占rows的比例

设计索引列

  • 外键:一般用于关联、过滤数据,正常来说都会为表的外键创建索引

  • 频繁出现在where中的列,为了避免全表扫描

  • 频繁出现在order by的列,为了避免数据库在查询结构出来后再次排序

  • 频繁出现在关联查询的关联条件中的列。不过一般不建议使用关联查询

  • 区分度很高的列。比如每一行数据都不同的列,并且创建联合索引的时候,区分度很高的列应该尽可能放在左边。(最左匹配原则)

数据量大的表更改表结构

修改索引的时候,数据量大的表和数据量小的表修改索引的实际方案不一样。因为修改索引相当于表定义的变更,核心问题是数据库会加表锁,直到修改完成。如果这个表的数据很多,在执行加索引的命令时,整张表可能会被锁住几分钟甚至几小时。

所以数据量大的表结构变更是一件很复杂的事情,一般可以考虑的方案有三种:

  1. 停机变更:把整个业务停止,更新表结构。或是只把跟这个表有关的功能下线,不需要把整个服务或系统下线。

  2. 业务低峰期变更

  3. 创建新表,数据迁移

面试相关

准备一些SQL优化的案例

  • 维护的业务的所有表结构定义和索引定义,每个表上执行最频繁的三个SQL是否用到了索引

  • 之前的慢SQL是怎么发现、分析和优化的,记住SQL优化前后的执行时间

  • 深挖的一些方向

一些常见的问题 可以引导导SQL优化里

  • 是否做过性能优化

  • 接口的响应时间是多少 有没有优化的空间

  • 是否了解索引、用过索引

基本思路

基本思路就是将SQL优化作为全方面优化系统性能的一个措施。

xx系统是一个核心系统,对可用性和性能都有很高的要求,可用性要求是xxxx,性能要求是平均RT控制在100ms内。做了很多性能优化的事情,比如SQL优化。

根据SQL慢查询监控 -> 排查SQL问题 -> 通过EXPLAIN命令查看SQL的执行计划,看看有没有走索引、走了哪些索引、是否有内存排序、去重等操作 -> 尝试优化,包括改写SQL、修改/创建索引

弄清楚数据库和数据库所在的OS的参数的含义和值

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
9天前
|
SQL 关系型数据库 MySQL
mysql 简单的sql语句,入门级增删改查
介绍MySQL中的基本SQL语句,包括数据的增删改查操作,使用示例和简单的数据表进行演示。
mysql 简单的sql语句,入门级增删改查
|
16天前
|
SQL 数据库
数据库数据恢复—SQL Server数据库报错“错误823”的数据恢复案例
SQL Server附加数据库出现错误823,附加数据库失败。数据库没有备份,无法通过备份恢复数据库。 SQL Server数据库出现823错误的可能原因有:数据库物理页面损坏、数据库物理页面校验值损坏导致无法识别该页面、断电或者文件系统问题导致页面丢失。
82 12
数据库数据恢复—SQL Server数据库报错“错误823”的数据恢复案例
|
1月前
|
SQL 存储 缓存
浅析MySQL中的SQL执行过程
本文探讨了MySQL的体系结构、SQL执行流程及SQL执行时间分析方法。首先介绍了MySQL由连接层、SQL层和存储引擎层构成;接着详细描述了SQL从客户端发送到服务器执行的具体流程;最后,通过启用profiling功能,展示了如何分析SQL执行时间,并说明了MySQL 8.0版本后移除查询缓存的原因。
浅析MySQL中的SQL执行过程
|
21天前
|
存储 SQL 关系型数据库
【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)
MySQL调优主要分为三个步骤:监控报警、排查慢SQL、MySQL调优。 排查慢SQL:开启慢查询日志 、找出最慢的几条SQL、分析查询计划 。 MySQL调优: 基础优化:缓存优化、硬件优化、参数优化、定期清理垃圾、使用合适的存储引擎、读写分离、分库分表; 表设计优化:数据类型优化、冷热数据分表等。 索引优化:考虑索引失效的11个场景、遵循索引设计原则、连接查询优化、排序优化、深分页查询优化、覆盖索引、索引下推、用普通索引等。 SQL优化。
168 15
【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)
|
2天前
|
SQL 存储 移动开发
HTML5 Web SQL 数据库详解
Web SQL 数据库是 HTML5 中的一种本地存储技术,允许在浏览器中使用 SQL 语言操作本地数据,支持离线访问和事务处理,适用于缓存数据和小型应用。然而,其存储容量有限且仅部分现代浏览器支持,标准已不再积极维护,未来可能被 IndexedDB 和 localStorage 等技术取代。使用时需谨慎考虑兼容性和发展前景。
|
21天前
|
存储 关系型数据库 MySQL
MySQL高级篇——覆盖索引、前缀索引、索引下推、SQL优化、主键设计
覆盖索引、前缀索引、索引下推、SQL优化、EXISTS 和 IN 的区分、建议COUNT(*)或COUNT(1)、建议SELECT(字段)而不是SELECT(*)、LIMIT 1 对优化的影响、多使用COMMIT、主键设计、自增主键的缺点、淘宝订单号的主键设计、MySQL 8.0改造UUID为有序
MySQL高级篇——覆盖索引、前缀索引、索引下推、SQL优化、主键设计
|
14天前
|
SQL 缓存 关系型数据库
揭秘MySQL一条SQL语句的执行流程
以上步骤共同构成了MySQL处理SQL语句的完整流程,理解这一流程有助于更有效地使用MySQL数据库,优化查询性能,及时解决可能出现的性能瓶颈问题。
35 7
|
20天前
|
SQL 监控 关系型数据库
MySQL数据库中如何检查一条SQL语句是否被回滚
检查MySQL中的SQL语句是否被回滚需要综合使用日志分析、事务状态监控和事务控制语句。理解和应用这些工具和命令,可以有效地管理和验证数据库事务的执行情况,确保数据的一致性和系统的稳定性。此外,熟悉事务的ACID属性和正确设置事务隔离级别对于预防数据问题和解决事务冲突同样重要。
30 2
|
23天前
|
SQL 关系型数据库 MySQL
SQL和MySQL
SQL和MySQL
37 1
|
5天前
|
SQL 存储 缓存
MySQL 是怎么执行 SQL 语句的?
MySQL 是怎么执行 SQL 语句的?
10 0

热门文章

最新文章

下一篇
无影云桌面