bcp 不能调用where 子句_技术分享 || Mysql中IS NULL、IS NOT NULL不能走索引?

6b5487807466af8ee1c71ed9ba3f74bd.png

mysql中IS NULL、IS NOT NULL不能走索引?

不知道是啥原因也不知道啥时候, 江湖上流传着这么一个说法 mysql查询条件包含IS NULL、IS NOT NULL、!=、like %* 、like %*%, 不能 使用索引查询, 只能 使用全表扫描。

刚入行时我也是这么认为的,还奉为真理!

但是时间工作中你会发现还是走索引啊!下面我们来一一探究其中的奥秘。

一、首先验证一下是会走索引的

创建一个表,结构如下:

create table user_info( id int PRIMARY key auto_increment, name varchar(16) default '', age tinyint default 0, address varchar(32) default '', PRIMARY KEY (`id`), KEY `name` (`name`), KEY `address_2` (`address`,`name`) ); ALTER TABLE user_info ADD INDEX (NAME); ALTER TABLE user_info ADD INDEX (address);
数据1 INSERT INTO user_info(NAME,age,address) VALUES (9,9,'shenzhen9'); BEGIN DECLARE i INT DEFAULT 1000; WHILE i < 9000 DO INSERT INTO user_info (`NAME`, `age`, `address`) VALUES (NULL, i , SUBSTRING(MD5(RAND()),1,10) ) ; SET i = i+ 1 ; END WHILE ; ① EXPLAIN SELECT * FROM user_info WHERE `name` IS NOT NULL ② EXPLAIN SELECT * FROM user_info WHERE `name` !='9' ③ EXPLAIN SELECT * FROM user_info WHERE `name` is null
数据2 INSERT INTO user_info(NAME,age,address) VALUES (null,9,'shenzhen9'); BEGIN DECLARE i INT DEFAULT 1000; WHILE i < 9000 DO INSERT INTO user_info (`NAME`, `age`, `address`) VALUES (REPLACE(UUID(),'-',''), i , SUBSTRING(MD5(RAND()),1,10) ) ; SET i = i+ 1 ; END WHILE ; ④ EXPLAIN SELECT * FROM user_info WHERE `name` IS NOT NULL ⑤ EXPLAIN SELECT * FROM user_info WHERE `name` !='9' ⑥ EXPLAIN SELECT * FROM user_info WHERE `name` is null

执行数据1 会发现sql①②走索引,③不走索引

执行数据2 会发现sql⑥走索引,④⑤不走索引

a8b6be3333e7715cc6bd9b173ae5d45d.png

db5d802c3522b256a6f5a73dc9fcaaaf.png

二、B+树数据排列规则

1、聚簇索引索引:

①页面中的记录是按照主键值进行排序的;

②B+树每一层节点(页面)都是按照页中记录的主键值大小进行排序的;

③B+树叶子节点对应的页面中存储的是完整的用户记录(就是一条记录中包含我们定义的所有列值,还包含一些InnoDB自己添加的一些隐藏列);

2、二级索引:

①页面中的记录是按照给定的索引列的值进行排序的。

②B+树每一层节点(页面)都是按照页中记录的给定的索引列的值进行排序的。

③B+树叶子节点对应的页面中存储的只是索引列的值 + 主键值。

二级索引值能为空。那对于索引列值为NULL的二级索引记录,在B+树的哪个位置呢?

在B+树的最左边。如下图

f7dba4033a6ef15d075c021f0f15c808.png

至于为什么,InnoDB是这样的规定:SQL中的NULL值是列中最小的值

什么时候索引又不生效了呢?

对比数据1和数据2两个数据中null值的数量不一样,当null值占多数时is not null 和!=走索引 ,is null不走索引了,数据2刚好相反。

索引(二级索引)扫描成本:

1、读取索引记录成本

2、反查主键索引查找完整数据成本即回表

如果查询读取的二级索引越多那么需要回表查询的次数就会越多,达到一定的比例就会变成全部查询了,也就是上面null 查询时索引有时不生效的原因。

综上MySQL中决定使不使用某个索引执行查询的依据是成本大小。而不是在WHERE子句中用了IS NULL、IS NOT NULL、!=这些条件

三、如何让like‘%字符串%’,‘字符串%’时走索引

通常情况下我们使用like % %、% 的确不会走索引 但是并不代表就一定不能走索引,我们对上面表中name和age建立复合索引

