SQL优化的15个小技巧,纯干货分享!

17 篇文章 6 订阅
订阅专栏

  前言:这次准备了100W的数据进行SQL性能测试,数据库采用的是MySQL,总共介绍了常见的15种SQL优化方式,每一种优化方式都进行了实打实的测试,逐行讲解,通俗易懂!

目录

一、准备数据

1.1、创建表结构

1.2、创建存储过程 

二、索引介绍

2.1、类型介绍

2.2、建立索引

2.3、建立复合索引

2.4、查看所有建立的索引

2.5、删除索引

三、EXPLAIN分析参数说明

四、SQL优化案例

4.1、避免使用SELECT *

4.2、慎用UNION关键字

4.3、小表驱动大表 

4.4、避免使用or条件(有争议)

4.5、LIKE语句优化

4.6、字符串字段优化

4.7、最左匹配原则(重要)

4.8、COUNT查询数据是否存在优化 

4.9、LIMIT关键字优化 

4.10、提升GROUP BY的效率

4.11、避免使用!=或<>

4.12、避免NULL值判断

4.13、避免函数运算

4.14、JOIN的表中使用索引字段

4.15、用EXISTS代替IN

五、总结


一、准备数据

提前准备一张学生表数据和一张特殊学生表数据,用于后面的测试用。

1.1、创建表结构

创建一个学生表:

