MYSQL笔记(查询优化续3,特定类型的优化建议)

count查询

对于MYISAM中的SQL:

SELECT count(*) from city WHERE id > 5;

改写为:

SELECT (SELECT COUNT(*) FROM city) - count(*) FROM city where id <=5

采用否定条件,在子查询中的count将会被MYISAM优化为一个常量

另外在优化count时可以采用覆盖索引或是外部缓存系统等等方法

对联结查询的优化

1. 确保ON或USING使用的列上有索引

2.确保GROUP BY 或ORDER BY只引用一个表中的列,这样MYSQL可以尝试对这些操作

使用索引

3.谨慎升级MYSQL

优化子查询:联结优先。

GROUP BY的优化:

当不能使用索引时,两种方法来优化GROUP BY

--SQL_SMALL_RESULT,强制选择临时表

--SQL_BIG_RESULT,强制使用文件排序

使用ROLLUP优化GROUP BY

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

GROUP BY子句允许一个将额外行添加到输出中,使用WITH ROLLUP 修饰符。这些行代表高层(或高聚集)简略操作。

当你使用 ROLLUP时, 你不能同时使用 ORDER BY子句进行结果排序。换言之, ROLLUP 和ORDER BY 是互相排斥的。

然而,你仍可以对排序进行一些控制。在 MySQL中, GROUP BY 可以对结果进行排序,而且你可以在GROUP BY列表指

定的列中使用明确的 ASC和DESC关键词,从而对个别列进行排序。 (不论如何排序被ROLLUP添加的较高级别的总计行仍

出现在它们被计算出的行后面)。

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

优化limit和offset

当偏移量很大时,可能会扫描大量的数据,并在最后丢弃,如limit 1000,20,将扫描1020行,并丢弃1000行

可以采用在覆盖索引上进行偏移的方法来提高效率,然后将覆盖索引上提取的数据和全行数据进行联接,取得需要的列。

你可能感兴趣的:(mysql)