Mysql语句优化建议

时间:2024-09-23 15:34:50

一、建立索引

  1)考虑在 where 及 order by 涉及的列上建立索引

  2)对于模糊查询, 建立全文索引

  3)对于多主键查询,建立组合索引

二、避免陷阱

然而,一些情况下可能使索引无效:

  1)在 where 子句中对字段进行表达式操作

  2)在 where 子句中使用 or 来连接条件,如:

  select id from t where num=10 or num=20

    可以改为

select id from t where num=10
union all
select id from t where num=20

  3)在 where 子句中的“=”左边进行表达式运算(可能导致无法正确使用索引)

  4)在where 子句中使用参数,如:

select id from t where num=@num

  可以改为(强制使用索引):

select id from t with(index(索引名)) where num=@num

  5)如果该索引是组合索引,那么必须使用到该索引中的第一个字段作为查询条件, 而且尽可能让字段顺序与索引顺序一致

  6)并不是所有索引对查询都有效,SQL是根据表中数据来进行查询优化的,当索引列有大量数据重复时,SQL查询可能不会去利用索引

三、语句优化建议

  1)慎用in 和 not in, 如:

select id from t where num in(1,2,3)

  可以替代为:

select id from t where num between 1 and 3

  2)用具体字段代替*

  3)少用VARCHAR、 TEXT、BLOB类型

  4)字段表示固定值, 使用ENUM类型代替varchar(内部使用TINYINT)

  5)尽可能的使用 varchar/nvarchar 代替 char/nchar (变长字段存储空间小,节省存储空间,对于查询来说,在一个相对较小的字段内搜索效率显然要高些)

  6)如果类型不限制, 用int代替varchar(字符串一个个被匹配, 而数值则一次被处理)

  7)避免频繁创建和删除临时表,以减少系统表资源的消耗

  8)避免频繁创建和删除临时表,以减少系统表资源的消耗

  9)尽量避免大事务操作,提高系统并发能力

四、使用工具

  1)任何优化都是基于数据基础的。

  2)比较语句执行时间, 必要时使用Explain来跟踪查询情况