首页 > 代码库 > MySQL优化
MySQL优化
一. 表的优化
1. 选择合适的数据引擎
MyISAM:适用于大量的读操作的表
InnoDB:适用于大量的写读作的表
2.选择合适的列类型
使用 SELECT * FROM TB_TEST PROCEDUREANALYSE()可以对这个表的每一个字段进行分析,给出优化列类型建议
3.对于不保存NULL值的列使用NOTNULL,这对你想索引的列尤其重要
4.建立合适的索引
5.使用定长字段,速度比变长要快
二. 充分利用索引
1.尽量比较数据类型相同的数据列
1.尽量比较数据类型相同的数据列
2.尽可能地让索引列在比较表达式中独立,WHERE mycol < 4 / 2 使用索引,而WHERE mycol * 2< 4不使用
3.尽可能不对查询字段加函数,
如WHERE YEAR(date_col) < 1990改造成WHEREdate_col < ’1990-01-01’
WHERE TO_DAYS(date_col) - TO_DAYS(CURDATE()) <cutoff 改造成WHERE date_col < DATE_ADD(CURDATE(),INTERVAL cutoff DAY)
4.在LIKE模式的开头不要使用通配符
5.使用straightjoin可以强制优化器按照FROM子句的次序来进行联结,可以selectstraight join,强制所有联结,也可以select * from a straightjoin b强制两个表的顺序.
6.使用forceindex强制使用指定的索引.如 select * from song_lib forceindex(song_name) order by song_name比不用forceindex效率高
7.尽量避免使用MySQL自动类型转换,否则将不能使用索引.如将int型的num_col用wherenum_col=‘5’
使用Explain分析SQL语句使用索引的情况
当你在一条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:表最多有一个匹配行,用于用常数值比较PRIMARYKEY或UNIQUE索引的所有部分时,
如:select * from song_lib wheresong_id=2(song_id为表的primary key)
eq_ref:对于每个来自于前面的表的行组合,从该表中用UNIQUE或PRIMARYKEY的索引读取一行,
如:select * from song_lib a inner join singer_lib b ona.singer_id=b.singer_id(b的type值为eq_ref)
ref:对于每个来自于前面的表的行组合,从该表中用非UNIQUE或PRIMARYKEY的索引读取一行
如:select * from song_lib a inner join singer_lib b ona.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’ orsinger_name is null
index_merge:该联接类型表示使用了索引合并优化方法
Key:它显示了MySQL实际使用的索引的名字。如果它为空(或NULL),则MySQL不使用索引。
key_len:索引中被使用部分的长度,以字节计。
当你在一条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:表最多有一个匹配行,用于用常数值比较PRIMARYKEY或UNIQUE索引的所有部分时,
如:select * from song_lib wheresong_id=2(song_id为表的primary key)
eq_ref:对于每个来自于前面的表的行组合,从该表中用UNIQUE或PRIMARYKEY的索引读取一行,
如:select * from song_lib a inner join singer_lib b ona.singer_id=b.singer_id(b的type值为eq_ref)
ref:对于每个来自于前面的表的行组合,从该表中用非UNIQUE或PRIMARYKEY的索引读取一行
如:select * from song_lib a inner join singer_lib b ona.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’ orsinger_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: 表示使用了文件排序,也就是使用了orderby子句,并且没有用到order by里字段的索引,从而需要
额外的排序开销,所以如果出现usingfilesort就表示排序的效率很低,需要进行优化,比如采用强制索引
的方法(force index)
原文链接:http://blog.sina.com.cn/s/blog_4e808acf01009p01.html
MySQL优化
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。