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 优化的主要内容,如果未能解决你的问题,请参考以下文章

mysql 优化包括哪些内容?

Mysql的性能优化

Mysql的性能优化

MySQL优化

mysql优化-优化入门之MySQL的优化介绍及执行步骤

mysql 子查询 优化