我有一个名为tags_table的表,其id列为INT(11)
,标记列为VARCHAR(200)
。
有大约3,000,000个唯一ID,以及~300,000个唯一标记。
因为每个id有多个标签,所以有大约78,000,000行,这使得查询速度很慢。查询的示例是SELECT id FROM tags_table WHERE tag = "flower"
如果我创建一个包含唯一标记的表并修改了tags_table以包含这些标记字符串的索引而不是字符串本身,我的查询会执行得更快吗?如果是这样,我该怎么做?我的目标是最小化查询持续时间。
这是表格的创建声明:
CREATE TABLE `tags_table` (
`id` int(11) unsigned NOT NULL,
`tag` varchar(200) CHARACTER SET utf8 NOT NULL,
UNIQUE KEY `no_dup_tags` (`id`,`tag`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
答案 0 :(得分:1)
这似乎是一个经典的多对多映射表。一方是tag
。另一方面是id
,我假设它是另一个表中的id?
你需要拥有的“独一无二”是这对。这可以通过将(id, tag)
指定为唯一或(tag, id)
为唯一来限制。没有必要将两者都指定为唯一。
“唯一性”可以由UNIQUE(...)
或PRIMARY KEY(...)
声明。
据推测,您想查找给定ids
,和的所有tag
,您还想查找给定{{1}的所有tags
1}?然后你需要两个索引,一个以id
开头,一个以tag
开头。
Here是构建最佳映射表的7个技巧。
答案 1 :(得分:0)
是的,您可以使用唯一标记创建另一个表,并在该列标记上应用唯一索引并替换所有标记,并在当前表中添加一列以将标记文本更改为id,然后简单地索引该id列。
如果您不想进行任何更改,只需在标记列
上使用全文索引ALTER TABLE table_name
ADD FULLTEXT(column_name1)
注意: MyISAM有FULLTEXT搜索索引,InnoDB直到MySQL 5.6(2013年2月)才开始。