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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 【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的参数的含义和值

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
9天前
|
SQL 存储 关系型数据库
【MySQL基础篇】全面学习总结SQL语法、DataGrip安装教程
本文详细介绍了MySQL中的SQL语法,包括数据定义(DDL)、数据操作(DML)、数据查询(DQL)和数据控制(DCL)四个主要部分。内容涵盖了创建、修改和删除数据库、表以及表字段的操作,以及通过图形化工具DataGrip进行数据库管理和查询。此外,还讲解了数据的增、删、改、查操作,以及查询语句的条件、聚合函数、分组、排序和分页等知识点。
【MySQL基础篇】全面学习总结SQL语法、DataGrip安装教程
|
14天前
|
SQL Oracle 数据库
使用访问指导(SQL Access Advisor)优化数据库业务负载
本文介绍了Oracle的SQL访问指导(SQL Access Advisor)的应用场景及其使用方法。访问指导通过分析给定的工作负载,提供索引、物化视图和分区等方面的优化建议,帮助DBA提升数据库性能。具体步骤包括创建访问指导任务、创建工作负载、连接工作负载至访问指导、设置任务参数、运行访问指导、查看和应用优化建议。访问指导不仅针对单条SQL语句,还能综合考虑多条SQL语句的优化效果,为DBA提供全面的决策支持。
44 11
|
27天前
|
SQL 存储 缓存
MySQL进阶突击系列(02)一条更新SQL执行过程 | 讲透undoLog、redoLog、binLog日志三宝
本文详细介绍了MySQL中update SQL执行过程涉及的undoLog、redoLog和binLog三种日志的作用及其工作原理,包括它们如何确保数据的一致性和完整性,以及在事务提交过程中各自的角色。同时,文章还探讨了这些日志在故障恢复中的重要性,强调了合理配置相关参数对于提高系统稳定性的必要性。
|
25天前
|
SQL 关系型数据库 MySQL
MySQL 高级(进阶) SQL 语句
MySQL 提供了丰富的高级 SQL 语句功能,能够处理复杂的数据查询和管理需求。通过掌握窗口函数、子查询、联合查询、复杂连接操作和事务处理等高级技术,能够大幅提升数据库操作的效率和灵活性。在实际应用中,合理使用这些高级功能,可以更高效地管理和查询数据,满足多样化的业务需求。
97 3
|
27天前
|
SQL 监控 安全
SQL Servers审核提高数据库安全性
SQL Server审核是一种追踪和审查SQL Server上所有活动的机制,旨在检测潜在威胁和漏洞,监控服务器设置的更改。审核日志记录安全问题和数据泄露的详细信息,帮助管理员追踪数据库中的特定活动,确保数据安全和合规性。SQL Server审核分为服务器级和数据库级,涵盖登录、配置变更和数据操作等事件。审核工具如EventLog Analyzer提供实时监控和即时告警,帮助快速响应安全事件。
|
24天前
|
存储 缓存 负载均衡
后端开发中的性能优化策略
本文将探讨几种常见的后端性能优化策略,包括代码层面的优化、数据库查询优化、缓存机制的应用以及负载均衡的实现。通过这些方法,开发者可以显著提升系统的响应速度和处理能力,从而提供更好的用户体验。
51 4
|
3天前
|
开发框架 小程序 前端开发
圈子社交app前端+后端源码,uniapp社交兴趣圈子开发,框架php圈子小程序安装搭建
本文介绍了圈子社交APP的源码获取、分析与定制,PHP实现的圈子框架设计及代码编写,以及圈子小程序的安装搭建。涵盖环境配置、数据库设计、前后端开发与接口对接等内容,确保平台的安全性、性能和功能完整性。通过详细指导,帮助开发者快速搭建稳定可靠的圈子社交平台。
|
15天前
|
机器学习/深度学习 前端开发 算法
婚恋交友系统平台 相亲交友平台系统 婚恋交友系统APP 婚恋系统源码 婚恋交友平台开发流程 婚恋交友系统架构设计 婚恋交友系统前端/后端开发 婚恋交友系统匹配推荐算法优化
婚恋交友系统平台通过线上互动帮助单身男女找到合适伴侣,提供用户注册、个人资料填写、匹配推荐、实时聊天、社区互动等功能。开发流程包括需求分析、技术选型、系统架构设计、功能实现、测试优化和上线运维。匹配推荐算法优化是核心,通过用户行为数据分析和机器学习提高匹配准确性。
49 3
|
30天前
|
存储 前端开发 Java
深入理解后端开发:从基础到高级
本文将带你走进后端开发的神秘世界,从基础概念到高级应用,一步步揭示后端开发的全貌。我们将通过代码示例,让你更好地理解和掌握后端开发的核心技能。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供有价值的信息和启示。
|
2月前
|
存储 缓存 监控
后端开发中的缓存机制:深度解析与最佳实践####
本文深入探讨了后端开发中不可或缺的一环——缓存机制,旨在为读者提供一份详尽的指南,涵盖缓存的基本原理、常见类型(如内存缓存、磁盘缓存、分布式缓存等)、主流技术选型(Redis、Memcached、Ehcache等),以及在实际项目中如何根据业务需求设计并实施高效的缓存策略。不同于常规摘要的概述性质,本摘要直接点明文章将围绕“深度解析”与“最佳实践”两大核心展开,既适合初学者构建基础认知框架,也为有经验的开发者提供优化建议与实战技巧。 ####