必须掌握的SQL 优化技巧,你GET到了吗?

B站影视 2025-01-11 21:18 2

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

以下是一些 SQL 优化技巧:

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

2、尽量避免在 where 子句中使用!=或操作符,否则引擎会放弃使用索引而进行全表扫描。

3、尽量避免在 where 子句中对字段进行 null 值判断,否则会导致引擎放弃使用索引而进行全表扫描。可以在字段上设置默认值,确保表中该列没有 null 值。

4、尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描。

5、对于一些可能导致全表扫描的查询,若要提高效率,可以考虑全文检索。

6、in 和 not in 也要慎用,否则会导致全表扫描。对于连续的数值,能用 between 就不要用 in。

7、如果在 where 子句中使用参数,也会导致全表扫描。可以改为强制查询使用索引。

8、应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。

9、应尽量避免在 where 子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。

10、不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。

11、在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。

12、不要写一些没有意义的查询,如需要生成一个空表结构,应采用更合适的方式以避免消耗系统资源。

13、很多时候用 EXISTS 代替 in 是一个好的选择。

14、并不是所有索引对查询都有效,SQL 是根据表中数据来进行查询优化的,当索引列有大量数据重复时,SQL 查询可能不会去利用索引。

15、索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过 6 个,若太多则应考虑一些不常使用到的列上建的索引是否有必要。

16、应尽可能的避免更新 clustered 索引数据列,因为 clustered 索引数据列的顺序就是表记录的物理存储顺序,一旦该列值改变将导致整个表记录的顺序的调整,会耗费相当大的资源。若应用系统需要频繁更新 clustered 索引数据列,那么需要考虑是否应将该索引建为 clustered 索引。

17、尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。

18、尽可能的使用 varchar/nvarchar 代替 char/nchar,因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。

19、任何地方都不要使用 select * from t,用具体的字段列表代替“*”,不要返回用不到的任何字段。

20、尽量使用表变量来代替临时表。

此外,还包括以下优化技巧:

准备数据方面:

创建合适的表结构和存储过程。

如创建学生表和特殊学生表,并通过存储过程进行数据插入。

索引介绍方面:

了解索引类型并正确建立索引,包括复合索引。

学会查看和删除索引。

SQL 优化案例方面:

避免使用 SELECT *,慎用 UNION 关键字,小表驱动大表,避免使用 or 条件(有争议),LIKE 语句优化,字符串字段优化,遵循最左匹配原则,COUNT 查询数据是否存在优化,LIMIT 关键字优化,提升 GROUP BY 的效率,避免使用!=或,避免 NULL 值判断,避免函数运算,JOIN 的表中使用索引字段,用 EXISTS 代替 IN。

其他优化方面:

数据插入优化,包括批量插入多行、通过事务插入、使用 LOAD DATA 指令。

主键优化,保证主键按顺序插入,避免主键更新。

ORDER BY 优化,使用索引排序,创建降序索引。

GROUP BY 优化,使用索引分组。

LIMIT 优化,采用覆盖索引优化。

COUNT 优化,优选 COUNT(*)。

UPDATE 优化,使用索引锁。

新增内容包括索引优化与查询缓存,创建适当的索引,避免过多或冗余索引,定期检查和优化现有索引,开启查询缓存并确保缓存策略适合应用需求,定期清理缓存。

尽量全值匹配。

使用适当的索引,避免 SELECT *,批量操作替代逐行处理,使用 EXISTS 替代 IN。

来源:心平氣和

相关推荐