1.优先使用join联表查询,而不是子查询
原因:过多的子查询会使效率下降。
2.当join联表查询时,过滤条件优先使用on,之后无法使用on的,再使用where进行过滤
原因:MySQL使用join联表时,首先处理on中的过滤条件,然后再处理where中的过滤条件,将过滤条件优先放在on后,可以时筛选出的集合尽可能小,提高效率。
3.确认查询结果只有一条时,使用limit 1
原因:如果不使用limit 1,select检索到第一条匹配信息后,仍然对后边的数据继续检索,使用limit 1 可以避免查找到结果后不必要的继续查找,提高性能。
4.不要使用order by rand()
原因:效率太低,可以先使用select count(*) from table;获取总条数n,在n~0之间获取随机值,使用limit n-1,1;的方式获取随机数据,效率明显高于order by rand()
5.使用Explain查看select的情况。其中type字段显示连接使用了何种类型,从最好到最差的连接类型为const、eq_reg、ref、range、indexhe和ALL;
6.select * from tableName procedure analyse();根据表中数据分析各字段使用情况进行建议优化。由于是根据表中现有数据分析,所以procedure analyse()是基于数据量足够大且查询远大于插入的后期优化
7.使用“垂直分割”的方式,将表分为定长(字段长度确定:表中没有如下类型的字段: VARCHAR,TEXT,BLOB)和不定长的两张表
原因:对应定长表的查询时的偏移量方便技术,所以速度快,但是如果定长表和不定长表需要经常联表,则不建议分表,毕竟联表查询效率不如单表查询
参考:http://database.51cto.com/art/201108/282615_all.htm
本文出自 “塞上名猪” 博客,请务必保留此出处http://zuohao1990.blog.51cto.com/6057850/1710726
原文地址:http://zuohao1990.blog.51cto.com/6057850/1710726