数据库执行计划

news/2025/3/14 19:07:07/

执行计划

(execution plan,也叫查询计划或者解释计划)是数据库执行 SQL 语句的具体步骤,例如通过索引还是全表扫描访问表中的数据,连接查询的实现方式和连接的顺序等。如果 SQL 语句性能不够理想,我们首先应该查看它的执行计划。

mysql:
explain sql_statement

oracle:
explain plan for sql_statement
select plan_table_output from TABLE(DBMS_XPLAN.DISPLAY(‘PLAN_TABLE’)); // 输出对应的执行计划

执行计划分析:

mysql:mysql执行计划关键词详解

orcale:
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
id: 执行步骤编号
Operation:当前操作的内容(可以看出是否采用了索引,以及索引类型)
Name: 操作对象(可以是索引名称,可为空)
Rows:Oracle估计当前操作的返回结果集行数
Bytes:表示执行该步骤后返回的字节数
Cost:执行成本,理论上越小越好
Time: Oracle 估计当前操作的时间

sql优化小技巧

1、最佳左前缀法则
如果索引了多列,要遵守最左前缀法则,指的是查询从索引的最左前列开始并且不跳过索引中的列。Mysql查询优化器会对查询的字段进行改进,判断查询的字段以哪种形式组合能使得查询更快,所有比如创建的是(a,b)索引,查询的是(b,a),查询优化器会修改成(a,b)后使用索引查询。

2、不在索引列上做任何操作
1)计算:对索引进行表达式计算会导致索引失效,如 where id + 1 = 10,可以转换成 where id = 10 -1,这样就可以走索引
2)函数:select * from t_user where length(name)=6; 此语句对字段使用到了函数,会导致索引失效
从 MySQL 8.0 开始,索引特性增加了函数索引,即可以针对函数计算后的值建立一个索引,也就是说该索引的值是函数计算后的值,所以就可以通过扫描索引来查询数据。
alter table t_user add key idx_name_length ((length(name)));
(自动/手动)类型转换
(字符串类型必须带’'引号才能使索引生效)字段是varchar,用整型进行查询时,无法走索引,如select * from user where phone = 13030303030;
Mysql 在执行上述语句时,会把字段转换为数字再进行比较,所以上面那条语句就相当于:select * from user where CAST(phone AS signed int) = 13030303030; CAST 函数是作用在了 phone 字段,而 phone 字段是索引,也就是对索引使用了函数!所以索引失效
字段是int,用string进行查询时,mysql会自动转化,可以走索引,如:select * from user where id = ‘1’;
MySQL 在遇到字符串和数字比较的时候,会自动把字符串转为数字,然后再进行比较。以上这条语句相当于:select * from user where id = CAST(“1” AS signed int),索引字段并没有用任何函数,CAST 函数是用在了输入参数,因此是可以走索引扫描的。

3)存储引擎不能使用索引中范围条件右边的列
如这样的sql: select * from user where username=‘123’ and age>20 and phone=‘1390012345’,其中username, age, phone都有索引,只有username和age会生效,phone的索引没有用到。

4)尽量使用覆盖索引(只访问索引的查询(索引列和查询列一致))
如select age from user,减少select *

5)mysql在使用负向查询条件(!=、<>、not in、not exists、not like)的时候无法使用索引会导致全表扫描

你可以想象一下,对于一棵B+树,根节点是40,如果你的条件是等于20,就去左面查,你的条件等于50,就去右面查,但是你的条件是不等于66,索引应该咋办?还不是遍历一遍才知道。

6)is null, is not null 也无法使用索引,在实际中尽量不要使用null(避免在 where 子句中对字段进行 null 值判断) 不过在mysql的高版本已经做了优化,允许使用索引

对于null的判断会导致引擎放弃使用索引而进行全表扫描。

7)like 以通配符开头(%abc…)时,mysql索引失效会变成全表扫描的操作

所以最好用右边like ‘abc%’。如果两边都要用,可以用select username from user where username like ‘%abc%’,其中username是必须是索引列,才可让索引生效

