优化查询78,000,000行表(MySQL)

时间:2016-11-06 18:09:58

标签: mysql query-optimization mysql-workbench

我有一个名为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;

2 个答案:

答案 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月)才开始。