Mysql 优化
1.1. 批量插入数据
1.2. 避免出现select *
1.3. 避免使用insert…select…语句
因为 oracle 并不存在类似的问题,所以在 oracle 的应用中 insert...select...操作非常的常见。
优化建议
1.从可移植性上考虑,建议将单条语句分离为select与insert两部分,虽然相当于增加了网络传输次数,但不再会出现锁阻塞情况。
2.使用mysql语句语法,可以使用select...into outfile 和 load data infile 的组合来实现,这样也不会对表进行锁定。这种方法会使用外部文件,不事宜移植到其他平台。
1.4. update,delete语句需要有对应索引
优化建议
使用innodb存储引擎时,针对有大量并发修改(insert,update,delete)的表,评估sql语句并建立相应索引,保证语句不会走全表扫描。
1.5. 利用索引优化order by操作
1.6. 利用索引优化or条件
优化建议
建立符合索引,保证对通过or判断的列都同一条索引上。
1.7. 索引列上使用函数导致不使用索引
1.8. like子句上使用前缀%导致不使用索引
优化建议
在应用程序中,考虑增加对这些大表查询输入条件的限制,从性能角度考虑,尽量避免出现以%为前缀的数据查询。防止应用程序提交大量会引起大表全表扫描的查询。
1.9. 语句仅包含复合索引非前导列导致不使用索引
1.10. 隐式类型转换造成不使用索引
1.11. 对索引字段进行运算导致不使用索引
1.12. 对索引字段进行是否null值判断导致不使用索引
1.13. 对索引字段使用不等于符号导致不使用索引
使用索引列作为条件进行查询时,需要避免使用<>或者!=等判断条件。
1.14. 使用join子句来优化子查询
1.15. 优化union语句
除非确实要消除重复的行,否则建议使用union all。原因在于如果没有all这个关键词,mysql会给临时表加上distinct选项,这会导致对整个临时表的数据做唯一性校验,这样做的消耗相当高。
1.16. 使用合理的分页方式以提高分页效率
1.17. 避免重复查询更新的数据
问题案例
update t1 set time=now() where col1=1;
select time from t1 where id =1;
问题分析
上述语句为了获取更新,相当于对同一张表执行了两次查询,当基表数据量大的时候,通过这种方式获取更新的数据效率上不是最好的。针对业务中经常出现的更新行同时又希望获得改行信息的需求,mysql并不支持postgresql那样的update returning语法,在mysql中可以通过变量实现。
优化建议
update t1 set time=now () where col1=1 and @now: = now ();
select @now;
前后二者都需要两次网络来回,但使用变量避免了再次访问数据表,特别是当t1表数据量较大时,后者比前者快很多。
1.18. 避免出现不确定结果的函数
1.19. 错误使用 order by rand()
优化建议:随机值由应用端获取,在数据库中只执行实际值。