当前位置: 移动技术网 > IT编程>数据库>Mysql > Mysql 优化

Mysql 优化

2019年02月04日  | 移动技术网IT编程  | 我要评论

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

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网