我从来没有找到一种很好的方法来索引一行的多个字段作为索引的条目,也没有在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

还是有其他方法可以有效地做到这一点?

有帮助吗?

解决方案

如果我正确理解,此查询应该有效:

SELECT id FROM testTag WHERE LOCATE('bar', CONCAT(tag1,'.',tag2,'.',tag3)) > 0;

给定此表结构:

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 |
+----+-------------+---------+-------+---------------+------+---------+------+------+--------------------------+

其他提示

每当您有一个编号字段名称时,您都不会将表格标准化。相反,我可能有一个“标签”表,然后可以加入我的标签:

ID tag
-- ---
01 abc
01 xyz
01 bla
02 foo
02 bar
02 ble
03 xyz
03 bla
03 bar

(主要关键是多列,并且在多列指数中的第二个字段中有一个额外的索引)

如果有必要以特定顺序为单位,则可以始终添加“订单”列。

许可以下: CC-BY-SA归因
不隶属于 dba.stackexchange
scroll top