一. 表的优化
1. 选择合适的数据引擎
MyISAM:适用于大量的读操作的表
InnoDB:适用于大量的写读作的表
2.选择合适的列类型
使用 SELECT * FROM TB_TEST PROCEDURE
ANALYSE()可以对这个表的每一个字段进行分析,给出优化列类型建议
1.尽量比较数据类型相同的数据列
3.尽可能不对查询字段加函数,
如WHERE YEAR(date_col) < 1990改造成WHERE
date_col < ’1990-01-01’
WHERE TO_DAYS(date_col) - TO_DAYS(CURDATE()) <
cutoff 改造成WHERE date_col < DATE_ADD(CURDATE(),
INTERVAL cutoff DAY)
当你在一条SELECT语句前放上关键词EXPLAIN,MySQL解释它将如何处理SELECT,提供有关表如何联结和以什么次序联结的信息,借助于 EXPLAIN,可以知道什么时候必须为表加入索引以得到一个使用索引来寻找记录的更快的SELECT,你也能知道优化器是否以一个最佳次序联结表。为了 强制优化器对一个SELECT语句使用一个特定联结次序,增加一个STRAIGHT_JOIN子句。 。
EXPLAIN命令的一般语法是:EXPLAIN <SQL命令> 如:explain select * from a inner join b on a.id=b.id
EXPLAIN的分析结果参数详解:
1.table:这是表的名字。
2.type:连接操作的类型。
system:表中仅有一条记录(实际应用很少只有一条资料的表)
const:表最多有一个匹配行,用于用常数值比较PRIMARY KEY或UNIQUE索引的所有部分时,
如:select * from song_lib where song_id=2(song_id为表的primary key)
eq_ref:对于每个来自于前面的表的行组合,从该表中用UNIQUE或PRIMARY KEY的索引读取一行,
如:select * from song_lib a inner join singer_lib b on a.singer_id=b.singer_id(b的type值为eq_ref)
ref:对于每个来自于前面的表的行组合,从该表中用非UNIQUE或PRIMARY KEY的索引读取一行
如:select * from song_lib a inner join singer_lib b on a.singer_name=b.singer_name和
select * from singer_lib b where singer_name=‘ccc’ (b的type值为ref,因为b.singer_name是普通索引)
ref_or_null:该联接类型如同ref,但是添加了MySQL可以专门搜索包含NULL值的行,
如:select * from singer_lib where singer_name=‘ccc’ or singer_name is null
index_merge:该联接类型表示使用了索引合并优化方法
Key: 它显示了MySQL实际使用的索引的名字。如果它为空(或NULL),则MySQL不使用索引。
key_len: 索引中被使用部分的长度,以字节计。
3.ref:ref列显示使用哪个列或常数与key一起从表中选择行
4.rows:
MySQL所认为的它在找到正确的结果之前必须扫描的记录数。显然,这里最理想的数字就是1。
5.Extra:这里可能出现许多不同的选项,其中大多数将对查询产生负面影响。一般有:
using where:表示使用了where条件
using filesort: 表示使用了文件排序,也就是使用了order
by子句,并且没有用到order by
里字段的索引,从而需要
额外的排序开销,所以如果出现using
filesort就表示排序的效率很低,需要进行优化,比如采用强制索引
的方法(force index)
原文链接:http://blog.sina.com.cn/s/blog_4e808acf01009p01.html