欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Mysql 优化

程序员文章站 2022-09-04 18:58:05
1.1. 批量插入数据 1.2. 避免出现select * 1.3. 避免使用insert…select…语句 因为 oracle 并不存在类似的问题,所以在 oracle 的应用中 insert...select...操作非常的常见。 优化建议1.从可移植性上考虑,建议将单条语句分离为select ......

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()

优化建议:随机值由应用端获取,在数据库中只执行实际值。