阿里巴巴Java性能调优实战:如何写出高性能SQL语句?

MySQL 数据库是互联网公司使用最为频繁的数据库之一,不仅仅因为它开源免费,MySQL 卓越的性能、稳定的服务以及活跃的社区都成就了它的核心竞争力。

我们知道,应用服务与数据库的交互主要是通过 SQL 语句来实现的。在开发初期,我们更 加关注的是使用 SQL 实现业务功能,然而系统上线后,随着生产环境数据的快速增长,之 前写得很多 SQL 语句就开始暴露出性能问题。

在这个阶段中,我们应该尽量避免一些慢 SQL 语句的实现。但话说回来,SQL语句慢的原 因千千万,除了一些常规的慢 SQL 语句可以直接规避,其它的一味去规避也不是办法,我们还要学会如何去分析、定位到其根本原因,并总结一些常用的 SQL 调优方法,以备不时 之需。

那么今天我们就重点看看慢 SQL 语句的几种常见诱因,从这点出发,找到最佳方法,开启高性能 SQL 语句的大门。

慢 SQL 语句的几种常见诱因

1. 无索引、索引失效导致慢查询

2. 锁等待

除了锁升级之外,行锁相对表锁来说,虽然粒度更细,并发能力提升了,但也带来了新的问 题,那就是死锁。因此,在使用行锁时,我们要注意避免死锁。关于死锁,我还会在第 35 讲中详解。

3. 不恰当的 SQL 语句

优化 SQL 语句的步骤

1. 通过 EXPLAIN 分析 SQL 执行计划

下面对图示中的每一个字段进行一个说明,从中你也能收获到很多零散的知识点。

2. 通过 Show Profile 分析 SQL 执行性能

Show Profiles 只显示最近发给服务器的 SQL 语句,默认情况下是记录最近已执行的15条记录,我们可以重新设置 profiling_history_size 增大该存储记录,最大值为 100。

获取到 Query_ID 之后,我们再通过 Show Profile for Query ID 语句,就能够查看到对应 Query_ID 的 SQL 语句在执行过程中线程的每个状态所消耗的时间了。

通过以上分析可知:SELECT COUNT(*) FROM `order`; SQL 语句在 Sending data 状态所 消耗的时间最长,这是因为在该状态下,MySQL 线程开始读取数据并返回到客户端,此时 有大量磁盘 I/O 操作。

常用的 SQL 优化

1. 优化分页查询

如果我们使用 select order_no, status from order where order_no='xxx’来查询,则只会查询组合索引,通过组合索引获取到对应的 order_no 和 status 的值。如果你对这些索引还不够熟悉,请重点关注之后的第 34 讲,那一讲会详述数据库索引的相关内容。

举报
评论 0