CREATE TABLE student (
  id int(11) unsigned NOT NULL AUTO_INCREMENT,
  name varchar(50) DEFAULT NULL,
  age tinyint(4) DEFAULT NULL,
  id_card varchar(20) DEFAULT NULL,
  sex tinyint(1) DEFAULT '0', 
  address varchar(100) DEFAULT NULL,
  phone varchar(20) DEFAULT NULL, 
  create_time timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  remark varchar(200) DEFAULT NULL,
  PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

再创建一个特殊学生表:

CREATE TABLE special_student (
  id int(11) unsigned NOT NULL AUTO_INCREMENT,
  stu_id int(11) DEFAULT NULL,
  PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

1.2、创建存储过程 

在学生表中插入100w条数据,手动开启和提交事务,每插入1w条记录后,手动COMMIT一次事务,最后再COMMIT一次以提交剩下的记录,这样可以让插入速度更快,因为不需要为每条记录都 COMMIT,从而降低 IO 次数。

CREATE PROCEDURE insert_student_data()
BEGIN
  DECLARE i INT DEFAULT 0; 
  DECLARE done INT DEFAULT 0; 
  DECLARE continue HANDLER FOR NOT FOUND SET done = 1;
  START TRANSACTION;  
   WHILE i < 1000000 DO
     INSERT INTO student(name,age,id_card,sex,address,phone,remark)
     VALUES(CONCAT('姓名_',i), FLOOR(RAND()*100),
         FLOOR(RAND()*10000000000),FLOOR(RAND()*2),
         CONCAT('地址_',i), CONCAT('12937742',i),
         CONCAT('备注_',i));
     SET i = i + 1; 
     IF MOD(i,10000) = 0 THEN 
       COMMIT;
       START TRANSACTION;
     END IF;     
   END WHILE;    
   COMMIT;
END

执行学生表的存储过程:

CALL insert_student_data();

在特殊学生表中随机插入100条学生表中的id:

CREATE PROCEDURE insert_special_student()
BEGIN
  DECLARE i INT DEFAULT 0; 
  WHILE i < 100 DO
    INSERT INTO special_student (stu_id) VALUES (FLOOR(RAND()*1000000));  
    SET i = i + 1;   
  END WHILE;
END

执行特殊学生表的存储过程: 

CALL insert_special_student();

二、索引介绍

2.1、类型介绍

普通索引最基本的索引,没有任何限制
唯一索引与普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值
主索引即主键索引,关键字PRIMARY
复合索引为了更多的提高MySQL效率可建立组合索引,遵循“最左前缀”原则
全文索引可用于MyISAM表,MySQL5.6之后也可用于innodb表,用于在一篇文章中,检索文本信息的, 针对较大的数据,生成全文索引很耗时和空间

2.2、建立索引

CREATE INDEX id_card_index ON student(id_card);

2.3、建立复合索引

CREATE INDEX name_address_phone_index ON student(name,address,phone);

2.4、查看所有建立的索引

SHOW INDEX FROM student;

2.5、删除索引

ALTER TABLE 表名 DROP INDEX 索引名称;

三、EXPLAIN分析参数说明

1、id:SELECT语句的编号。可以通过id来区别多条SELECT语句。

2、select_type:SELECT类型,主要有SIMPLE、PRIMARY、DERIVED等类型。

SIMPLE:简单的SELECT(不含子查询及UNION)。

PRIMARY:查询中最外层的SELECT。

DERIVED:包含的子查询中的SELECT。

3、table:显示这一行的数据是关于哪张表的。

4、partitions:匹配的分区信息。

5、type:显示连接使用了何种类型。

最好到最差的连接类型为 system > const > eq_reg > ref > range > index > ALL.

system

表只有一行记录(等于系统表)
const使用常量进行索引查询
eq_ref唯一索引扫描,通常使用主键约束
ref非唯一性索引扫描
range索引范围扫描
index全索引扫描
ALL全表扫描

6、possible_keys:显示可能应用在这张表中的索引。

7、key:实际使用的索引。

8、key_len:使用的索引的长度。

9、ref:显示索引的哪一列被使用。

10、rows:根据表统计信息及索引条件估算,查询返回的且接近的行数

11、filtered:显示了通过条件过滤出的行数的百分比估计值。

12、Extra:包含不适合在其他列展示但是需要展示的信息。

四、SQL优化案例

4.1、避免使用SELECT *

有的时候,我们为了图方便,会直接使用SELECT * 一次性查出表中所有的数据:

SELECT * FROM student

执行结果如图所示:

可以看到,执行时间花了2s左右,耗时很长!

在实际开发中,我们给页面展示的数据可能就只要2-3个字段,如果直接全部查出来了,岂不是白白浪费了字段,同时也损耗了性能,这是因为SELECT * 不会走覆盖索引,会出现大量的回表操作,从而导致SQL性能大幅度降低。

我们上面建立了联合索引,我们就可以只查询索引列,这样会大幅度提升查询效率,优化的SQL如下:

SELECT name,address,phone FROM student

执行结果如图所示:

这样执行的速度大大提高!

分析SQL:

使用EXPLAIN关键字执行这段SQL:

EXPLAIN SELECT name,address,phone FROM student

执行结果如图所示:

确实走了我们建立的复合索引。 

4.2、慎用UNION关键字

例如我们根据性别去查询所有学生的信息,虽然这种操作多此一举,直接SELECT *就好了,为了演示这2个关键字的详细区别,使用UNION关键字执行的SQL如下:

SELECT * FROM student WHERE sex = 0
UNION 
SELECT * FROM student WHERE sex = 1

执行结果如图所示: 

我滴妈,查了100w条足足整整等了32s左右,这个速度要是放到系统上,查个数据等到娃娃菜都凉了!

这是因为在使用UNION执行完SQL后,会帮我们获取所有数据并去掉重复的数据,性能的损耗就在这里,而UNION ALL和UNION相反,帮我们获取所有数据但会保留重复的数据。

我们改用UNION ALL关键字,优化的SQL如下:

SELECT * FROM student WHERE sex = 0
UNION ALL
SELECT * FROM student WHERE sex = 1

执行结果如图所示:

同样查询100w条数据,这边执行速度大大提高了,只用到了3s左右! 

4.3、小表驱动大表 

言简意赅,意思就是让小表查出来的数据去再查询大表当中的数据。比如我们想查询学生表当中特殊学生的信息,我们就可以使用以special_student这个小表去驱动student这个大表,SQL如下:

SELECT * FROM student WHERE id 
IN (SELECT stu_id FROM special_student)

执行结果如图所示:

只用了0.02s,速度很可观!因为IN关键字中的子查询语句,子查询语句的数据量很少,所以查询速度会很快!

4.4、避免使用or条件(有争议)

如果我们要查询指定的性别或者指定的身份证号码的学生,执行SQL如下:

SELECT * FROM student WHERE sex = 0 OR id_card = '7121877527789'

执行结果如图所示:

总共查询了近50w条数据,耗时1.4s左右,我们改用UNION ALL关键字查询:

SELECT * FROM student WHERE sex = 0 
UNION ALL 
SELECT * FROM student WHERE id_card = '7121877527789'

执行结果如图所示:

和上面查询的数据量一样,好事在1.7s左右,怎么会没什么区别呢?

分析SQL: 

使用EXPLAIN关键字分析一下使用OR关键字的这段SQL:

EXPLAIN SELECT * FROM student WHERE SEX = 0 OR id_card = '7121877527789'

执行结果如图所示: 

很明显,虽然可能会用到建立id_card的索引,正因为sex这个字段没有建立索引,还是走了一次全表扫描。

使用EXPLAIN关键字执行这段SQL:

EXPLAIN
SELECT * FROM student WHERE sex = 0 
UNION ALL 
SELECT * FROM student WHERE id_card = '7121877527789'

执行结果如图所示:

很明显条件是sex的走了全表,但是id_card走了索引,所以依旧还是走了一次全表扫描,所以网上说的关于UNION ALL代替OR的,我这边实测感觉还是存在争议的!

4.5、LIKE语句优化

平时我们日常开发用到的LIKE关键字进行模糊匹配会非常多,但是有的情况会使索引失效,导致查询效率变慢,例如:

只要身份证字段包含50就查出来,执行SQL如下:

SELECT * FROM student WHERE id_card like '%50%'

执行结果如图所示:

用了0.8s左右。

只要身份证号码以50结尾就查出来,执行SQL如下:

SELECT * FROM student WHERE id_card like '%50'

执行结果如图所示:

用了0.4s左右。

只要身份证号码以50开头的就查出来,执行SQL如下:

SELECT * FROM student WHERE id_card like '50%'

执行结果如图所示:

这次执行非常快,0.08s左右。

分析SQL:

使用EXPLAIN关键字执行这段SQL:

EXPLAIN SELECT * FROM student WHERE id_card like '%50%'

执行结果如图所示:

很明显走了全表扫描!

使用EXPLAIN关键字执行这段SQL:

EXPLAIN SELECT * FROM student WHERE id_card like '%50'

执行结果如图所示:

依旧走了全表扫描!

使用EXPLAIN关键字执行这段SQL:

EXPLAIN SELECT * FROM student WHERE id_card like '50%'

执行结果如图所示:

这次便走了索引!

4.6、字符串字段优化

查询指定的身份证号码的学生,如果我们平时疏忽了给身份证号码加上单引号,执行SQL如下:

SELECT * FROM student WHERE id_card = 5040198345

执行结果如图所示:

耗时0.4s左右。

给身份证号码加上单引号,优化的SQL如下:

SELECT * FROM student WHERE id_card = '5040198345'

执行结果如图所示:

耗时0.02s左右,这次明显快多了!

分析SQL:

使用EXPLAIN关键字执行这段SQL:

EXPLAIN SELECT * FROM student WHERE id_card = 5040198345

执行结果如图所示:

可能用到了id_card的索引,但是还是走了全表扫描!

使用EXPLAIN关键字执行这段SQL:

EXPLAIN SELECT * FROM student WHERE id_card = '5040198345'

执行结果如图所示: 

这边走了索引。 

4.7、最左匹配原则(重要)

上面我们按照name,address和phone这个顺序建立了复合索引,相当于建立了(name),(name、address)和(name、address、phone)三个索引,如果我们查询的where条件违背了建立的顺序,则复合索引就失效了,下面直接进行SQL分析:

分析SQL:

使用EXPLAIN关键字执行这段SQL:

EXPLAIN SELECT * FROM student WHERE name = '姓名_4' and phone = '7121877527' and address = '地址_4'

执行结果如图:

为什么明明违背了最左匹配原则,依旧还是走了复合索引呢?可能是如下原因:

1、通过索引过滤性能足够好,所以还是选择利用索引。

2、联合索引中前几个字段过滤效果较好,所以仍然选择利用索引。

可能的执行计划大概是:

1、优先通过phone字段过滤,将要扫描的记录减少一部分。
2、然后通过address字段继续过滤,再减少一部分记录。
3、最后通过name字段过滤,已经剩下很少的记录需要扫描。
4、尽管违反了最左匹配,解释器可能认为仍然利用索引效率比较高。

所以总的来说,就是解释器会根据实际情况进行权衡,即使是违反最左匹配原则,也可能会选择利用索引。但这并不是一个良好的查询优化,最好还是严格遵守最左匹配原则。

以下是严格遵守最左匹配原则的SQL:

SELECT * FROM student WHERE name = '姓名_4' 
SELECT * FROM student WHERE name = '姓名_4' and address = '地址_4' 
SELECT * FROM student WHERE name = '姓名_4' and address = '地址_4' and phone = '7121877527' 

4.8、COUNT查询数据是否存在优化 

比如我想判断年龄为18岁的学生是否存在,我们往往会执行如下SQL:

SELECT COUNT(*) FROM student WHERE age = 18

执行结果如图所示:

耗时0.4s左右,虽然知道学生年龄18岁存在,但是没必要查询出这么多数量出来,我们只要知道是否存在即可!

不再使用COUNT,而是改用LIMIT 1,让数据库查询时遇到一条就返回,这样就不要再继续查找还有多少条了,优化的SQL如下:

SELECT 1 FROM student WHERE age = 18 LIMIT 1

执行结果如图所示:

耗时0.01s左右,很快就知道了。 

4.9、LIMIT关键字优化 

 平日开发工作中,我们对于分页的处理一般是这样的:

SELECT * FROM student LIMIT 999910,10

执行结果如图所示: 

耗时0.56s,但是因为我们的ID属于自增长,所以我们可以在此基础上进行一定的优化,优化的SQL如下: 

SELECT * FROM student WHERE ID >= 999910 LIMIT 10

执行结果如图所示:

仅仅用时0.02s,非常快!

4.10、提升GROUP BY的效率

我们平日写SQL需要多多少少会使用GROUP BY关键字,它主要的功能是去重和分组。 通常它会跟HAVING一起配合使用,表示分组后再根据一定的条件过滤数据,常规执行的SQL如下:

SELECT age,COUNT(1) FROM student GROUP BY age HAVING age > 18

执行结果如图所示:

耗时总计0.53s左右,不过还可以进行优化,我们可以在分组之前缩小筛选的范围,然后再进行分组,优化的SQL如下:

SELECT age,COUNT(1) FROM student where age > 18 GROUP BY age 

执行结果如图所示:

耗时0.51s左右,虽然不明显,也是一种不错的思路。

4.11、避免使用!=或<>

尽量避免使用!=或<>操作符,下面直接分析SQL:

SQL分析:

使用EXPLAIN关键字执行这段SQL:

EXPLAIN SELECT * FROM student WHERE id_card != '5031520645'

执行结果如图所示:

虽然我们给了id_card字段建立了索引,但还是走了全表扫描!

4.12、避免NULL值判断

为了确保没有NULL值,我们可以设定一个默认值,下面直接分析SQL:

SQL分析:

使用EXPLAIN关键字执行这段SQL:

EXPLAIN SELECT * FROM student WHERE id_card IS NOT NULL

执行结果如图所示:

依旧还是走了全表扫描。

使用EXPLAIN关键字执行这段SQL:

EXPLAIN SELECT * FROM student WHERE id_card IS NULL

执行结果如图所示:

这样是走索引的!

4.13、避免函数运算

在日常SQL撰写中,在WHERE条件上多多少少会用到一些函数,例如截取字符串,执行SQL如下:

分析SQL: 

使用EXPLAIN关键字执行这段SQL:

EXPLAIN SELECT * FROM student WHERE SUBSTR(id_card,0,9)

执行结果如图所示: 

索引失效,走了全表扫描。 

4.14、JOIN的表中使用索引字段

如果日常开发中,使用JOIN关键字链接表后,使用的ON关键字进行条件链接时,如果条件没有索引,则会进行全表扫描,执行SQL如下:

EXPLAIN SELECT * FROM student a,special_student b WHERE a.id = b.stu_id

执行结果如图所示: 

正因为special_student表的stu_id没有建立索引,则导致了全表扫描!

为stu_id建立索引后,执行SQL如下:

CREATE INDEX stu_id_index ON special_student(stu_id);

EXPLAIN SELECT * FROM student a,special_student b WHERE a.id = b.stu_id

执行结果如图所示:  

两张表都走了索引。

4.15、用EXISTS代替IN

IN关键字适合于外表大而内表小的情况,EXISTS适合于外表小而内表大的情况,执行SQL如下:

SELECT * FROM special_student 
WHERE EXISTS 
( SELECT 1 FROM student WHERE special_student.stu_id = student.id)

运行结果如图所示:

执行效率在0.02s左右,这里special_student是小表,student是大表,速度非常快!

五、总结

以上就是目前我对SQL优化的一些个人理解和总结,如果遗漏,欢迎评论区补充说明!

SQL性能优化的21个小技巧
学Java,找哪吒
08-29 4万+
真正的一文在手,优化我有!
SQL优化经验
vicky_pyh的博客
07-30 536
在项目压测阶段(多张业务主表数量达亿级),很多人都会碰到平时明明秒级响应的请求,现在却经常得到的响应是504 gateway timeout…这是因为在大数据的前提下,暴露了很多慢SQL,现在我就项目中遇到的一些情况以及对应的优化方案进行简要分享。 首先定位到查询语句,可以通过工具,如pinpoint可以很方便找到慢sql,也可以自己凭业务逻辑定位到查询sql,然后用 EXPLAIN 你的 SEL...
20种sql语句优化方案
最新发布
weixin_45836587的博客
09-24 1459
大家写sql语句中,是不是常有死锁、超时等问题出现,那就说明你的索引、查询语句规范并不完美。以下是小主整列20种sql语句优化方案,可以让你的sql语句,查询删除更加快速。当然看起来更加容易理解!
SQL - SQL优化
MinggeQingchun的博客
09-04 1183
在中为了提高查询效率,我们常常会采取一些措施对查询语句进行sql优化,下面总结的一些方法,有需要的可以参考参考。
explain | 索引优化的这把绝世好剑,你真的会用吗?
qq_35006660的博客
03-12 542
前言对于互联网公司来说,随着用户量和数据量的不断增加,慢查询是无法避免的问题。一般情况下如果出现慢查询,意味着接口响应慢、接口超时等问题。如果是高并发的场景,可能会出现数据库连接被占满的情...
聊聊sql优化15个小技巧
lisu061714112的专栏
11-10 8859
前言 sql优化是一个大家都比较关注的热门话题,无论你在面试,还是工作中,都很有可能会遇到。 如果某天你负责的某个线上接口,出现了性能问题,需要做优化。那么你首先想到的很有可能是优化sql语句,因为它的改造成本相对于代码来说也要小得多。 那么,如何优化sql语句呢? ​ 我的个人技术博客:https://susan.net.cn​​​​​​​ ​ 这篇文章从15个方面,分享sql优化的一些小技巧,希望对你有所帮助。 最近无意间获得一份BAT大厂大佬写的刷题笔记,一下子打通了我的任督二脉,越来越觉得算法没
13个SQL优化技巧
热门推荐
膈腧的涂鸦板
07-01 1万+
1 避免无计划的全表扫描   如下情况进行全表扫描: -          该表无索引 -          对返回的行无人和限制条件(无Where子句) -          对于索引主列(索引的第一列)无限制条件 -          对索引主列的条件含在表达式中 -          对索引主列的限制条件是is (not) null或!= -          对索引主列的限制条件是like
SQL优化经验总结
weixin_34034670的博客
09-10 104
一. 优化SQL步骤 1. 通过 show status和应用特点了解各种 SQL的执行频率    通过 SHOW STATUS 可以提供服务器状态信息,也可以使用 mysqladmin extende d-status 命令获得。 SHOW STATUS 可以根据需要显示 session 级别的统计结果和 global级别的统计结果。 如显示当前session: SHOW STATUS li...
一次非常有趣的sql优化经历
<sdffdsfsdfdfs>sfsfsfsdfsdffds</sdfsDS>Fsd
03-19 1394
Linux编程点击右侧关注,免费入门到精通!作者丨风过无痕cnblogs.com/tangyanbo/p/4462734.html场景我用的数据库mysql5.6,下面...
sql优化14个技巧(重要)
qq_33240556的博客
01-18 1820
因为ids太多,即使能快速查出数据,但如果返回的数据量太大了,网络传输也是非常消耗性能的,接口性能始终好不到哪里去。如果实现业务场景中需要查询出另外几张表中的数据,可以在a、b、c表中冗余专门的字段,比如:在表a中冗余d_name字段,保存需要查询出的数据。除非是有些特殊的场景,比如union all之后,结果集中出现了重复数据,而业务场景中是不允许产生重复数据的,这时可以使用union。mysql会查到1000020条数据,然后丢弃前面的1000000条,只查后面的20条数据,这个是非常浪费资源的。
优化sql的十五个技巧
youngpeople_的博客
11-11 3643
前言 sql优化是一个大家都比较关注的热门话题,无论你在面试,还是工作中,都很有可能会遇到。 如果某天你负责的某个线上接口,出现了性能问题,需要做优化。那么你首先想到的很有可能是优化sql语句,因为它的改造成本相对于代码来说也要小得多。 那么,如何优化sql语句呢? 这篇文章从15个方面,分享sql优化的一些小技巧,希望对你有所帮助。 Java干货合集 1 避免使用select * 很多时候,我们写sql语句时,为了方便,喜欢直接使用select *,一次性查出表中所有列的数据。 反例
2020最新各大厂面试遇到的100道软件测试面试题+答案干货!! 金九银十到了 快点看!!!
程序员-小枫的博客
08-25 6641
干货!!!】花费了整整3天,整理出来的全网最实用软件测试面试大全,一共30道题目+答案的干货,希望大家多多支持,建议 点赞!!收藏!!长文警告,全文共12000+字,涵盖软件测试面试可能遇到的所有问题,希望对大家有帮助,不过大家最好不要硬背,实战大于理论。祝大家面试顺利! 1、问:你在测试中发现了一个bug,但是开发经理认为这不是一个bug,你应该怎样解决? 首先,将问题提交到缺陷管理库里面进行备案。 然后,要获取判断的依据和标准: 根据需求说明书、产品说明、设计文档等,确认实际.
hive spark sql 优化干货
weixin_43947279的博客
03-22 797
干货奉上~ 多多收藏多多转发 参数优化 ## 开启动态分区 set hive.exec.dynamic.partition.mode=nonstrict; ## 开启动态分区 set hive.exec.dynamic.partition=true; ## 分区数 set hive.exec.max.dynamic.partitions = 1000; ## 无关子查询 可以并行 set hive.exec.parallel = true ; ## 如果是小表,自动选择Mapjoin: set hi
access建立两个字段唯一索引_「干货分享数据库索引建立使用小技巧
weixin_39834281的博客
10-21 2334
原创: 达梦 一.建立索引的准则1.1在表中插入数据后创建索引一般情况下,在插入或装载了数据后,为表创建索引会更加有效率。如果在装载数据之前创建了一个或多个索引,那么在插入每行时DM数据库都必须更改和维护每个索引,使得插入效率降低。1.2怎样创建正确的索引(1)如果需要经常地检索大表中的少量的行,就为查询键创建索引;(2)为了改善多个表的连接的性能,可为连接列创建索引;(3)主键和唯一键自动具有索...
SQL 优化的经验
YZXnuaa的博客
07-05 192
查询语句无论是使用哪种判断条件等于、小于、大于,WHERE左侧的条件查询字段不要使用函数或者表达式 使用EXPLAIN命令优化你的 SELECT 查询,对于复杂、效率低的 sql 语句,我们通常是使用 explain sql 来分析这条 sql 语句,这样方便我们分析,进行优化。 当你的 SELECT 查询语句只需要使用一条记录时,要使用LIMIT 1 不要直接使用SELECT *,而应该使用具体需要查询的表字段,SELECT * 使用的是全表扫描,type = all。 为每一张表...
sql语句优化的15个小技巧(面试必刷!)
慢慢来,谁还没有一个努力的过程。
04-10 2550
sql优化是一个大家都比较关注的热门话题,无论你在面试,还是工作中,都很有可能会遇到。如果某天你负责的某个线上接口,出现了性能问题,需要做优化。那么你首先想到的很有可能是优化sql语句,因为它的改造成本相对于代码来说也要小得多。那么,如何优化sql语句呢?这篇文章从15个方面,分享sql优化的一些小技巧,希望对你有所帮助。
SQL优化的思路及基本原则(mysql
莫失莫忘-云姐
09-28 5900
SQL优化的思路:  1.优化更需要优化的sql;  2.定位优化对象的性能瓶颈:优化前需了解查询的瓶颈是IO还是CPU,可通过PROFILING很容易定位查询的瓶颈。  3.明确优化目标;  4.从Explain入手;  5.多使用profile; ​ SQL优化的基本原则:  1.永远用小结果集驱动大结果集;     From子句中sq
高级SQL优化(一)
jenmhdn
12-08 348
目录: Oracle数据完整性和锁机制  索引及优化之表分析  表分析、约束及表间关系  Oracle体系结构1 Oracle体系结构2  海量数据库及分区1  海量数据库及分区2  海量数据库及分区3  海量数据库及分区4  高级SQL优化(一)  PPT和源码下载:    http://sishuok.com/forum/posts/list/6...
oracle中sql语句优化技巧
05-20
Oracle 中 SQL 语句的优化技巧主要有以下几种: 1. 使用合适的索引:通过创建索引可以加快查询速度,但是索引也会影响到数据的插入和更新速度,因此需要根据具体情况来选择使用哪些索引。 2. 避免全表扫描:尽量避免使用无法使用索引的语句,例如使用 LIKE 进行模糊查询时,可以使用全文检索等技术来优化。 3. 避免不必要的连接:当查询需要多个表时,可以使用子查询或者联结查询来代替多次的单表查询。 4. 优化子查询:子查询的效率往往较低,可以优化为使用 JOIN 语句或者其他方法。 5. 使用 EXISTS 替代 IN:在使用 IN 语句时,如果查询的结果集很大,可以使用 EXISTS 替代,因为 EXISTS 只要找到一条符合条件的记录即可返回结果。 6. 使用 UNION ALL 替代 UNION:在使用 UNION 时,如果查询的结果集中没有重复的记录,可以使用 UNION ALL 替代,因为 UNION ALL 不会去除重复记录,查询速度更快。 7. 分批次处理数据:当需要处理大量数据时,可以考虑分批次处理,避免一次性处理过多数据导致内存溢出等问题。 8. 优化表结构:可以通过调整表结构、增加字段等方式来优化 SQL 语句的执行速度。 总之,SQL 语句的优化需要结合具体情况进行,需要对数据库的表结构、数据量、查询方式等做出合理的评估和优化。
写文章

热门文章

  • SpringBoot如何正确连接SqlServer(亲测可用) 19258
  • SQL优化的15个小技巧,纯干货分享! 18128
  • MyBatis批量插入的五种方式归纳总结 17281
  • Redis超详细入门教程(基础篇) 16491
  • SpringBoot接收参数的六种常用方式(全面详细) 13008

分类专栏

  • SpringBoot 付费 50篇
  • 运维 付费 16篇
  • Vue 7篇
  • Redis 6篇
  • Android Studio 5篇
  • JavaWeb 1篇
  • SpringSecurity 4篇
  • RabbitMQ 1篇
  • Node.js 1篇
  • MongoDB 2篇
  • Jenkins 2篇
  • Tomcat 2篇
  • Nginx 1篇
  • Maven 1篇
  • Spring 22篇
  • Java 43篇
  • 设计模式 22篇
  • MySql 17篇
  • MyBatis 10篇
  • Oracle 7篇
  • JPA 2篇
  • SqlServer 1篇
  • Docker 1篇

最新评论

  • MySQL中left join的on、and和where的区别(通俗易懂)

    qq_596900123: 你应该说明是1对多还是多对多, 情况不一样啊

  • vue2接入高德地图实现折线绘制、起始点标记和轨迹打点的完整功能(提供Gitee源码)

    CSDN-Ada助手: 推荐 CS入门 技能树:https://edu.csdn.net/skill/gml?utm_source=AI_act_gml

  • 【万字长文】Vue+SpringBoot实现大文件秒传、断点续传和分片上传完整教程(提供Gitee源码)

    黄团团: 写的时候用的是最新版的npm了,gitee仓库我更新了一下,主要就是把package-lock.json这个文件删除以后,重新npm install一下就可以了,npm当时写的时候没注意,用的太新了。

  • 【万字长文】Vue+SpringBoot实现大文件秒传、断点续传和分片上传完整教程(提供Gitee源码)

    黄团团: 不是私有的

  • 【万字长文】Vue+SpringBoot实现大文件秒传、断点续传和分片上传完整教程(提供Gitee源码)

    北执南念: 前端是不是有自己的私有仓库,下载不了

大家在看

  • 论文翻译 | Not what you’ve signed up for: Compromising Real-World LLM-Integrated Applications with Indir
  • PWM的概念与原理详细介绍 447
  • 基于SpringBoot的养生平台系统的设计与实现
  • 大商创(移动端) -- day01 252
  • 三路分化与文件归并排序

最新文章

  • SpringBoot定时任务@Scheduled完整功能详解(提供Gitee源码)
  • vue2接入高德地图实现折线绘制、起始点标记和轨迹打点的完整功能(提供Gitee源码)
  • vue2圆形标记(Marker)添加点击事件不弹出信息窗体(InfoWindow)的BUG解决
2024年34篇
2023年69篇
2022年12篇

目录

目录

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黄团团

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳坪山网站建设公司优化网站的几个步骤铜仁网站优化公司排名济宁专业网站优化服务梅州公司网站关键词优化方法金华网站优化推广费用多少网站sem优化方案云南昆明百度网站推广优化厦门网站优化加盟价格东莞教育网站seo优化网站优化简历网站排名优化皆来乐云seo沙井网站自动优化价格网站优化信息包括邯郸网站优化推广价格呼市网站seo优化温州网站优化三尾狐靠谱网站优化系统加盟三只松鼠网站结构优化保山网站怎么优化菏泽放心的机械行业网站优化长葛正规网站优化的用途和特点兴城网站优化公司地址廊坊婚纱摄影网站优化爱奇艺网站优化目标福建省怎样给网站做优化方案网站性能优化及安全重庆网站seo优化报价网站运营的优化兴宁网站seo优化北京诚信服务企业网站优化香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

深圳坪山网站建设公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化