数据库|快速提升性能的SQL语句,建议收藏

数据库|快速提升性能的SQL语句,建议收藏

文章图片

数据库|快速提升性能的SQL语句,建议收藏



?本文会提到 52 条 SQL 语句性能优化策略 。
1、对查询进行优化 , 应尽量避免全表扫描 , 首先应考虑在 WHERE 及 ORDER BY 涉及的列上建立索引 。
2、应尽量避免在 WHERE 子句中对字段进行 NULL 值判断 , 创建表时 NULL 是默认值 , 但大多数时候应该使用 NOT NULL , 或者使用一个特殊的值 , 如 0 , -1 作为默认值 。
3、应尽量避免在 WHERE 子句中使用 != 或 <> 操作符 。 MySQL 只有对以下操作符才使用索引:< , <= , = , > , >= , BETWEEN , IN , 以及某些时候的 LIKE 。
4、应尽量避免在 WHERE 子句中使用 OR 来连接条件 , 否则将导致引擎放弃使用索引而进行全表扫描 , 可以使用 UNION 合并查询:select id from t where num=10 union all select id from t where num=20 。
5、IN 和 NOT IN 也要慎用 , 否则会导致全表扫描 。 对于连续的数值 , 能用 BETWEEN 就不要用 IN:select id from t where num between 1 and 3 。
6、下面的查询也将导致全表扫描:select id from t where name like‘%abc%’或者select id from t where name like‘%abc’若要提高效率 , 可以考虑全文检索 。 而select id from t where name like‘abc%’才用到索引 。
7、如果在 WHERE 子句中使用参数 , 也会导致全表扫描 。
8、应尽量避免在 WHERE 子句中对字段进行表达式操作 , 应尽量避免在 WHERE 子句中对字段进行函数操作 。
9、很多时候用 EXISTS 代替 IN 是一个好的选择:select num from a where num in(select num from b) 。 用下面的语句替换:select num from a where exists(select 1 from b where num=a.num) 。
10、索引固然可以提高相应的 SELECT 的效率 , 但同时也降低了 INSERT 及 UPDATE 的效 。 因为 INSERT 或 UPDATE 时有可能会重建索引 , 所以怎样建索引需要慎重考虑 , 视具体情况而定 。 一个表的索引数最好不要超过 6 个 , 若太多则应考虑一些不常使用到的列上建的索引是否有必要 。
11、应尽可能地避免更新 clustered 索引数据列 ,因为 clustered 索引数据列的顺序就是表记录的物理存储顺序 , 一旦该列值改变将导致整个表记录的顺序的调整 , 会耗费相当大的资源 。 若应用系统需要频繁更新 clustered 索引数据列 , 那么需要考虑是否应将该索引建为 clustered 索引 。
12、尽量使用数字型字段 , 若只含数值信息的字段尽量不要设计为字符型 , 这会降低查询和连接的性能 , 并会增加存储开销 。
13、尽可能地使用 varchar nvarchar 代替 char nchar 。 因为首先变长字段存储空间小 , 可以节省存储空间 , 其次对于查询来说 , 在一个相对较小的字段内搜索效率显然要高些 。
14、最好不要使用返回所有:select from t , 用具体的字段列表代替 “*” , 不要返回用不到的任何字段 。
15、尽量避免向客户端返回大数据量 , 若数据量过大 , 应该考虑相应需求是否合理 。
16、使用表的别名(Alias):当在 SQL 语句中连接多个表时 , 请使用表的别名并把别名前缀于每个 Column 上 。 这样一来 , 就可以减少解析的时间并减少那些由 Column 歧义引起的语法错误 。



**【需要Java面试题或者技能提升资料的小伙伴点赞+转发 , 关注我之后私信【666】或【888】后 , 即可获取】**)
17、使用“临时表”暂存中间结果 :
简化 SQL 语句的重要方法就是采用临时表暂存中间结果 。 但是临时表的好处远远不止这些 , 将临时结果暂存在临时表 , 后面的查询就在 tempdb 中了 , 这可以避免程序中多次扫描主表 , 也大大减少了程序执行中“共享锁”阻塞“更新锁” , 减少了阻塞 , 提高了并发性能 。