1.不要查询不需要的列,不要用select *(减少内存占用和网络带宽占用,减少表结构变化带来的影响)
2.EXPLAIN语句结果中的rows是预估的要扫描的行数,Extra:Using Where表示MySQL将通过WHERE条件来筛选存储引擎(注意是存储引擎)返回的记录
一般MySQL能够使用如下三种方式应用WHERE条件,从好到坏:
在索引中使用WHERE条件来过滤,在存储引擎层
使用索引覆盖扫描(在Extra列中出现了Using index)来返回记录,直接从索引中过滤不需要的记录并返回命中的结果。这是在MySQL服务器层返回的,但无须再回表查询记录。
从数据表中返回数据,然后过滤不满足条件的记录(Extra:Using Where)。这是在MySQL服务层完成,MySQL需要从数据表读出记录然后过滤。
3.使用多个简单查询来代替一个复杂查询
3.1如每个月删除旧的数据,为了防止一次锁住很多数据,占满整个事务日志,耗尽系统资源,阻塞很多小的但重要的查询:
将DELETE FROM message WHERE created < DATE_SUB(NOW,INTERVAL 3 MONTH);
换为:
rows_affected = 0
do{
rows_affected = do_query(
"DELETE FROM message WHERE created < DATE_SUB(NOW,INTERVAL 3 MONTH)
2.EXPLAIN语句结果中的rows是预估的要扫描的行数,Extra:Using Where表示MySQL将通过WHERE条件来筛选存储引擎(注意是存储引擎)返回的记录
一般MySQL能够使用如下三种方式应用WHERE条件,从好到坏:
在索引中使用WHERE条件来过滤,在存储引擎层
使用索引覆盖扫描(在Extra列中出现了Using index)来返回记录,直接从索引中过滤不需要的记录并返回命中的结果。这是在MySQL服务器层返回的,但无须再回表查询记录。
从数据表中返回数据,然后过滤不满足条件的记录(Extra:Using Where)。这是在MySQL服务层完成,MySQL需要从数据表读出记录然后过滤。
3.使用多个简单查询来代替一个复杂查询
3.1如每个月删除旧的数据,为了防止一次锁住很多数据,占满整个事务日志,耗尽系统资源,阻塞很多小的但重要的查询:
将DELETE FROM message WHERE created < DATE_SUB(NOW,INTERVAL 3 MONTH);
换为:
rows_affected = 0
do{
rows_affected = do_query(
"DELETE FROM message WHERE created < DATE_SUB(NOW,INTERVAL 3 MONTH)