2012-02-21 70 views
1

說我有兩張桌子。一種叫做typeDB,對於包含索引,類型名稱和另一個表中這些類型的元素的ID列表的行具有這種類型。爲了從第二個表中的行 - 讓叫它dataDB - 0類型,然後我可以基本上做到(拙劣的僞代碼):哪個MySQL查詢將有更快的檢索?

$list = SELECT list FROM typeDB WHERE index=0 

然後我可以從dataDB使用獲得的行:

$array = explode($list) 
for (every element of list $i) 
    $results = SELECT * FROM dataDB WHERE index=$array[$i] 

所以我的問題是...這是任何速度比僅僅有一個類型字段中dataDB,然後做:

$results = SELECT * FROM dataDB WHERE type=$type 

我的想法是,BEC因爲第一種方法不需要通過整個數據庫,它會更快。但我真的不知道數據庫查詢是如何工作的。你認爲哪種方式最有效率?謝謝。

回答

1

把一個索引放在類型列上並使用你的第二個版本,它會快得多。 另請注意,我認爲你對數據庫是什麼感到困惑。數據庫是表(包括觸發器,存儲過程,視圖等)的集合,因此命名錶somethingDB有點令人困惑。 當我說索引我指的是一個數據庫索引(與看起來像一個名爲索引的列無關)。

創造你使用像這樣(爲MySQL)

ALTER TABLE dataDB ADD COLUMN `type` varchar(64) 
CREATE INDEX type_index ON dataDB(type) 

類似其他DBMS的

正如評論長大列和索引,則需要加入的類型列。 您可以擁有一個表格,其中包含類型和自動遞增ID,並在類型/名稱字段中指定一個唯一約束。然後使用自動遞增ID作爲外鍵,或者僅創建一個具有一列(類型)的類型表這是主鍵。無論哪種方式將工作,都有好處(我會去與自動增量列,因爲我相信它是更靈活的代碼工作)。當你去查詢dataDB,如果你想要的類型名稱(而不是整數),你會做一個

CREATE TABLE dataType (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
name VARCHAR(64) UNIQUE 
) 



ALTER TABLE dataDB ADD COLUMN `type` INT; 
ALTER TABLE dataDB ADD CONSTRAINT fk_type FOREIGN KEY (type) REFERENCES dataType(id); 

則:

如果你沒有用自動遞增列去,你已經有了這個加入這樣的:

SELECT dataDB.list, dataType.name FROM dataDB 
INNER JOIN dataType ON dataDB.type=dataType.id 
where dataDB.type="$type" 

這是假定類型是一些樣的名字,而不是整數,與雖然開始,如果他們一直只是把int值具體的數據類型的表的唯一列整數,因此這將是您的主鍵。

+1

取決於有多少種不同的類型。如果他只爲100個數據元組獲得5種類型,則索引將不會被使用,因爲它只具有<20%的選擇性。但我同意你的回答。使用第二個版本並加入typeDB表。 – Basti 2012-02-21 07:06:15

+0

雖然我會做一個改變,因爲我會在'datatType ON'規範中包含'dataDB.type =「$ type」'來限制連接的行,因爲目前您將連接'dataType'中的所有行即使只有'dataType'的一個子集被請求時,也可以將其轉換爲'dataDB'。不是小桌子的考慮因素,而是桌子增長的良好做法。 – 2012-02-21 08:40:39

+0

嗯有趣的捕獲。我從來沒有真正理解在ON子句中加入額外的條件與WHERE子句之間的區別。 – 2012-02-21 17:21:10