如何根据一行的字段在索引上创建多个条目?

Man*_*ero 4 mysql index optimization

我从未找到将一行的多个字段索引为索引条目或在 MySQL 上模拟此功能的好方法。

当您将字段用作标签或类似概念时,就会出现问题。例如:字段名称为 tag1、tag2、tag3。要快速搜索具有特定标签的行,您需要有 3 个索引并以最基本和最明显的方式执行 3 个单独的查询。

有没有办法将这 3 个字段索引为一个索引的条目,只允许一次搜索。

ID tag1 tag2 tag3
-- ---- ---- ----
01 abc  xyz  bla
02 foo  bar  ble
03 xyz  bla  bar

index
abc -> 01
bar -> 02 03
bla -> 01 03
ble -> 02
foo -> 02
xyz -> 01 03
Run Code Online (Sandbox Code Playgroud)

或者有没有其他方法可以有效地做到这一点?

Der*_*ney 5

如果我理解正确,这个查询应该可以工作:

SELECT id FROM testTag WHERE LOCATE('bar', CONCAT(tag1,'.',tag2,'.',tag3)) > 0;
Run Code Online (Sandbox Code Playgroud)

鉴于此表结构:

CREATE TABLE `testTag` (
  `id` int(11) NOT NULL,
  `tag1` varchar(10) DEFAULT NULL,
  `tag2` varchar(10) DEFAULT NULL,
  `tag3` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `tags` (`tag1`,`tag2`,`tag3`)
) ENGINE=InnoDB

mysql> EXPLAIN SELECT id FROM testTag WHERE LOCATE('bar', CONCAT(tag1,'.',tag2,'.',tag3)) > 0;
+----+-------------+---------+-------+---------------+------+---------+------+------+--------------------------+
| id | select_type | table   | type  | possible_keys | key  | key_len | ref  | rows |     Extra                    |    
+----+-------------+---------+-------+---------------+------+---------+------+------+--------------------------+
|  1 | SIMPLE      | testTag | index | NULL          | tags | 39      | NULL |   15 | Using where; Using index |
+----+-------------+---------+-------+---------------+------+---------+------+------+--------------------------+
Run Code Online (Sandbox Code Playgroud)