推广 热搜: csgo  vue  2023  angelababy  gps  信用卡  新车  htc  落地  控制 

40种常见的SQL语句性能优化方式

   2023-08-18 网络整理佚名2440
核心提示:最好不要使用触发器,触发一个触发器,执行一个触发器事件本身就是一个耗费资源的过程;如果能够使用约束实现的,尽量不要使用触发器;不要为不同的触发事件(,和)使用相同的触发器;不要在触发器中使用事务型代码;关键字可以让你知道MySQL是如何处理你的SQL语句的,这可以帮你分析你的查询语句或是表结构的性能瓶颈。可以在执行sql前调用begin,多条sql形成一个事物(即使打开也可以),将大大提高性能。

作为一名开发人员,每天都要和数据库打交道,比如MySQL、等都是常见的数据库产品; 而处理的方式无非就是建数据库、建表、写SQL、写存储过程、写视图、写触发器。 其中“写SQL”应该是最常做的事情。 本文将列出几十种常见的SQL语句性能优化方法。 建议您将它们添加为书签!

1. SQL查询应尽量避免全表扫描。 首先要考虑的是对where和order by涉及到的列建立索引

2、尽量避免在where子句中判断字段的空值。 NULL是创建表时的默认值,但大多数时候应该使用NOT NULL,或者使用特殊的值,如0、-1作为默认值;

3. 尽量避免在where子句中使用!=或运算符。 MySQL 仅对以下运算符使用索引:=、IN,有时还有 LIKE;

4、尽量避免在where子句中使用or来连接条件,否则可能会导致引擎放弃使用索引而进行全表扫描。 可以考虑使用UNION来合并查询,例如:

from t where id=10 联合来自 t where id=20 的所有名称;

5、谨慎使用in和not in,否则可能会导致全表扫描。 对于连续值,如果可以使用就不要使用in,例如:

从 t 开始,其中年龄 1 和 3;

6、下面的查询也会导致全表扫描: id from t where name like '%abc%' 或 id from t where name like '%abc' 为了提高效率,可以考虑全文检索; 和 id from t where name Like 'abc%' 仅使用索引;

7、如果where子句中使用了参数,也会引起全表扫描;

8、尽量避免对where子句中的字段进行表达式操作,尽量避免对where子句中的字段进行函数操作;

9、很多情况下,替换in是一个不错的选择,比如id,age from a where id in (id from b)。 替换为以下语句:

,来自 a 的年龄(其中 1 来自 b,其中 id=a.id);

10、索引可以提高效率,但同时也会降低效率,因为索引可能时不时地重建,所以如何构建索引需要仔细考虑,根据具体情况而定; 一个表的索引数量最好不要超过6个,如果太多,就应该考虑是否有必要对一些不经常使用的列建立索引;

11. 尝试使用数字字段。 如果只包含数字信息的字段尽量不要设计为字符类型,这样会降低查询和连接的性能,并且会增加存储开销;

12、尽量用/代替char/nchar,因为首先变长字段的存储空间小,可以节省存储空间,其次对于查询来说,在比较小的字段中搜索效率明显提高更高;

14、最好不要使用*返回全部:* from t,将“*”替换为具体字段列表,并且不要返回任何未使用的字段:id、age、name from t

15.尽量避免向客户端返回大量数据。 如果数据量太大,则应考虑相应的需求是否合理;

16、使用表的别名(Alias):在SQL语句中连接多个表时,请使用表的别名,并将别名前缀到每个字段列上,这样可以减少分析时间和那些语法错误造成的按字段列歧义;

17、使用“临时表”临时存储中间结果:

简化SQL语句的一个重要方法是使用临时表来临时存储中间结果。 然而,临时表的好处远不止这些。 临时结果暂时存放在临时表中,后续的查询都在中间,这样可以避免程序中多次扫描主表,也大大减少了程序执行过程中“共享锁”阻塞“更新锁”的情况,减少阻塞,提高并发性表现;

18、增加一些SQL查询语句:

读和写会互相阻塞。 为了提高并发性能,可以增加一些查询,这样读的时候就可以允许写,但缺点是可能会读到未提交的脏数据; 使用原则三:查询结果,用于“插入、删除、修改”的不能添加; 查询表属于频繁分页,需谨慎使用; 使用临时表还可以节省“数据影子”,它具有与undo表空间类似的功能,并且可以不使用临时表来提高并发性能;

19、常见的简化规则如下:不要超过5个表连接(JOIN),考虑使用临时表或表变量来存储中间结果; 少用子查询,视图嵌套不要太深,一般嵌套不超过2个为宜;