explain select name from user_info where name like '%a%'; 1 SIMPLE user_info index idx_n_a 53 6 16.67 Using where; Using index explain select name,age from user_info where name like '%a%'; 1 SIMPLE user_info index idx_n_a 53 6 16.67 Using where; Using index 以下两个例子是查询了不在复合索引中的列进而造成全表扫描 explain select name,age,address from user_info where name like '%a%'; 1 SIMPLE user_info ALL 6 16.67 Using where explain select * from user_info where name like '%a%'; 1 SIMPLE user_info ALL 6 16.67 Using where

所以like走不走索引并不是绝对的,要看使用条件!

来源:https://www.tuicool.com/articles/ANnIFrF

欢迎关注微信公众号【慕容千语】

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

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

相关文章

【学习笔记】第二章——线程与多线程模型

文章目录一. 线程为什么要引入线程&#xff1a;引入进程后的变化线程的属性线程的实现二. 多线程模型1. 多对一模型2. 一对一模型3. 多对多模型三. 总结一. 线程 为什么要引入线程&#xff1a; 有的进程可能要“同时进行很多事”&#xff08;如QQ的语音、视频、文件处理等&am…

ghelper失效_Ghelper账号+网易云音乐领黑胶会员35天

点击蓝字关注我们&#xff0c;了解更多 追求美好的生活Ghelper账号 :账号&#xff1a;yiyaniosfx.cn密码&#xff1a;yiyanyiyan网易云&#xff1a;打开网易云音乐APP->顶部直播->随便进一个直播->右下角黑胶VIP领取->在次日1点后观看直播可领7天黑胶VIP->每天…

python利用tensorflow识别圆_RaspberryPi上实现佩戴口罩识别——2020电赛F题小记

今年的电赛题目非常反常&#xff0c;传统控制题目基本没有&#xff0c;新增加了测距题目&#xff0c;甚至物联网题目&#xff0c;Ai题目都出来了。直接电赛变算法钞能力大赛。看到F题&#xff1a;测温人脸识别&#xff0c;碰巧我们手头有调好的红外测温模块树莓派openmv&#x…

exchange邮件服务器_基于Spring Boot快速实现发送邮件功能

邮件在项目中经常会被用到&#xff0c;比如用邮件发送通知。比如&#xff0c;通过邮件注册、认证、找回密码、系统报警通知、报表信息等。本篇文章带大家通过SpringBoot快速实现一个发送邮件的功能。 邮件协议 下面先简单了解一下常见的邮件协议。常用的电子邮件协议有SMTP、PO…

redis序列化_SpringBoot整合redis

redis是最常用的缓存数据库&#xff0c;常用于存储用户登录token、临时数据、定时相关数据等。redis是单线程的&#xff0c;所以redis的操作是原子性的&#xff0c;这样可以保证不会出现并发问题。redis基于内存&#xff0c;速度非常快&#xff0c;据测试&#xff0c;redis读的…

spring cloud alibaba_SpringCloudAlibaba与Cloud搭配方案

一 简介Spring Cloud Alibaba致力于提供微服务开发一站式解决方案。此项目包括开发分布式应用微服务的必需组件&#xff0c;方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。依托 Spring Cloud Alibaba&#xff0c;你只需要添加一些注解和少量配置…

php curl header_PHP中的yield与协程(二十一节)

大家好&#xff0c;我是老李。顺风说骚话&#xff0c;逆风讲道理最近在大家一起努力下&#xff0c;那个沙雕肺炎患病人数增长率下降了不少&#xff0c;总体来说还算顺&#xff0c;所以今天这篇注定又要骚话连篇了。听说最近不少玉米开始向大连、威海、烟台方向涌入&#xff0c;…

用稳压管保护单片机引脚_一步一步,全程揭开单片机的原理,让做电子变得轻松自如!...

学习单片机必要的硬件学习单片机都需要什么&#xff1f;首先要掌握必要的电子基础知识&#xff1b;再次选择大众化、性价比高的单片机&#xff0c;熟悉它的引脚功能定义&#xff1b;另外还需要电脑与下载程序的下载器。一、单片机建议选择型号为STC89C52RC单片机&#xff0c;如…

python word 表格宽度_RPA手把手——python-docx 设置 word 文档中表格格式

艺赛旗|做RPA生态先行者 RPA10.0全新首发免费下载 点击下载 引入会用到的库 from docx import Document from docx.shared import Pt from docx.enum.text import WD_PARAGRAPH_ALIGNMENT from docx.shared import Cm from docx.shared import RGBColor 表格样式 #方法一&#…

软引用和弱引用的区别_强、软、弱、虚引用的区别和使用

