1. 优化 COUNT() 查问
首先咱们先回顾以下聚合函数 COUNT() 的一些用法。简略的将,COUNT() 函数的用法有两种,一种是统计表的行数,用法如下:
mysql> SELECT COUNT() FROM user;
第二种用法就是统计一个具体的数据列的非空值的数量:
mysql> SELECT COUNT(age) FROM user;
- 简略的优化:
当咱们应用 COUNT() 计算数据表的行数的时候,大多数存储引擎都不会去残缺的遍历一个表来失去他的行数,而是能够利用存储引擎的个性来间接失去这个值。(这建设在没有 where 条件的 COUNT(\) 语句中)。因而咱们能够利用这个特质优化以下状况的查问:
mysql> SELECT COUNT(*) FROM user WHERE age > 25;
如果咱们假如总共有 10000 个数据,而上述的查问语句须要查问 9000 行,这显然是一个效率很差的后果,因而能够将查问转化为:
mysql> SELECT (SELECT COUNT(*) FROM user) - COUNT(*) FROM user WHERE age <= 25;
下面这个转换看似将一次查问变成了两次,然而实际上取得全表的 count 十分的快,而取得 age<=25 的数据只须要查问 1000 行,这显然比间接查问 age>25 须要查问 9000 行来的快得多。
- 应用近似值
有时候咱们在工程与我的项目中应用 COUNT() 函数,可能并不是须要一个精确的数量值,而只是想晓得以后数据库数据的规模。例如当下想晓得网站的沉闷用户的数量,这往往只须要晓得数据的量级,例如是 100000 量级还是 1000000 量级,而对于低位的具体数字就显得不是那么的重要了。因而咱们能够在 COUNT() 语句后面应用 EXPLAIN 关键字,EXPLAIN 关键字会解析 SQL 语句,并返回一个大抵的查问行数的估算值,留神此时并不需要执行真正的查问,因而老本很低。
2. 优化关联查问
- 确保 ON 或 USING 子句中的列有索引,创立索引的时候就须要思考到关联的程序。
- 确保所有 GROUP BY 和 ORDER BY 中的表达式只波及到一个表中的列。
3. 优化子查问
对于子查问的优化咱们给出的最重要的倡议就是尽可能应用关联查问代替子查问。
4. 优化 GROUP BY() 语句
通常对 GROUP BY 的分组要求,咱们往往是借助索引来进行优化。因为索引其实在创立的时候就曾经默认的帮忙咱们将该列的数据进行了依照肯定法则的分组,因而当咱们能够预感将会对某一个数据列应用 GROUP BY 语句的时候,能够在创立时在该列上增加上索引。同样的在多个表的关联查问中,咱们如果想要的失去分组的成果,最好对一个表上的标识列进行分组。
5. 优化 UNION 查问
如果不是的确须要服务器打消反复的行,否则就肯定要应用 UNION ALL。如果没有 ALL 关键字,MySQL 会给长期表加上一个 DISTINCT 选项,这会导致对整个表进行数据的唯一性查看,这样做的代价十分高。事实上,即便有 ALL 关键字,MySQL 仍会应用长期表存储后果,再读出,然而没有唯一性查看将会大大降低查找代价。