IS NULL、IS NOT NULL、!=、BETWEEN、IN等等不能用索引吗?必须辟谣!
你来,我们一起精进!你不来,我和你的竞争对手一起精进!
编辑:业余草推荐:https://www.xttblog.com/?p=5336
其实,我在两年前就写了 IN 查询是走索引的。当时很多人没有经过验证,就直接得出 in 查询不走索引。MySQL 的 in 查询不走索引?我拿什么拯救你!
这两天,我看到微信群里,还有不少网友在讨论,哪些关键字不走索引。看到不少人还有认知错,我这里做了一个验证,分享给大家!
IS NULL、IS NOT NULL、!=、BETWEEN、IN等等不能用索引吗?必须辟谣!
为了演示效果,我们先创建一张 demo 表。具体创建表的 SQL 语句如下所示:
CREATETABLEdemo_info(idINTNOTNULLauto_increment,key1VARCHAR(100),key2INT,key3VARCHAR(100),key_part1VARCHAR(100),key_part2VARCHAR(100),key_part3VARCHAR(100),common_fieldVARCHAR(100),PRIMARYKEY(id),KEYidx_key1(key1),UNIQUEKEYuk_key2(key2),KEYidx_key3(key3),KEYidx_key_part(key_part1,key_part2,key_part3))ENGINE=INNODBCHARSET=utf8mb4;IS NULL 走索引
我们先看一个 IS NULL 的例子。
「IS NULL的例子」
explainselect*fromdemo_infowherekey1isnull
虽然没有key1为null的记录,但还是走了索引。
IS NOT NULL 走索引我们再看一个 IS NOT NULL 的例子。
「IS NOT NULL的例子」
explainselect*fromdemo_infowherekey1isnotnulllimit5;
因为这里所有记录的key1都不为null,为了避免全表扫描,我这里限制一下返回结果集数量。因为所有的结果都满足is not null,所有记录都会回表,那么优化器会选择全表扫描,而不是多此一举走非聚集索引+回表的方式。
!= 走索引我们继续看一个 != 不等于走索引的例子。
「!= 的例子」
explainselect*fromdemo_infowherekey1!="a"limit5;
这里也走了索引,限制结果集的理由同上一个例子。
between 走索引「between的例子」
explainselect*fromdemo_infowherekey1between"a"and"d"limit5;
走索引的理由同上。
多的例子就不举了,否则比较冗余,直接上结论。
结论:对于B+树索引来说,只要索引列使用了=、<=>、IN、NOT IN、IS NULL、IS NOT NULL、>、<、>=、<=、BETWEEN、!=(也就是<>)或者LIKE(只能是"a%"前缀字符形式)操作符连接起来,就可以使用到索引,如果你发现没走索引,请检查自己的结果集是否过多,限制一下结果集数量。
相关阅读
-
世界热推荐:今晚7:00直播丨下一个突破...
今晚19:00,Cocos视频号直播马上点击【预约】啦↓↓↓在运营了三年... -
NFT周刊|Magic Eden宣布支持Polygon网...
Block-986在NFT这样的市场,每周都会有相当多项目起起伏伏。在过去... -
环球今亮点!头条观察 | DeFi的兴衰与...
在比特币得到机构关注之后,许多财务专家预测世界将因为加密货币的... -
重新审视合作,体育Crypto的可靠关系才能双赢
Block-987即使在体育Crypto领域,人们的目光仍然集中在FTX上。随着... -
简讯:前端单元测试,更进一步
前端测试@2022如果从2014年Jest的第一个版本发布开始计算,前端开发... -
焦点热讯:刘强东这波操作秀
近日,刘强东发布京东全员信,信中提到:自2023年1月1日起,逐步为...