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

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: 【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。很多时候因为测试环境数据量小,这种性能问题很难被发现,所有使用分页的查询都应该考虑引入类似的查询条件。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2天前
|
数据库
编程日记02:个人站优化数据库和日志
编程日记02:个人站优化数据库和日志
7 0
|
3天前
|
存储 算法 关系型数据库
MySQL连接的原理⭐️4种优化连接的手段性能提升240%🚀
MySQL连接的原理⭐️4种优化连接的手段性能提升240%🚀
|
3天前
|
SQL canal 运维
MySQL高可用架构探秘:主从复制剖析、切换策略、延迟优化与架构选型
MySQL高可用架构探秘:主从复制剖析、切换策略、延迟优化与架构选型
|
3天前
|
存储 SQL 关系型数据库
掌握高性能SQL的34个秘诀🚀多维度优化与全方位指南
掌握高性能SQL的34个秘诀🚀多维度优化与全方位指南
|
3天前
|
存储 算法 关系型数据库
MySQL怎样处理排序⭐️如何优化需要排序的查询?
MySQL怎样处理排序⭐️如何优化需要排序的查询?
|
3天前
|
SQL 存储 关系型数据库
5分钟搞懂MySQL半连接优化⭐️多种半连接的优化策略
5分钟搞懂MySQL半连接优化⭐️多种半连接的优化策略
|
3天前
|
SQL 存储 关系型数据库
MySQL的3种索引合并优化⭐️or到底能不能用索引?
MySQL的3种索引合并优化⭐️or到底能不能用索引?
|
3天前
|
缓存 关系型数据库 数据库
【Docker 专栏】Docker 与容器化数据库的集成与优化
【5月更文挑战第9天】本文探讨了Docker与容器化数据库集成的优势,如快速部署、环境一致性、资源隔离和可扩展性,并列举了常见容器化数据库(如MySQL、PostgreSQL和MongoDB)。讨论了集成方法、注意事项、优化策略,包括资源调整、缓存优化和监控告警。此外,强调了数据备份、恢复测试及性能评估的重要性。未来,随着技术发展,二者的集成将更紧密,为数据管理带来更多可能性。掌握此技术将应对数字化时代的机遇与挑战。
【Docker 专栏】Docker 与容器化数据库的集成与优化
|
3天前
|
存储 关系型数据库 MySQL
MySQL的优化利器⭐️Multi Range Read与Covering Index是如何优化回表的?
本文以小白的视角使用通俗易懂的流程图深入浅出分析Multi Range Read与Covering Index是如何优化回表
|
4天前
|
存储 关系型数据库 分布式数据库
数据库索引回表困难?揭秘PolarDB存储引擎优化技术
PolarDB分布式版存储引擎采用CSM方案均衡资源开销与可用性。
数据库索引回表困难?揭秘PolarDB存储引擎优化技术