mysql 优化之 is null ,is not null 索引使用测试

 关于mysql优化部分,有很多网友说尽量避免使用is null, is not null,select * 等,会导致索引失效,性能降低?那是否一定收到影响呢?真的就不会使用索引了吗?

 

本文的测试数据库版本为5.7.18,不同版本得出的结果可能会有所不同:

 

 

本文测试的两张表数据如下:

CREATE TABLE `t_user` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(20) NOT NULL,`age` int(11) DEFAULT NULL,`sex` varchar(20) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;INSERT INTO `t_user` (`id`, `name`, `age`, `sex`) VALUES ('1', 'jemis', '20', '男');
INSERT INTO `t_user` (`id`, `name`, `age`, `sex`) VALUES ('2', 'fox', '20', '男');
INSERT INTO `t_user` (`id`, `name`, `age`, `sex`) VALUES ('3', 'tony', '20', '男');CREATE  UNIQUE  INDEX indexName ON t_user(name(20));

  一、索引字段不能为空的情况下:

   测试select *  结合is null 和 is not null :

 

 

 

 

 

可以得出:

      EXPLAIN select * from t_user where `name` is not null; 不使用索引;
      EXPLAIN select * from t_user where `name` is null; 不使用索引;

 查询索引字段的情况下:

 

 

 

 

 

 

 

  有以上可以得出查询索引字段时:

        EXPLAIN select name from t_user where `name` is not null; 使用索引 

        EXPLAIN select name from t_user where `name` is null; 不使用索引

 

select 索引字段加 非索引字段时:

  

 

 

 

 

 可以得出:当select索引字段+其他字段时:

     EXPLAIN select name,age from t_user where `name` is not null; 不使用索引

    EXPLAIN select name,age from t_user where `name` is null; 不使用索引

    

由此可见,当索引字段不可以为null 时,只有使用is not null 并且返回的结果集中只包含索引字段时,才使用索引

 

二、当索引字段可以为null 时测试数据:

CREATE TABLE `t_user1` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(20) DEFAULT NULL,`age` int(11) DEFAULT NULL,`sex` varchar(20) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;INSERT INTO `springtest`.`t_user1` (`id`, `name`, `age`, `sex`) VALUES ('1', 'jemis', '20', '男');
INSERT INTO `springtest`.`t_user1` (`id`, `name`, `age`, `sex`) VALUES ('2', 'fox', '20', '男');
INSERT INTO `springtest`.`t_user1` (`id`, `name`, `age`, `sex`) VALUES ('3', 'tony', '20', '男');CREATE  UNIQUE  INDEX indexName ON t_user1(name(20));

 当索引字段可以为null,使用is null ,is not null:

 

当select * 时:

 

 

查询语句select *:EXPLAIN select * from t_user1 where `name` is not null;; 不使用索引
                 EXPLAIN select * from t_user1 where `name` is null; 使用索引

 

select 索引字段:

 

 

 

  select 索引字段的结论为:

           EXPLAIN select name from t_user1 where `name` is not null; 使用索引
            EXPLAIN select name from t_user1 where `name` is null; 使用索引

 

  select 索引字段 + 非索引字段 为:

    

 

 

 

 

当select索引字段+其他字段时: EXPLAIN select name,age from t_user1 where `name` is not null;不使用索引,会导致索引失效
                                                    EXPLAIN select name,age from t_user1 where `name` is null; 使用索引

 

 

总结以上情形可知:1、当索引字段不可以为null 时,只有使用is not null 返回的结果集中只包含索引字段时,才使用索引

 

 

                              2、当索引字段可以为空时,使用 is null 不影响覆盖索引,但是使用 is not null 只有完全返回索引字段时才会使用索引

 

最后附上本文的测试完整版sql以及结论:

CREATE TABLE `t_user` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(20) NOT NULL,`age` int(11) DEFAULT NULL,`sex` varchar(20) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;INSERT INTO `springtest`.`t_user` (`id`, `name`, `age`, `sex`) VALUES ('1', 'jemis', '20', '');
INSERT INTO `springtest`.`t_user` (`id`, `name`, `age`, `sex`) VALUES ('2', 'fox', '20', '');
INSERT INTO `springtest`.`t_user` (`id`, `name`, `age`, `sex`) VALUES ('3', 'tony', '20', '');
CREATE  UNIQUE  INDEX indexName ON t_user(name(20));CREATE TABLE `t_user1` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(20) DEFAULT NULL,`age` int(11) DEFAULT NULL,`sex` varchar(20) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;INSERT INTO `springtest`.`t_user1` (`id`, `name`, `age`, `sex`) VALUES ('1', 'jemis', '20', '');
INSERT INTO `springtest`.`t_user1` (`id`, `name`, `age`, `sex`) VALUES ('2', 'fox', '20', '');
INSERT INTO `springtest`.`t_user1` (`id`, `name`, `age`, `sex`) VALUES ('3', 'tony', '20', '');CREATE  UNIQUE  INDEX indexName ON t_user1(name(20));当字段值可以为null,使用is null ,is not null,
查询语句:EXPLAIN select * from t_user1  where `name` is not null;;  不使用索引EXPLAIN select * from t_user1  where `name` is  null;   使用索引当不使用select * 时 : EXPLAIN select name from t_user1  where `name` is not null;  使用索引EXPLAIN select name from t_user1  where `name` is  null; 使用索引当select索引字段+其他字段时: EXPLAIN select name,age from t_user1  where `name` is not null;不使用索引,会导致索引失效EXPLAIN select name,age from t_user1  where `name` is  null;   使用索引从以上可以看出,当索引字段可以为空时,使用 is null 不影响覆盖索引,但是使用 is not null 只有完全返回索引字段时才会使用索引当字段值不能为null 时,EXPLAIN select *  from t_user  where `name` is not  null; 不使用索引;EXPLAIN select * from t_user  where `name` is  null;  不使用索引;当select索引字段 时 :  EXPLAIN select name from t_user  where `name` is not null; 使用索引 EXPLAIN select name from t_user  where `name` is  null;  不使用索引当select索引字段+其他字段时: EXPLAIN select name,age from t_user  where `name` is  not null; 不使用索引EXPLAIN select name,age from t_user  where `name` is  null;   不使用索引由此可见,当索引字段不可以为null 时,只有使用is not null 返回的结果集中只包含索引字段时,才使用索引
View Code

 

转载于:https://www.cnblogs.com/cheng21553516/p/11450765.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/461434.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode7——Reverse Integer(将一个整数反转,注意溢出的处理)

