如果我的目标是找出列中是否有字符串。该列没有唯一的btree索引。哪个更快、更高效:在MYSQL中,INSTR varchar的前缀,以及为什么?
或者还有其他更有效的方法?
INSTR(column, 'value') > 0 vs
column LIKE 'value%'我查了几个问题,但只有关于扑克前后的问题和答案。
例如,
column LIKE '%value%'发布于 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之间可能没有任何有意义的区别。这里最好的选择可能是一个全文搜索。
发布于 2022-07-25 15:23:27
我的测试表(integers)上的一个简单测试表明,LIKE更快。
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:
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=1https://stackoverflow.com/questions/73111274
复制相似问题