首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >它比MYSQL中varchar的INSTR前缀更快。

它比MYSQL中varchar的INSTR前缀更快。
EN

Stack Overflow用户
提问于 2022-07-25 14:54:07
回答 2查看 45关注 0票数 0

如果我的目标是找出列中是否有字符串。该列没有唯一的btree索引。哪个更快、更高效:在MYSQL中,INSTR varchar的前缀,以及为什么?

或者还有其他更有效的方法?

代码语言:javascript
运行
复制
INSTR(column, 'value') > 0 

vs

代码语言:javascript
运行
复制
column LIKE 'value%'

我查了几个问题,但只有关于扑克前后的问题和答案。

例如,

代码语言:javascript
运行
复制
column LIKE '%value%'
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-07-25 15:01:44

他们不一样。

column like 'value%'是以匹配开始的,相当于INSTR(column, 'value') = 1,而不是INSTR(column, 'value') > 0

另一方面,INSTR(column, 'value') > 0是一个包含anywhere匹配的,相当于column LIKE '%value%'而不是column LIKE 'value%'

在这四个表达式中,column LIKE 'value%'可能执行得最好,因为它是唯一有机会为列使用任何索引的表达式。

但是,听起来您希望包含任何地方的匹配,而且column like '%value%'INSTR(column, 'value') > 0之间可能没有任何有意义的区别。这里最好的选择可能是一个全文搜索

票数 2
EN

Stack Overflow用户

发布于 2022-07-25 15:23:27

我的测试表(integers)上的一个简单测试表明,LIKE更快。

代码语言:javascript
运行
复制
MySQL [test]> select * from integers where instr(t2,'A')>0;
+----+--------------------------------------+----------+------+
| i  | t1                                   | f        | t2   |
+----+--------------------------------------+----------+------+
| 42 | 8f0c8b96-aa60-11eb-aa31-309c23b7280c | 0.983418 | ABC  |
+----+--------------------------------------+----------+------+
1 row in set (24.08 sec)

MySQL [test]> select * from integers where instr(t2,'A')>0;
+----+--------------------------------------+----------+------+
| i  | t1                                   | f        | t2   |
+----+--------------------------------------+----------+------+
| 42 | 8f0c8b96-aa60-11eb-aa31-309c23b7280c | 0.983418 | ABC  |
+----+--------------------------------------+----------+------+
1 row in set (24.11 sec)

MySQL [test]> explain select * from integers where instr(t2,'A')>0;
+----+-------------+----------+------------+------+---------------+------+---------+------+---------+----------+-------------+
| id | select_type | table    | partitions | type | possible_keys | key  | key_len | ref  | rows    | filtered | Extra       |
+----+-------------+----------+------------+------+---------------+------+---------+------+---------+----------+-------------+
|  1 | SIMPLE      | integers | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 2104867 |   100.00 | Using where |
+----+-------------+----------+------------+------+---------------+------+---------+------+---------+----------+-------------+
1 row in set, 1 warning (0.00 sec)

MySQL [test]> select * from integers where t2 like 'A%';
+----+--------------------------------------+----------+------+
| i  | t1                                   | f        | t2   |
+----+--------------------------------------+----------+------+
| 42 | 8f0c8b96-aa60-11eb-aa31-309c23b7280c | 0.983418 | ABC  |
+----+--------------------------------------+----------+------+
1 row in set (1.00 sec)

MySQL [test]> select * from integers where t2 like 'A%';
+----+--------------------------------------+----------+------+
| i  | t1                                   | f        | t2   |
+----+--------------------------------------+----------+------+
| 42 | 8f0c8b96-aa60-11eb-aa31-309c23b7280c | 0.983418 | ABC  |
+----+--------------------------------------+----------+------+
1 row in set (1.00 sec)

MySQL [test]> explain select * from integers where t2 like 'A%';
+----+-------------+----------+------------+------+---------------+------+---------+------+---------+----------+-------------+
| id | select_type | table    | partitions | type | possible_keys | key  | key_len | ref  | rows    | filtered | Extra       |
+----+-------------+----------+------------+------+---------------+------+---------+------+---------+----------+-------------+
|  1 | SIMPLE      | integers | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 2104867 |    11.11 | Using where |
+----+-------------+----------+------------+------+---------------+------+---------+------+---------+----------+-------------+
1 row in set, 1 warning (0.00 sec)

该表有2621442条记录,在MySQL 8.0.29中,其中包含以下DDL:

代码语言:javascript
运行
复制
CREATE TABLE `integers` (
  `i` int NOT NULL,
  `t1` varchar(36) DEFAULT NULL,
  `f` float DEFAULT NULL,
  `t2` varchar(1024) DEFAULT NULL,
  PRIMARY KEY (`i`),
  KEY `integers_t1` (`t1`),
  KEY `idx_f` (`f`),
  KEY `even` (((`i` % 2)))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci STATS_AUTO_RECALC=1
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73111274

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档