20、查询前预先计算好需要查询的结果并放入表中; 这是SQL7.0之前最重要的方法:比如医院住院费用的计算。

21、IN后的值列表中,将最频繁的值放在前面,将最不频繁的值放在最后,以减少判断次数;

22。 尽量将数据处理放在服务器上,以减少网络开销,例如使用存储过程; 存储过程是经过编译、优化、组织成执行计划并存储在数据库中的 SQL 语句。 流语言的采集当然是快的; 重复执行的动态SQL可以使用临时存储过程,过程(临时表)放在.

23、尽量用">=代替">";

24。 索引使用规范:索引的创建要结合应用来考虑。 建议大型OLTP表不要超过6个索引; 尽可能使用索引字段作为查询条件,尤其是簇索引,必要时可以使用索引强制指定索引;查询大表时避免表扫描,必要时考虑创建新索引; 使用索引字段作为条件时,如果该索引是联合索引,那么必须使用索引中的第一个字段作为条件,以保证系统使用该索引,否则不会使用该索引; 注意索引的维护,定期重建索引,重新编译存储过程。

25、以下SQL条件语句中的列索引正确,但执行速度很慢:

* FROM WHERE (,1,4)='5378' (13 秒)

* 从哪里 /30< 1000 (11 秒)

* FROM WHERE (char(10),日期,112)='' (10 秒)

分析:

SQL运行时,WHERE子句中对列的任何操作的结果都是逐列计算的,因此必须在不使用列索引的情况下进行表搜索; 如果在查询编译时能够得到这些结果,那么就可以通过SQL优化器进行优化,使用索引,避免表搜索,所以重写SQL如下:

* FROM WHERE 例如“5378%”(< 1 秒)

* 来自 < 1000*30 (< 1 秒)

* FROM WHERE 日期 = '1999/12/01' (< 1 秒)

26、当有一批数据需要批量插入或更新时,应该更多的是批量插入或更新的方式,不建议一次更新一条记录;

27、为了提高GROUP BY语句的效率,可以在GROUP BY之前过滤掉不必要的记录。 以下两个查询返回相同的结果,但第二个查询显然要快得多。

低效版本:

, AVG(SAL) 来自 EMP 组(按作业) JOB ='' 或 JOB =''

高效版本:

, AVG(SAL) FROM EMP WHERE JOB =''OR JOB ='' 按工作分组

28. 数据库的SQL语句是大写的,因为SQL语句总是先解析,在执行之前将小写字母转换为大写;

29. 别名的使用,别名是大型数据库的应用技巧,即在查询中用字母给表名和列名起别名,查询速度比建连接表快1.5倍。

30. 避免死锁,在存储过程和触发器中始终以相同的顺序访问同一个表; 事务应尽可能缩短,并且事务所涉及的数据量应尽可能减少; 从不在事务中等待用户输入;

31、最好不要使用触发器,触发触发器,执行触发事件本身就是一个消耗资源的过程; 如果可以使用约束来实现,尽量不要使用触发器; 不要对不同的触发事件使用触发器(、)使用相同的触发器; 不要在触发器中使用事务代码;

32条索引创建规则:

(1)表的主键和外键必须有索引;

(2)超过300条数据的表应有索引;

(3)对于经常与其他表连接的表,应在连接字段上建立索引;

(4)Where子句中经常出现的字段,尤其是大表的字段,应该建立索引;

(5) 索引应建立在选择性能高效的字段上;

(6)索引应该建立在小字段上,不要为大文本字段甚至超长字段建立索引;

(7)复合索引的建立需要认真分析,尽量考虑用单字段索引替代;

(8)正确选择组合索引中的主列字段,一般是选择性较好的字段;

(9)复合索引的几个字段是否经常以AND的形式同时出现在Where子句中? 单字段查询很少甚至没有吗? 如果是,则可以建立复合索引; 否则,考虑单字段索引;

(10)如果复合索引包含的字段经常单独出现在Where子句中,则将其分解为多个单字段索引;

(11)如果复合索引包含的字段超过3个,则仔细考虑其必要性,考虑减少复合字段;

(12)如果这些字段同时存在单字段索引和复合索引,则一般可以删除复合索引;

(13)不要对数据操作频繁的表创建过多的索引;

(14)删除无用的索引,避免对执行计划产生负面影响;

(15)表上创建的每个索引都会增加存储开销,索引也会增加插入、删除、更新操作的处理开销。 另外,太多的复合索引在单字段索引的情况下一般是没有用的; 相反,它们还会降低数据增删的性能,特别是对于频繁更新的表,其负面影响就更大了。

