2015-07-11 133 views
1

我對數據庫相對來說比較新;很抱歉,如果這是我還沒有吸收的知識。我google搜索,但沒有找到滿意的答案。我正在編寫一個程序,它遍歷〜20mio文件,並將它們的文件名全部放在一個表中(我有強烈的選擇將它保存在一張表中供將來使用)。每個file_name包含BIGINT id(以及其他Ascii字符)。每個BIGINT id只有約20 file_name。我現在的問題:我可以利用這個名稱結構來獲得更好的查詢性能嗎?優化查詢性能,MySQL

我的表結構至今:

CREATE TABLE IF NOT EXISTS files 
     (file_name VARCHAR(40) CHARACTER SET ascii NOT NULL PRIMARY KEY," 
     id BIGINT UNSIGNED, 
     ...) 

我的查詢語句只是:

WHERE file_name = '...' 

是它,例如,更好地指數id然後查找file_nameid

非常感謝!

+1

爲了判斷「查找性能」,我們​​來看看「SELECT」語句。 –

+0

'id'是什麼?它是如何計算的?你真的需要它嗎? –

回答

2

我知道每個ID可以有20個不同的文件名,所以ID不是唯一的。然後,您不能使用主鍵的ID。 如果知道file_name是唯一的,唯一的選擇是使用file_name作爲主鍵。如果您查找特定的file_name,這將爲您提供最佳性能。 如果您還需要查找具有特定ID的所有文件,則必須在ID字段中創建一個非唯一索引。

+1

命名一個列ID然後不存儲一個PK將會使任何有意義的表格都感到困惑。 – luksch

1

通常的表格設計是讓id成爲PRIMARY KEY。如果您還想查詢file_name,那麼該列上的索引可能是正確的選擇。

+0

很酷。非常感謝您的快速回答。 'file_name'實際上是唯一對我很重要的事情。 'id'就是我想要利用的東西;因此問題和你的答案。 不過問題很簡單:如果我在PK'id'的頂部編寫'file_name',會對性能造成多大影響? – dotwin

+0

〜20mio行使索引當然非常值得使用,特別是當索引是唯一的時候。所以你很可能會發現你的文件幅度比索引更快。您用索引尺寸付款。當索引不再適合數據庫的內存時,事情會變得棘手和緩慢。確保數據庫有足夠的RAM。 – luksch

+0

@luksch - 如果表是InnoDB,那麼'PRIMARY KEY'與數據聚集在一起,因此不需要額外的空間。一個_secondary_'INDEX(id)'會花費一堆空間,可能比表本身更多。 –