2014-03-02 36 views
1

我有一個簡單的鏈接表,請參閱下面的create sql。
我的問題是,如果我有amtw_u1,是否需要amtw_propnameid_idx和amt_amt_concept_id_idx的單個索引? 我使用此表來加入和過濾amtw_propnameid和amtw_amt_concept_id。我使用唯一索引來強制限制,即沒有兩行可以相同。如果在一個唯一的密鑰中,使用MYSQL是各個字段所需的密鑰?

$sql= "CREATE TABLE `refset_amt_webster` (
    amtw_id int unsigned not null AUTO_INCREMENT, 
    amtw_propnameid int null default null comment 'links to the Webster proprameid drugs table', 
    amtw_amt_concept_id bigint not null comment 'links to the AMT concept id', 
    amtw_disabled tinyint unsigned not null default 0 comment '1=disabled', 
    PRIMARY KEY(amtw_id), 
    KEY amtw_propnameid_idx (amtw_propnameid), 
    KEY amtw_amt_concept_id_idx (amtw_amt_concept_id), 
    UNIQUE KEY amtw_u1 (amtw_propnameid,amtw_amt_concept_id) 
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT 'AMT to MIMS linking table.';"; 
+0

大概不會。另外,代理鍵(amtw_id)似乎是多餘的。您的唯一密鑰可以是主密碼 – Strawberry

+2

根據您的'amtw_u1'鍵的順序,我相信'amtw_propnameid_idx'不會錯過,因爲mysql可以使用'amtw_u1'作爲單獨的'amtw_propnameid'的索引。但是,它不能單獨使用'amtw_u1'索引查詢'amtw_amt_concept_id'。請參閱[多列索引上的MySQL文檔](http://dev.mysql.com/doc/refman/5.6/en/multiple-column-indexes.html) –

+0

另外,草莓是正確的,您可以使用組合鍵作爲一個主鍵,然而合理的人(和企業標準)在你是否應該有'自然'主鍵方面有所不同,所以有些人仍然會使用合成的PK。 –

回答

1

索引只能用於優化使用最左列的查詢;百里 - 約翰遜評論,

如果表中有一個多列索引, 索引的任何最左前綴可以由優化用來尋找行。例如,如果 在(col1,col2,col3)上有三列索引,則已在(col1),(col1,col2)和(col1,col2,col3)上爲 搜索功能編制索引。

如果列沒有形成索引的最左側前綴 ,那麼MySQL不能使用索引。假設你有這裏顯示的SELECT語句:

SELECT * FROM tbl_name WHERE col1 = val1;

SELECT * FROM tbl_name WHERE col1 = val1 AND col2 = val2;

SELECT * FROM tbl_name WHERE col2 = val2;

SELECT * FROM tbl_name WHERE col2 = val2 AND col3 = val3;

如果(col1,col2,col3), 上存在索引,則只有前兩個查詢使用該索引。第三個和第四個查詢 確實涉及索引列,但(col2)和(col2,col3)不是 (col1,col2,col3)的最左邊前綴。

See the mysql documentation for more info