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仍会应用长期表存储后果,再读出,然而没有唯一性查看将会大大降低查找代价。