(16)尽量不要对数据库中包含大量重复值的字段建立索引。

33、MySQL查询优化总结:

(1)使用慢查询日志来查找慢查询,使用执行计划来确定查询是否正常运行,经常测试你的查询,看看它们是否运行在最佳状态; 性能总是会随着时间的推移而变化,避免在整个表上运行使用count(*),这可能会锁定整个表,使查询保持一致,以便后续类似的查询可以使用查询缓存;

(2)使用GROUP BY代替适当的情况,在WHERE、GROUP BY和ORDER BY子句中使用索引列,保持索引简单,不要在多个索引中包含同一列,有时MySQL会使用错误的索引,使用USE INDEX这种情况,检查使用=的问题,对于记录数小于5的索引字段,在UNION中使用LIMIT而不是OR。

(3)为了避免使用ON KEY或者,不使用来实现,不使用MAX,在更新之前使用索引字段和ORDER BY子句,LIMIT M, N在某些情况下实际上可以减慢查询速度,克制使用,在WHERE子句中使用UNION而不是子查询,重新启动MySQL后,记得预热数据库以确保数据在内存中并且查询速度快,考虑持久连接而不是多个连接以减少开销,基准查询,包括使用负载在服务器上,有时一个简单的查询会影响其他查询,当你的服务器上的负载增加时,使用SHOW查看缓慢的和有问题的查询,在开发环境中生成的镜像数据中测试所有可疑的查询。

34、数据库中的每个表都应该设置一个ID作为其主键,最好是INT类型(推荐),并设置自动增加标志。

35、MySQL查询可以启用高速查询缓存,这是提高数据库性能的有效MySQL优化方法之一。 当多次执行相同的查询时,从缓存中获取数据并直接从数据库返回要快得多。

36、查询用于跟踪查看效果:

使用关键字可以让你知道MySQL是如何处理你的SQL语句的,这可以帮助你分析你的查询语句或表结构的性能瓶颈。 查询结果还会告诉你你的索引主键是如何使用的,你的数据表是如何搜索和排序的......等等。

37. 当只有一行数据时使用 LIMIT 1:

当你在某个时刻查询表时,你已经知道结果只会有一个结果,但是因为你可能需要获取游标,或者你可能会检查返回的记录数。 在这种情况下,添加 LIMIT 1 可以提高性能。 这样,MySQL数据库引擎在找到一条数据后就会停止搜索,而不是继续搜索下一条与该记录匹配的数据。

38.为表选择合适的存储引擎:

(1):应用以读和插入操作为主,只有少量的更新和删除,事务的完整性和并发性要求不是很高。

(2):事务处理,以及并发条件下要求的数据一致性。 除了插入和查询之外,还包括许多更新和删除。 (有效减少删除和更新引起的锁)。 对于支持事务的表,影响速度的主要原因是默认设置是打开的,程序没有显式调用BEGIN启动事务,导致每次插入的项都会自动提交,严重影响速度。 可以在执行sql之前调用begin,多个sql形成一个事物(即使打开了),这样会大大提高性能。

39、优化表的数据类型,选择合适的数据类型:

原则:越小越好,简单就好,所有字段必须有默认值,尽量避免null。

例如:在设计数​​据库表时,尽可能使用较小的整数类型,以占用更少的磁盘空间。 (比int更合适)

例如时间字段:and,占用8个字节,and占用4个字节,只使用了一半,表示的范围是1970-2037,适合更新时间

MySQL可以很好地支持大量数据的访问,但一般来说,数据库中的表越小,对其执行查询的速度就越快。

因此,在创建表时,为了获得更好的性能,我们可以将表中字段的宽度设置得尽可能小;

40.对列的任何操作都会导致表扫描,其中包括数据库函数、计算表达式等,查询时尽量将操作移到等号右边

说最后一句话

最近在跳槽面试季,debug专门录制了一套课程:. (点击蓝字可查看课程详情)

课程主要内容如下:

1、以企业实际业务场景和功能需求为驱动,采用各种主流技术实现;

2、以理论为辅,以实战为主,最终目标是实现业务功能需求,追求绩效,坚守一个目标;

3、深入底层,结合应用场景分析技术的实现原理;

课程大纲如下图所示:

详细的课程目录和上课内容可以在PC端打开链接查看:

(请复制到电脑上查看~)

 
反对 0举报 0 收藏 0 打赏 0评论 0
 
更多>同类资讯
推荐图文
推荐资讯
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报
Powered By DESTOON