MySQL优化

一、SQL语句

  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. 不要滥用MySQL的类型自动转换,如:数字3不要写为'3'

    原因:类型转换会增加不必要的性能开销

  6. 尽量避免使用模糊查询

二、建立索引

  1. 尽量使用唯一索引

  2. 尽量将索引建立在比较短的列上

    原因:通常越小的数据类型在内存、磁盘及CPU缓存中使用的空间更少,处理速度更快

  3. 尽量将索引建立在简单的数据类型上

    原因:简单的类型比字符串处理所需要的开销更小

  4. 不要建立过多的索引

    原因:每个索引都会占用一定空间,在插入时会影响效率,同时,在查询命令时进行执行计划也需要分析更多的内容,从而影响效率

  5. 尽量避免使用Null

    原因:含有空值的列很难进行查询优化,索引、索引的统计信息以及比较运算更加复杂。可以使用0、特殊字符或者空字符串进行替代

  6. 建立复合索引时,注意各列顺序

    原因:MySQL只能对最左边的索引进行有效搜索,而且,如果第一个匹配,就不会去判断第二个。假设存在组合索引it1c1c2(c1,c2),查询语句select * from t1 where c1=1 and c2=2能够使用该索引。查询语句select * from t1 where c1=1也能够使用该索引。但是,查询语句select * from t1 where c2=2不能够使用该索引,因为没有组合索引的引导列,即,要想使用c2列进行查找,必需出现c1等于某值。

三、分析优化

  1. 使用Explain查看select的情况。其中type字段显示连接使用了何种类型,从最好到最差的连接类型为const、eq_reg、ref、range、indexhe和ALL;

  2. select * from tableName procedure analyse();根据表中数据分析各字段使用情况进行建议优化。由于是根据表中现有数据分析,所以procedure analyse()是基于数据量足够大且查询远大于插入的后期优化

  3. 使用“垂直分割”的方式,将表分为定长(字段长度确定:表中没有如下类型的字段:  VARCHAR,TEXT,BLOB)和不定长的两张表

    原因:对应定长表的查询时的偏移量方便技术,所以速度快,但是如果定长表和不定长表需要经常联表,则不建议分表,毕竟联表查询效率不如单表查询

  4. 利用慢查询日志找出性能低劣的查询

  5. optimize table:optimize table tableName整理表

    原因:对表中数据进行大量删除后,会出现数据被删除但数据之前占用的空间没有被释放,而是等待新的数据来占用,使用optimize会重新整理这部分空间,使其被释放。修改存储索引(MyISAM、InnoDB)时也会重新整理空间



参考:http://database.51cto.com/art/201108/282615_all.htm

http://blog.chinaunix.net/uid-21783319-id-23926.html

http://www.cnblogs.com/hustcat/archive/2009/10/28/1591648.html


相关博文:SQL查询执行过程:http://zuohao1990.blog.51cto.com/6057850/1720116

你可能感兴趣的:(sql,优化,mysql,索引)