SQL语句的优化 | 青训营笔记

102 阅读2分钟

一个慢 SQL 就可以直接让 MySQL 瘫痪。

什么样算慢

所谓慢 SQL,就是执行特别慢的 SQL 语句。什么样的 SQL 语句是慢 SQL?多慢才算是慢 SQL?并没有一个非常明确的标准或者说是界限。但并不是说,我们就很难区分正常的 SQL 和慢 SQL,在大多数实际的系统中,慢 SQL 消耗掉的数据库资源,往往是正常 SQL 的几倍、几十倍甚至几百倍,所以还是非常容易区分的。

在编写一条查询语句的时候,可以依据你要查询数据表的数据总量,估算一下这条查询大致需要遍历多少行数据。如果遍历行数在百万以内的,只要不是每秒钟都要执行几十上百次的频繁查询,可以认为是安全的。遍历数据行数在几百万的,查询时间最少也要几秒钟,你就要仔细考虑有没有优化的办法。遍历行数达到千万量级和以上的,只能说这种查询就不应该出现在系统中。

使用索引避免全表扫描

比如说,有一个无序的数组,数组的每个元素都是一个用户对象。我们用一个 Map(在有些编程语言中是 Dictionary) 来给数组做一个索引,Key 保存姓氏,值是所有这个姓氏的用户对象在数组中序号的集合。这样再查找的时候,就不用去遍历数组,先在 Map 中查找,然后再直接用序号去数组中拿用户数据,这样查找速度就快多了。

这个例子对应到数据库中,存放用户数据的数组就是表,我们构建的 Map 就是索引。实际上数据库的索引,和编程语言中的 Map 或者 Dictionary,它们的数据结构都是差不多的,基本上就是各种 B 树和 HASH 表。

分析 SQL 执行计划

只要在 SQL 语句前面加上 EXPLAIN 关键字,然后执行这个查询语句就可以了。

索引可以显著减少查询遍历数据的数量,所以提升 SQL 查询性能最有效的方式就是,让查询尽可能多的命中索引,但索引也是一把双刃剑,它在提升查询性能的同时,也会降低数据更新的性能。