实战项目中总结出的MySQL优化策略

2023-03-05MySQL数据库

一、MySQL优化的重要性

实际项目中因慢查询、数据表设计问题,会导致系统性能下降、数据不一致、并发冲突等一系列难题。所以SQL优化非常重要,可以显著提升数据库系统的性能、响应速度和资源利用率,从而提供更好的用户体验和更高的系统可靠性。先了解下MySQL的执行过程:

二、MySQL优化策略细则详解

1、为WHERE及ORDER BY涉及的列建立索引

对查询进行优化,应该尽量避免全表扫描。所以首先应考虑在 WHERE 及 ORDER BY 涉及的列上建立索引。

2、在WHERE中使用默认值代替NULL

创建表时尽量不要使用NULL作默认值,可以使用0、-1作为默认值。因为在 !=、<>、is null、is not null等条件查询时,一般MySQL优化器会放弃走索引。

3、慎用 != 或 <> 操作符

应尽量避免在WHERE中使用 != 或 <> 操作符, 会导致全表扫描。MySQL只有对以下操作符才使用索引:<,<=,=,>,>=,BETWEEN,IN,以及某些时候的 LIKE。

4、慎用OR来连接条件

使用OR也可能会使索引失效,从而全表扫描。可以使用UNION合并查询代替:

select id from table_example where num=100
union all
select id from table_example where num=200

5、慎用IN和NOT IN

IN和NOT IN也会导致全表扫描。对于连续的数值,能用BETWEEN就不要用IN:select id from t where num between 100 and 200。

6、慎用左模糊LIKE '%…'

首页尽量避免模糊查询,如果必须使用,不采用全模糊查询,也应尽量采用右模糊查询,即like ‘…%’,是会使用索引的。左模糊like ‘%…’无法直接使用索引,但可以利用reverse + function index的形式,变化成 like ‘…%’。全模糊查询是无法优化的,一定要使用的话建议使用搜索引擎,比如 ElasticSearch。

7、注意索引并不是越多越好

索引可以提高相应的SELECT的效率,但同时也降低了INSERT及UPDATE的效率。一个表的索引数最好不要超过 6 个。所以要慎重考虑如何创建比较合适。

8、尽量使用数字型字段

因为引擎在处理查询和连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。所以字符会降低查询和连接的性能,并会增加存储开销。

9、尽量使用varchar代替char

varchar变长字段按数据内容实际长度存储,存储空间小,可以节省存储空间。char按声明大小存储,不足补空格。其次对于查询来说,在一个相对较小的字段内搜索,效率更高。

10、尽量不要使用SELECT *,而是用具体字段

SELECT *的弊端很多:增加很多不必要的消耗,比如CPU、IO、内存、网络带宽。增加了使用覆盖索引的可能性;增加了回表的可能性;当表结构发生变化时,前端也需要更改;查询效率低;

11、连接多个表时尽量使用使用表的别名(Alias)

当在 SQL 语句中连接多个表时,请使用表的别名并把别名前缀于每个 Column 上。这样一来,就可以减少解析的时间并减少那些由 Column 歧义引起的语法错误。

12、使用临时表暂存中间结果

优化MySQL语句的重要方法就是采用临时表暂存中间结果。但是临时表的好处远远不止这些,将临时结果暂存在临时表,后面的查询就在临时表中了,这可以避免程序中多次扫描主表,也大大减少了程序执行中“共享锁”阻塞“更新锁”,减少了阻塞,提高了并发性能。

13、表连接不宜过多

表连接(JOIN)不要超过 5 个。视图嵌套不要过深,一般视图嵌套不要超过 2 个为宜。

14、将需要查询的结果预先计算好

某些情况下,将需要查询的结果预先计算好放在表中,查询的时候再Select,而不是查询的时候进行计算。

三、MySQL数据库设计规范

严格遵循一定的设计规范,可以有效避免MySQL数据库过程中的诸多问题,从而到达软件运行更加的稳定、健壮。以下是我的MySQL数据库设计规范,可以点击查看,供参考。

版权声明:本文为老张的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://www.webppp.com/view/mysql_optimization_strategies.html