2016-11-06 29 views
0

我有一個名爲tags_table的表,其中id列爲INT(11)類型,標記列爲VARCHAR(200)優化查詢78,000,000行表(MySQL)

有〜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

你忘記了重要的事實 - 索引。你有什麼? –

+0

你可以發佈你的表的結構 –

+0

@juergend我有一個使id標籤對獨一無二,但是這都是 –

回答

0

是你可以讓另一臺具有獨特的標記和標籤是列應用唯一索引和替換所有標籤ANS中添加更多的列您當前的表格將標記文本更改爲id,然後簡單索引該id列。

如果你不希望任何變化只要使用全文索引上的標籤欄

ALTER TABLE table_name 
ADD FULLTEXT(column_name1) 

注:的MyISAM具有全文搜索索引,InnoDB的沒有,直到MySQL的5.6(2月2013年)。

+0

這樣做是否會顯着加快我的查詢速度? –

+0

是的,它會確定:) –

+0

並刪除該唯一索引(no_dup_tags) –

1

這似乎是一個經典的多對多映射表。一方面是tag。另一方面是id,我認爲這是一個ID到其他表中?

你需要的是「獨一無二」的一對。這可以通過指定(id, tag)是唯一的或(tag, id)是唯一的來限制的。沒有必要指定兩者都是唯一的。

「唯一性」可以通過UNIQUE(...)PRIMARY KEY(...)來聲明。

大概要查找所有ids對於給定tag你也想找到所有的tags對於給定id?那麼你需要兩個索引,一個以tag開頭,一個以id開頭。

Here是構建最佳映射表的7個技巧。