- select 检索的规范性
- 尽量避免使用select *
一种是可能取出很多不需要的数据,对于宽表来说,这是灾难;
一种是尽可能避免回表,因为取一些根本不需要的数据而回表导致性能低下,是很不合算。
join语句使用select *可能导致只需要访问索引即可完成的查询需要回表取数。
- 严禁使用
select * from t_name ,而不加任何where条件
同样样会变成全表全字段扫描。
- MySQL中的text类型字段存储:
3.1、不与其他普通字段存放在一起,因为读取效率低,也会影响其他轻量字段存取效率。
3.2、如果不需要text类型字段,又使用了select *,会让该执行消耗大量io,效率也很低下
- 字段上使用函数
在取出字段上可以使用相关函数,但应尽可能避免出现 now() , rand() , sysdate() 等不确定结果的函数
在Where条件中的过滤条件字段上严禁使用任何函数,包括数据类型转换函数。
大量的计算和转换会造成效率低下。
- 分页查询语句
全部都需要带有排序条件 , 否则很容易引起乱序
- 用in()/union替换or
效率会好一些,并注意in的个数小于300
- 严禁使用%前缀进行模糊前缀查询:
如:select a,b,c from t_name where a like ‘%name’;
可以使用%模糊后缀查询如:select a,b from t_name where a like ‘name%’;
- 避免使用子查询
可以把子查询优化为join操作
通常子查询在in子句中,且子查询中为简单SQL(不包含union、group by、order by、limit从句)时,才可以把子查询转化为关联查询进行优化。
- 子查询性能差的原因:
子查询的结果集无法使用索引,通常子查询的结果集会被存储到临时表中,不论是内存临时表还是磁盘临时表都不会存在索引,所以查询性能 会受到一定的影响;
特别是对于返回结果集比较大的子查询,其对查询性能的影响也就越大;
由于子查询会产生大量的临时表也没有索引,所以会消耗过多的CPU和IO资源,产生大量的慢查询。
- 操作的规范性
- 禁止使用不含字段列表的INSERT语句
如:insert into values ('a','b','c'); 应使用 insert into t_name(c1,c2,c3) values ('a','b','c'); 。
- 大批量写操作(UPDATE、DELETE、INSERT)
需要分批多次进行操作
大批量操作可能会造成严重的主从延迟,特别是主从模式下,大批量操作可能会造成严重的主从延迟,因为需要slave从master的binlog中读取日志来进行数据同步。
binlog日志为row格式时会产生大量的日志