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

简介: 【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的参数的含义和值

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
10月前
|
存储 人工智能 NoSQL
AI大模型应用实践 八:如何通过RAG数据库实现大模型的私有化定制与优化
RAG技术通过融合外部知识库与大模型,实现知识动态更新与私有化定制,解决大模型知识固化、幻觉及数据安全难题。本文详解RAG原理、数据库选型(向量库、图库、知识图谱、混合架构)及应用场景,助力企业高效构建安全、可解释的智能系统。
|
11月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
1703 152
|
11月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎,提供高性价比、稳定安全的云数据库服务,适用于多种行业与业务场景。
1134 156
|
10月前
|
SQL 存储 监控
SQL日志优化策略:提升数据库日志记录效率
通过以上方法结合起来运行调整方案, 可以显著地提升SQL环境下面向各种搜索引擎服务平台所需要满足标准条件下之数据库登记作业流程综合表现; 同时还能确保系统稳健运行并满越用户体验预期目标.
455 6
|
11月前
|
关系型数据库 MySQL 分布式数据库
阿里云PolarDB云原生数据库收费价格:MySQL和PostgreSQL详细介绍
阿里云PolarDB兼容MySQL、PostgreSQL及Oracle语法,支持集中式与分布式架构。标准版2核4G年费1116元起,企业版最高性能达4核16G,支持HTAP与多级高可用,广泛应用于金融、政务、互联网等领域,TCO成本降低50%。
|
11月前
|
存储 前端开发 安全
实现“永久登录”:针对蜻蜓Q系统的用户体验优化方案(前端uni-app+后端Laravel详解)-优雅草卓伊凡
实现“永久登录”:针对蜻蜓Q系统的用户体验优化方案(前端uni-app+后端Laravel详解)-优雅草卓伊凡
423 5
|
11月前
|
关系型数据库 分布式数据库 数据库
阿里云数据库收费价格:MySQL、PostgreSQL、SQL Server和MariaDB引擎费用整理
阿里云数据库提供多种类型,包括关系型与NoSQL,主流如PolarDB、RDS MySQL/PostgreSQL、Redis等。价格低至21元/月起,支持按需付费与优惠套餐,适用于各类应用场景。
|
11月前
|
SQL 关系型数据库 MySQL
Mysql数据恢复—Mysql数据库delete删除后数据恢复案例
本地服务器,操作系统为windows server。服务器上部署mysql单实例,innodb引擎,独立表空间。未进行数据库备份,未开启binlog。 人为误操作使用Delete命令删除数据时未添加where子句,导致全表数据被删除。删除后未对该表进行任何操作。需要恢复误删除的数据。 在本案例中的mysql数据库未进行备份,也未开启binlog日志,无法直接还原数据库。
|
11月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
635 158
|
11月前
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。

热门文章

最新文章

推荐镜像

更多