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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 【4月更文挑战第13天】该文介绍了几个数据库查询优化技巧。首先,创建覆盖索引如<A,B,C>能加速`select A,B,C from student where A=? and B=? and C=?`的执行。其次,为常用于排序的列建立索引,如在`id,update_time`上建索引,可避免数据排序,显著提高查询速度。优化`count(*)`可通过预估值或使用Redis记录总数,但需注意数据一致性问题。使用索引提示如FORCE INDEX可强制使用特定索引,但应谨慎。将`having`的非聚合条件移到`where`里可提升效率。最后,处理深度分页时

优化案例

覆盖索引

比如执行最多的语句是select A,B,C from student where A=? and B=? and C=?

可以直接考虑创建一个<A,B,C>组合索引。对于这个SQL来说,这个组合索引就是一个覆盖索引,避免了回表。

优化order by

查询一些数据后,都要求对数据做一定的排序,比如按update_time排序,需要将排序的列加入索引。

比如select * from student where id = 1 order by update_time这个语句,如果用户的数据比较多,这个语句执行的速度比较慢,可以在<id,update_time>上创建一个新的索引。因为在id确定以后,索引内的update_time就是有序的了,避免了再次排序的消耗,可以将查询时间从秒级降到10ms级

在所有排序场景里,都尽量使用索引来排序,这样能够有效减轻数据库的负担,加快响应速度。

优化count

select count(*)是一个很常用的计算总数的语句。但是InnoDB引擎并没有存储数据总数,就导致类似的语句执行起来特别慢。

优化count一般有两种思路

  1. 用估计值取代精确值:如果这个场景对数据的准确性不高的话,可以借助EXPLAIN返回的预估行数来拿到一个预估值。

  2. 如果需要精确值的话,可以考虑使用Redis之类的NoSQL来直接记录总数,或是直接有一个额外的表来记录总数。

    如果用Redis来维持总数的话,会涉及到数据一致性的问题。如果插入数据库失败,但是更新Redis的总数失败了怎么办?

    • 如果数据只是短时间不一致,而且这个不一致业务可以接受的话,可以考虑异步刷新Redis的总数

    • 使用Cancel之类的工具监听binlog,刷新Redis的总数

索引提示优化

在实际工作的时候,如果有的时候数据库的执行比较奇怪,不用索引或用了错误的索引,就可以考虑通过FORCE INDEX、USE INDEX 和 IGNORE INDEX 这些索引提示来纠正数据库的行为。但是这个本身并不是什么好的实践,还是要谨慎。

where替换having

一般来说,数据库都是先根据where条件找到候选的列,再根据having条件进行二次过滤。如果将having的部分条件提前到where里,就可以提前把不符合条件的数据过滤掉了。

规律:如果不是使用聚合函数来作为过滤条件,最好还是将过滤条件优先写到where里。

SQL执行顺序相关问题

深度分页问题优化分页的偏移量

有一些SQL在在不断执行中会产生极大的偏移量,比如文章分页,一页50条数据,当要拿101页的数据,需要写成LIMIT 5000,505000就是偏移量。实际执行的时候,数据库需要读出5050条数据,然后把前面的5000条都丢掉,只保留50条。

优化思路是使用小偏移量。比如在原先的查询语句加where id > max_id的条件,这个max_id就是上一批的最大ID,这样可以保证LIMIT的偏移量永远是0。很多时候因为测试环境数据量小,这种性能问题很难被发现,所有使用分页的查询都应该考虑引入类似的查询条件。

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
16天前
|
SQL 关系型数据库 MySQL
深入解析MySQL的EXPLAIN:指标详解与索引优化
MySQL 中的 `EXPLAIN` 语句用于分析和优化 SQL 查询,帮助你了解查询优化器的执行计划。本文详细介绍了 `EXPLAIN` 输出的各项指标,如 `id`、`select_type`、`table`、`type`、`key` 等,并提供了如何利用这些指标优化索引结构和 SQL 语句的具体方法。通过实战案例,展示了如何通过创建合适索引和调整查询语句来提升查询性能。
117 9
|
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
|
20天前
|
缓存 关系型数据库 MySQL
MySQL 索引优化以及慢查询优化
通过本文的介绍,希望您能够深入理解MySQL索引优化和慢查询优化的方法,并在实际应用中灵活运用这些技术,提升数据库的整体性能。
60 18
|
15天前
|
机器学习/深度学习 前端开发 算法
婚恋交友系统平台 相亲交友平台系统 婚恋交友系统APP 婚恋系统源码 婚恋交友平台开发流程 婚恋交友系统架构设计 婚恋交友系统前端/后端开发 婚恋交友系统匹配推荐算法优化
婚恋交友系统平台通过线上互动帮助单身男女找到合适伴侣,提供用户注册、个人资料填写、匹配推荐、实时聊天、社区互动等功能。开发流程包括需求分析、技术选型、系统架构设计、功能实现、测试优化和上线运维。匹配推荐算法优化是核心,通过用户行为数据分析和机器学习提高匹配准确性。
49 3
|
19天前
|
缓存 关系型数据库 MySQL
MySQL 索引优化以及慢查询优化
通过本文的介绍,希望您能够深入理解MySQL索引优化和慢查询优化的方法,并在实际应用中灵活运用这些技术,提升数据库的整体性能。
22 7
|
18天前
|
缓存 关系型数据库 MySQL
MySQL 索引优化与慢查询优化:原理与实践
通过本文的介绍,希望您能够深入理解MySQL索引优化与慢查询优化的原理和实践方法,并在实际项目中灵活运用这些技术,提升数据库的整体性能。
50 5
|
27天前
|
SQL 存储 缓存
MySQL进阶突击系列(02)一条更新SQL执行过程 | 讲透undoLog、redoLog、binLog日志三宝
本文详细介绍了MySQL中update SQL执行过程涉及的undoLog、redoLog和binLog三种日志的作用及其工作原理,包括它们如何确保数据的一致性和完整性,以及在事务提交过程中各自的角色。同时,文章还探讨了这些日志在故障恢复中的重要性,强调了合理配置相关参数对于提高系统稳定性的必要性。
|
25天前
|
SQL 关系型数据库 MySQL
MySQL 高级(进阶) SQL 语句
MySQL 提供了丰富的高级 SQL 语句功能,能够处理复杂的数据查询和管理需求。通过掌握窗口函数、子查询、联合查询、复杂连接操作和事务处理等高级技术,能够大幅提升数据库操作的效率和灵活性。在实际应用中,合理使用这些高级功能,可以更高效地管理和查询数据,满足多样化的业务需求。
97 3
|
28天前
|
机器学习/深度学习 人工智能 算法
【AI系统】AI 编译器后端优化
AI编译器采用多层架构,首先通过前端优化将不同框架的模型转化为统一的Graph IR并进行计算图级别的优化,如图算融合、内存优化等。接着,通过后端优化,将优化后的计算图转换为TensorIR,针对单个算子进行具体实现优化,包括循环优化、算子融合等,以适应不同的硬件架构,最终生成高效执行的机器代码。后端优化是提升算子性能的关键步骤,涉及复杂的优化策略和技术。
49 3