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)
或者有没有其他方法可以有效地做到这一点?
如果我理解正确,这个查询应该可以工作:
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)
归档时间: |
|
查看次数: |
196 次 |
最近记录: |