2017-09-11 53 views
1

兩個表:哪個表在MYSQL中速度更快?

CREATE TABLE `htmlcode_1` (
    `global_id` int(11) NOT NULL, 
    `site_id` int(11) NOT NULL, 
    PRIMARY KEY (`global_id`), 
    KEY `k_site` (`site_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

CREATE TABLE `htmlcode_2` (
    `global_id` int(11) NOT NULL, 
    `site_id` int(11) NOT NULL, 
    PRIMARY KEY (`site_id`,`global_id`), 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

其中之一應該是選擇,爲什麼快?

'select * from table where site_id=%s' 
+1

你的兩個表格描述了不同的實體。如果'global_id'是你實際的主鍵(它可能是唯一的),不要選擇一個不同的pk--因爲它不再強制這個唯一性。你不應該這樣選擇你的主鍵。在這種情況下,額外的索引將具有相同的效果(以該查詢的速度爲準)。關於速度,比爾給了你答案。 – Solarflare

+0

@Solarflare - 在MySQL中,根據定義,「PRIMARY KEY」是'UNIQUE';關於它沒有「可能獨一無二」。 –

+0

@RickJames我的意思是:'global_id'可能是一個固有的值,它應該是唯一的,它所描述的(否則第一個表是不可能的)。如果evg使用'(site_id,global_id)'作爲pk只是爲了加快查詢速度,它將會失去這個屬性。 – Solarflare

回答

3

對於那個SELECT查詢,後面的表可能稍微快一些,假設表具有非平凡的行數。

當通過主鍵查詢InnoDB時,查找是針對表的聚集索引。

輔助鍵查找需要在索引中進行查找,然後顯示主鍵值,然後使用主鍵進行查找。所以這使用了兩個查找。

+1

僅當有其他列時才進行兩次查找。否則,這兩張表比較快。 @Evg - 如果還有其他專欄,你必須這樣說,否則我們可能會給你錯誤的答案。 –

+0

@RickJames,夠公平的。在這種情況下,該示例沒有顯示其他列,因此無論如何我們都會覆蓋索引。但是我認爲這不太可能是現實中的這種簡單表格。 –

0

使用PRIMARY KEY的原因是爲了讓無論是快速訪問OR參照完整性(CONSTRAINT ... FOREIGN KEY ...

在你的第二個例子,你不必爲參照完整性正確的密鑰,如果任何其他表指到你的桌子。在這種情況下,其他操作將非常緩慢。

在任何情況下,對於您的特殊情況,速度的差異應該太小而且微不足道,但正確的設計將決定第一種方法。

0

第一個表格代表每個「網站」中的許多「全局變量」。也就是說,「多對一」關係。但這是做錯的「錯誤」方式。相反,Globals表應該有一列site_id來表示與Sites表的這種關係。同時,htmlcode_1的存在是一種低效的浪費。

第二張表可能表示「網站」和「全局」之間的「多對多」關係。如果這是您真正想要的,請參閱my tips。由於您可能從全局映射到站點,因此需要使用另一個索引。