2012-05-15 37 views

回答

46

不,一般意義上說,我不相信5.6甚至有這個功能。它能夠僅使用一個塔的領先部分(該功能已經存在了很長一段時間),但在第二次或隨後的字符,或任何其他更復雜的函數不1開始。

例如,下面創建使用名稱的前五個字符的索引:

create index name_first_five on cust_table (name(5)); 

對於更復雜的表達式,可以由具有另一柱,用在可轉位數據實現類似的效果它,然後使用插入/更新觸發器來確保它正確填充。

除了冗餘數據的浪費空間外,這幾乎是一回事。

而且,雖然在技術上違反了3NF,這是通過使用觸發器的緩解,以保持數據同步(這一點是往往以增加性能完成)。

+0

謝謝你...對於我的情況,我只需要使用字符串的前8個字符作爲索引。我可以使用:在cust_table(name(8))上創建索引name_first_8; – user836026

+2

@ user836026:是的,應該有效。 – paxdiablo

+0

@paxdiablo,請更新5.6'5.7'。如果你在其中添加報價8.0,那將會很棒。 – Adrian

17

MySQL不支持這個,但有一個選擇。

1.從MySQL 5.7.6

您可以使用自動生成的列與它的指數保持子:

CREATE TABLE SomeTable (
    id CHAR(10), 
    sub_id CHAR(8) AS SUBSTRING(id, 1, 8) STORED, INDEX(sub_id) 
) 

作爲Benjamin指出,InnoDB支持二級指標在虛擬列上,所以可以省略STORED關鍵字。事實上,虛擬列上的二級索引可能更可取。這裏更多的信息:Secondary Indexes and Generated Columns

2.之前的MySQL 5.7.6

您可以使用觸發器更新一列,上面有一個索引:

CREATE TABLE SomeTable (
    id CHAR(10), 
    sub_id CHAR(8) , INDEX(sub_id) 
); 

CREATE TRIGGER TR_SomeTable_INSERT_sub_id 
    BEFORE INSERT 
    ON SomeTable FOR EACH ROW 
    SET NEW.sub_id = SUBSTRING(NEW.id, 1, 8); 

CREATE TRIGGER TR_SomeTable_UPDATE_sub_id 
    BEFORE UPDATE 
    ON SomeTable FOR EACH ROW 
    SET NEW.sub_id = SUBSTRING(NEW.id, 1, 8); 
+1

請注意,根據[documentation](https://dev.mysql.com/doc/refman/5.7/en/create-table-generated-columns.html),* InnoDB支持虛擬列*上的二級索引。所以你可以省略'STORED'關鍵字來使列變爲虛擬的,節省一些存儲空間,並且仍然有數據索引! – Benjamin

相關問題