sql - 当该字段完全等于“A”时,like '%A%' 语句和 in('A') 语句之间有什么区别吗?
问题描述
我认为如果这个字段有多个字符,那么in ('something')
比 快like '%something%'
,对吧?
但是如果只有一个字符呢?
CREATE TABLE `example` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`name` varchar(50) DEFAULT NULL COMMENT 'name',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='example';
INSERT INTO `example` (`id`, `name`)
VALUES
(1, 'A'),
(2, 'B'),
(3, 'C'),
(4, 'D'),
(5, NULL),
(6, 'E');
select * from example where name like '%A%';
那么,和有什么区别select * from example where name in ('A');
呢?in
比 快吗like
?</p>
此外,关于select * from example where name like '%%';
和select * from example where name in ('A','B','C','D','E');
解决方案
在大多数数据库中,这些表达式可以使用索引:
where name = 'A'
where name in ('A')
where name like 'A%'
这不能使用标准索引:
where name like '%A%'
原因是因为模式的开头有一个通配符。
通常,您不依赖索引来提高 Hive 的性能。如果您的数据被分区,您可能会遇到类似的问题name
——在这种情况下,我怀疑这LIKE
会修剪分区。
所以,我认为性能上的差异是LIKE
字符串比较的开销。我想那LIKE
会贵一点,但不会贵得多。
不过,请随意运行计时以查看它在您的系统上的执行情况。
推荐阅读
- json - 从 unix 脚本中给定的文件名列表创建一个 json
- javascript - TypeError:“属性”是只读的
- java - 在Java中计算双位小数点后的位数的程序
- php - LDAP 用户身份验证适用于 CN,但不适用于 sAMAccountName
- c# - 使用 openxml 合并演示文稿文件时显示空白的图像
- sql - 在 SQL 中加入 2 个没有公共列字段的查询?
- flutter - Flutter Flame 游戏 - 动画速度(更新持续时间)
- python - 如何在开发中正确创建 Python 功能分支版本?(点子和 PEP-440)
- excel - 用于附加记录的 SharePoint/Excel 脚本
- javascript - 如何将“用户”对象从我的 TopBar.js 导出到 App.js?