龙空技术网

如何定位慢的SQL

刘丞渊 166

前言:

如今朋友们对“oracle中查询排序慢”都比较关注,姐妹们都需要了解一些“oracle中查询排序慢”的相关内容。那么小编在网上汇集了一些对于“oracle中查询排序慢””的相关资讯,希望我们能喜欢,小伙伴们一起来了解一下吧!

开启慢查询跟踪日志来定位,修改mysql的参数slow_query_log,将他改为on

优化一条sql的流程:

1、先看sql有什么问题,比如*

1、count(column) 和 count(*) 、count(1) 、count(0)适用区别

count(column) 是表示结果集中有多少个column字段不为空的记录;

count(*) 是表示整个结果集有多少条记录;

2、order by 一定需要排序操作

利用索引来优化有排序需求的 SQL,是一个非常重要的优化手段

3、不适用子查询

例:SELECT * FROM t1 WHERE id (SELECT id FROM t2 WHERE name=’hechunyang’);

子查询在MySQL5.5版本里,内部执行计划器是这样执行的:先查外表再匹配内表,而不是先查内表t2,当外表的数据很大时,查询速度会非常慢。

在MariaDB10/MySQL5.6版本里,采用join关联方式对其进行了优化,这条SQL会自动转换为

SELECT t1.* FROM t1 JOIN t2 ON t1.id = t2.id;

但请注意的是:优化只针对SELECT有效,对UPDATE/DELETE子查询无效,固生产环境应避免使用子查询

4、避免函数索引

例:SELECT * FROM t WHERE YEAR(createtime) >= 2016;

由于MySQL不像Oracle那样支持函数索引,即使d字段有索引,也会直接全表扫描。

应改为—–>

SELECT * FROM t WHERE d >= '2016-01-01';

5、 用IN来替换OR

低效查询

SELECT * FROM t WHERE LOC_ID = 10 OR LOC_ID = 20 OR LOC_ID = 30;

—–>

高效查询

SELECT * FROM t WHERE LOC_IN IN (10,20,30);

6、LIKE双百分号无法使用到索引

SELECT * FROM t WHERE name LIKE ‘%de%’;

—–>

SELECT * FROM t WHERE name LIKE ‘de%’;

目前只有MySQL5.7支持全文索引(支持中文)

思考一下:mysql的like中%与_的区别?

%对应于0个或更多字符,_只是LIKE语句中的一个字符

7、分组统计可以禁止排序

SELECT goods_id,count(*) FROM t GROUP BY goods_id;

默认情况下,MySQL对所有GROUP BY col1,col2…的字段进行排序。如果查询包括GROUP BY,想要避免排序结果的消耗,则可以指定ORDER BY NULL禁止排序

—–>

SELECT goods_id,count(*) FROM t GROUP BY goods_id ORDER BY NULL;

8、避免随机取记录

SELECT * FROM t1 WHERE 1=1 ORDER BY RAND() LIMIT 4;

MySQL不支持函数索引,会导致全表扫描

—–>

SELECT * FROM t1 WHERE id >= CEIL(RAND()*1000) LIMIT 4;

9、禁止不必要的ORDER BY排序

SELECT count(1) FROM user u LEFT JOIN user_info i ON u.id = i.user_id WHERE 1 = 1 ORDER BY u.create_time DESC;

—–>

SELECT count(1) FROM user u LEFT JOIN user_info i ON u.id = i.user_id;

10、批量INSERT插入

INSERT INTO t (id, name) VALUES(1,’Bea’);

INSERT INTO t (id, name) VALUES(2,’Belle’);

INSERT INTO t (id, name) VALUES(3,’Bernice’);

—–>

INSERT INTO t (id, name) VALUES(1,’Bea’), (2,’Belle’),(3,’Bernice’);

sql看着没问题之后,然后我就通过explain来执行对应的sql语句,看他有没有使用到索引,发现没有使用到索引 ,就需要查看索引是否失效。

标签: #oracle中查询排序慢