题目: 解法一: 注意long long类型,表示64bit数字。 解法二: class Solution { public:int reverse(int x) {int ans 0;while (x) {int temp ans * 10 x % 10;if (temp / 10 ! ans)//溢出后,这里就会不成立了return …

Qt designer界面和所有组件功能的详细介绍(全!!!)

PyQt5和Qt designer的详细安装教程:https://blog.csdn.net/qq_43811536/article/details/135185233?spm1001.2014.3001.5501 目录 1. 界面介绍2. Widget Box 常用组件2.1 Layouts(布局)2.2 Spacers(间隔器)2.3 Item V…

[转]四边形不等式优化dp(POJ1160)

四边形不等式优化动态规划原理: 1.当决策代价函数w[i][j]满足w[i][j]w[i’][j’]<w[I;][j]w[i][j’](i<i’<j<j’)时,称w满足四边形不等式.当函数w[i][j]满足w[i’][j]<w[i][j’] i<i’<j<j’)时,称w关于区间包含关系单调. 2.如果状态转移方程m为且决策…

LeetCode27——Remove Element(移除数组中指定的元素)

题目&#xff1a; 解法&#xff1a; class Solution { public:int removeElement(vector<int>& nums, int val) {int cnt 0;for(int i 0 ; i < nums.size() ; i) {if(nums[i] val)cnt;elsenums[i-cnt] nums[i];//这里体现了删除。画图表示&#xff08;2不是&a…

inputstream的大小为0_刘科排列三第2020306期推荐:独胆参考0,双胆0和7

排列三第2020305期奖号开出373&#xff0c;奖号类型为组三&#xff0c;大小比为1:2&#xff0c;奇偶比为3:0&#xff0c;012路比为2:1:0。 组选类型推荐&#xff1a;历史上排列三第306期同期奖号中&#xff0c;组六出现10期&#xff0c;组三出现4次&#xff0c;豹子出现1期&…

ARM指令集(下)

A.2.5 ARM 协处理器指令 ARM 支持协处理器操作&#xff0c;协处理器的控制要通过协处理器命令实现。表A-7给出全部的ARM协处理器指令。 表A-7 ARM 协处理器指令CDP 协处理器数据操作指令。ARM 处理器通过CDP 指令通知ARM 协处理器执行特定的操作。该操作由协…

LeetCode283——Move Zeroes(将0移动到数组最后面)

题目&#xff1a; 解法&#xff1a; class Solution { public:void moveZeroes(vector<int>& nums) {fill(remove(nums.begin(), nums.end(),0), nums.end(), 0);} }; oh&#xff0c;no&#xff01;解法二&#xff1a; void moveZeroes(vector<int>& nums)…

java关闭一个窗口打开另一个_推开中式门窗,就像打开了另一个写意的世界…...

导语“湖光秋枕上&#xff0c;岳翠夏窗中。”在传承几千年的中式建筑文化中&#xff0c;自古以来就有多门窗、少实墙的传统&#xff0c;虚虚实实之间讲究内外空间融合&#xff0c;借景框景之时彰显人与自然和谐&#xff0c;门窗甚至直接决定着整体建筑的风格气质。随着时代的不…

同样是面对失败的责任:任春雷比杜一楠更有种

24 券创始人杜一楠最近成为热点人物&#xff0c;他的一篇“悔过书”引发各大媒体上万次的转载。一夜之间&#xff0c;这位与资方博弈的爷们儿却变成了一个负面人物&#xff0c;让人始料不及。业界人士评价说&#xff0c;这份“失败总结”满篇都是假大空&#xff0c;所总结的六点…

PopStar(消灭星星)游戏源代码下载、分析及跨平台移植---第四篇(关卡)

背景&#xff1a;本来打算把第三篇和第四篇合并都一起&#xff0c;但以前计划分开&#xff0c;就还是分来吧&#xff1b;一般的游戏涉及到关卡的话&#xff0c;一般都会建立一个数组来存放各种定义参数&#xff0c;消灭星星关卡比较容易&#xff0c;不需要建立数组&#xff0c;…

LeetCode344——Reverse String(将字符串反转)

题目&#xff1a; 解法&#xff1a; class Solution { public:string reverseString(string s) {int i0,js.size()-1;while(i<j){swap(s[i],s[j--]);}return s; } };

Thinkphp带表情的评论回复实例

Thinkphp带表情的评论回复实例 基于Thinkphp开发的一个简单的带表情的评论回复实例&#xff0c;可以无限回复&#xff0c;适合新手学习或作为毕业设计作品等。 评论提交验证 1 $(".submit-btn").click(function() { 2 var $this $(this); 3 var name $th…

amd cpu不能在cmd环境下运行java代码_「我们一起学Java02」JDK、JRE、JVM简介,Java开发平台的搭建...

Hello&#xff0c;各位头条的读者大家好&#xff01;接下来一段时间小编将和大家一起学习Java&#xff0c;“我们一起学Java”专题将会持续更新&#xff0c;欢迎大家关注。这里是“我们一起学Java”的第二篇&#xff0c;本文主要内容&#xff1a;1.JDK、JRE、JVM的简单介绍2.JD…

让Microsoft Web Application Stress Tool 支持非80端口的站点测试

刚在做内网内某个项目的性能测试 项目部署的端口为4000 然后用Microsoft Web Application Stress Tool 测试 发现居然不支持非80端口 找遍整个配置界面没发现port选项 寻思着会不会是写到配置文件里呢 于是打开安装目录寻找 苍天不负有心人 居然找到了WAS.mdb 这个文件 停掉web…

LeetCode20——Valid Parentheses(括号匹配问题,使用栈的知识)

题目&#xff1a; 解法&#xff1a; #include <stack>class Solution { public:bool isValid(string s) {stack<char> paren;for (char& c : s) {switch (c) {case (: case {: case [: paren.push(c);break;case ): if (paren.empty() || paren.top()!() retur…

取周一时间_周一到周五不好化妆?别着急,5款夏日通勤裸妆的教程来了!

化妆已经成为了许多女生每天的必修课&#xff0c;好的妆容不仅可以让自己显得有精神还可以增添自己的自信。但是每天早上起来&#xff0c;能够化妆的时间又不多&#xff0c;所以只好每天都重复同一样妆容&#xff0c;快速便捷&#xff0c;时间久了就渐渐感觉了无生趣。尤其是周…

LeetCode22——Generate Parentheses(给定n对括号,然后看有多少正确的括号组合)

题目&#xff1a; 解法&#xff1a; The idea is intuitive. Use two integers to count the remaining left parenthesis (n) and the right parenthesis (m) to be added. At each function call add a left parenthesis if n >0 and add a right parenthesis if m>0.…

docker安装mysql_Docker 安装 MySQL

本篇将介绍如何使用 Docker 部署 MySQL 数据库及远程访问配置。安装 MySQL拉取镜像使用下面的命令拉取 MySQL 数据库的镜像&#xff1a;$ sudo docker pull mysql # 拉取最新版本的镜像&#xff0c;当前为 MySQL 8 版本&#xff0c;tag 为 latest$ sudo docker pull mysql:5.7…

LeetCode17——Letter Combinations of a Phone Number(手机几个按键对应的字母(符号)组合)

题目&#xff1a; 解法&#xff1a; Simple and efficient iterative solution. Explanation with sample input "123" Initial state: result {""} Stage 1 for number "1": result has {""}candiate is "abc"generate …

python人人语音爬虫(登陆尚未完成,需要使用先登录在查cookie中的t)

2019独角兽企业重金招聘Python工程师标准>>> import urllib, urllib2, cookielib,re,jsondef LoginRenren(url,t_cookie):cookie {"t": t_cookie}#cookie中的t需要到浏览器中去查cookie "".join(x "" cookie[x] ";" f…