Mysql 优化
Posted maxytj
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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()
优化建议:随机值由应用端获取,在数据库中只执行实际值。
以上是关于Mysql 优化的主要内容,如果未能解决你的问题,请参考以下文章