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