假如index(a,b,c), where a=3 and b like ‘abc%’ and c=4,a能用,b能用,c不能用,类似于不能使用范围条件右边的列的索引

对于一棵B+树索引来讲,如果根节点是字符def,假如查询条件的通配符在后面,例如abc%,则其知道应该搜索左子树,假如传入为efg%,则应该搜索右子树,如果通配符在前面%abc,则数据库不知道应该走哪一面,就都扫描一遍了。

8)少用or,在 WHERE 子句中,如果在 OR 前的条件列是索引列,而在 OR 后的条件列不是索引列,那么索引会失效。
select * from t_user where id = 1 or age = 18;
– id有索引,age没有,此时没法走索引


http://www.ppmy.cn/news/426163.html

相关文章

模式转换是企业不断成功的法宝

每一个企业都是在不断的轮回&#xff0c;在商业发展的过程中&#xff0c;抓住机会成功转型&#xff0c;就可能踏上新的彼岸&#xff0c;比如华为、腾讯、阿里、微软、苹果、IBM等&#xff1b;固守疆土&#xff0c;不思改变&#xff0c;或者战略错误的话&#xff0c;则会走向失败…

一个一本正经的科普--5G是什么?

&#xff08;很久以前的约稿&#xff0c;这里只是为了在专栏备份&#xff0c;打扰勿怪&#xff09; &#xff08;本文约1.2W字&#xff0c;阅读前请注意&#xff09; 现在&#xff0c;普通用户对5G充满希望&#xff0c;许多人认为它将是一场变革 – 改进的用户体验、新的应用…

诺基亚的复活之路:夹缝中求生存

很多人都说诺基亚失败了。原因就在于没有做好创新&#xff01; 这点我同意。作为第三人&#xff0c;站在这里&#xff0c;没有任何负担的评价别人没有做得好的地方&#xff0c;是很容易的事情。 既然我们都能看到&#xff0c;那么诺基亚必然也看到了。 但是&#xff0c;我们…

分享一波《财富自由之路》读书笔记

hello你好我是辰兮很高兴你能来阅读&#xff0c;本篇是无意中看到的《财富自由之路》然后按顺序整理下来的相关笔记&#xff0c;旨在分享所读所感&#xff0c;大家一起进步&#xff01; 文章目录 第一节&#xff1a;打开财富自由的大门第二节&#xff1a;什么是个人商业模式第三…

跟我学Android之一 概述

视频课&#xff1a;【免费】跨平台APP JQuery Mobile开发-1-初探移动开发-张晨光的在线视频教程-CSDN程序员研修院 Android 5更新你的应用程序添加各种新功能&#xff0c;比如在锁屏通知&#xff0c;一个全新的相机API&#xff0c;OpenGL ES 3.1&#xff0c;新材料的设计界面&…

一、二线城市 IT 公司大盘点!建议收藏

点击关注公众号&#xff0c;回复“1024”获取2TB学习资源&#xff01; 一直以来&#xff0c;总有读者来询问&#xff0c;是否可以整理一下一、二线城市的互联网IT企业&#xff0c;这样方便后面的跳槽、找工作有一个参考。 所以&#xff0c;应大家的强烈需求&#xff0c;今天给大…

诺基亚的CEO的一封信

诺基亚CEO内部备忘录曝光&#xff1a;我们身处燃烧的平台 2011-02-09 19:07:53 来源: 网易科技报道 跟贴 206 条 手机看新闻 网易科技讯 2月9日消息&#xff0c;诺基亚首席执行官史蒂芬•埃洛普&#xff08;Stephen Elop&#xff09;最近致员工的一份内部备忘录曝光。在这封…

人类高质量Java基础面试题大全,又是一篇三万字的总结!

点击主页访问更多精彩文章&#xff1a;https://blog.csdn.net/weixin_45692705?spm1001.2101.3001.5343 Java基础面试题目录 共勉 &#xff01;Java概述1.什么是Java2.何为编程3.JDK和JRE和JVM的区别5.Java语言有哪些特点6.什么是字节码&#xff1f;采用字节码的最大好处是什么…