原文阅读&#xff1a;强、软、弱、虚引用的区别和使用​mp.weixin.qq.comJava提供了四种级别的应用类型&#xff1a;强引用、软引用、弱引用及虚引用。那么这四种引用类型有什么区别呢&#xff1f;首先我们通过一张图来看看四种引用在Java中的表示&#xff1a;FinalReference由…

python文本文件不能用二进制文件方式读入_如何使用python函数以二进制形式读取文件?...

虽然读取文件的方式各种各样&#xff0c;但是通过二进制&#xff0c;还是头一次&#xff0c;实现过过程并不难&#xff0c;我们需要将文件先做好封存&#xff0c;以函数的形式&#xff0c;保存下来&#xff0c;然后直接导入进行使用&#xff0c;这样就可以读取文件&#xff0c;…

一组数字中算出最相近的组合_据说在金字塔里发现的这组数字,貌似是通往宇宙的密码...

我们都知道阿拉伯数字是全世界都在用的计数单位的数字&#xff0c;我们的生活离不开阿拉伯数字&#xff0c;其广泛性很大。比如买菜、买衣服。做数学题等等都需要用到。不过呢早前有人称在埃及金字塔内发现了一组数字142857&#xff0c;这组数字貌似就是通往宇宙的密码。这一说…

前端悬浮窗效果_Flutter自绘组件:微信悬浮窗(一)

看微信公众号的时候时常会想退出去回复消息&#xff0c;但又不想放弃已经阅读一半的文章&#xff0c;因为回复信息后再从公众号找到该篇文章之间有不必要的时间花费&#xff0c;微信悬浮窗的出现解决了这个烦恼&#xff0c;回复完消息之后只需要点击悬浮窗就可以回到之前在阅读…

date类型_Quartz与Date---cron的相互转换

产生原因:因为项目最近设计到了一个Quartz相关的模块&#xff0c;前端需要传递时间参数到后台, 然后后台设置一个新的定时任务, 所以后台需要一个可以实现Date与cron之间的相互转换(因为Quartz需要的Cron格式的数据)&#xff0c;所以就借助java的SimpleDateFormat的格式化,然后…

vbs if 不等于_6、if语句和关系表达式

示例3.1&#xff1a;星星公司致力于信件快递业务&#xff0c;收费标准是&#xff1a;500g以内6元&#xff0c;超过500g9元。应该就是输入重量&#xff0c;显示钱&#xff0c;那可以用cout和cin&#xff0c;如果w小于500&#xff0c;c是6&#xff0c;否则&#xff0c;c是9。//pr…

python文件是怎么写_python头文件怎么写

本文主要以python2为例。首先介绍一下Python头文件的编程风格&#xff0c;然后再给大家详细介绍import部分的基本用法。这两个部分就是Python中头文件的组成模块。编程风格#!/usr/bin/env python #在文件头部 ( 第一行 ) 加上 设置 Python 解释器 # -*- coding: utf-8 -*- #在文…

【学习笔记】第二章——处理机调度的概念、层次、时机、切换过程 调度方式、调度算法的指标

文章目录一. 概念 & 层次1. 高级调度&#xff08;作业调度&#xff09;2. 中级调度&#xff08;内存调度&#xff09;挂起态 & 七状态模型3. 低级调度&#xff08;进程调度&#xff09;4. 三种调度的对比联系 && 总结二. 时机、切换过程 & 调度方式1. 进程…

formdata上传文件_关于multipart/formdata上传文件

最近在做一个文件上传的开放接口&#xff0c;用到Content-Type: multipart/form-data这种请求类型&#xff0c;特地做了一些研究和记录。在最初的 http协议中&#xff0c;并没有上传文件方面的功能。RFC1867为 http协议添加了这个能力。常见的浏览器&#xff0c;如 Microsoft I…

【学习笔记】第二章——调度算法:先来先服务FCFS、短作业优先SJF、高响应比HRRN

文章目录一. 先来先服务&#xff08;FCFS&#xff09;二. 短作业优先&#xff08;SJF&#xff09;三. 高响应比优先1. 对前面两种算法的思考2. 描述四. 一、二、三总结例子都要手动写一遍哦&#xff5e;这三个是供早期的批处理系统使用的算法 一. 先来先服务&#xff08;FCFS&a…

【学习笔记】第二章——时间片轮转RR、优先级调度、多级反馈队列调度算法

文章目录一. 时间片轮转二. 优先级调度三. 多级反馈队列调度算法四. 总结一. 时间片轮转 公平&#xff0c;轮流给进程提供时间片只用于进程调度&#xff08;只有进程才能被分配时间片&#xff09;抢占式&#xff0c;由时钟装置发出时钟中断来通知**缺点&#xff1a;**高频的进…