mysql可以建立聯合索引。 MySQL允許使用者建立一個最多包含16列的聯合索引,建立方法有兩個:1、建立表時創建,語法「CREATE TABLE 表名(列名1 類型PRIMARY KEY,列名2 類型,列名3 類型, ...INDEX 索引名(列名2,列名3...));」;2、修改表時創建,語法「CREATE INDEX 索引名ON 表名(列名2,列名3,列名4 );」。
本教學操作環境:windows7系統、mysql8版本、Dell G3電腦。
什麼是聯合索引?聯合索引的本質:最左邊匹配
兩個或更多欄位上的索引被稱為聯合索引,聯合索引又稱為複合索引。 MySQL允許使用者建立一個最多包含16欄的複合索引。
對於複合索引:Mysql從左到右的使用索引中的字段,一個查詢可以只使用索引中的一部分,但只能是最左側部分。
例如索引是key index (a,b,c)
. 可以支援a | a,b| a,b,c 3種組合進行查找,但不支援b,c進行查找.當最左側欄位是常數引用時,索引就十分有效。
查詢最佳化器將複合索引用於測試索引中所有列的查詢,或測試第一列,前兩列等的查詢。
如果在索引定義中以正確的順序指定列,則單一複合索引可以在同一個表上加速這些類型的查詢。
建立表格時建立聯合索引
語法:
CREATE TABLE 表名 ( c1 data_type PRIMARY KEY, c2 data_type, c3 data_type, c4 data_type, INDEX 索引名 (c2,c3,c4) );
在此語法中,聯合索引由三列c2,c3和c4組成。
修改表時建立聯合索引
可以使用下列CREATE INDEX語句將複合索引新增至現有表:
CREATE INDEX 索引名 ON 表名(c2,c3,c4);
請注意,如果您在(c1,c2,c3)上有複合索引,則您將在以下列組合之一上建立索引搜尋功能:
(c1) (c1,c2) (c1,c2,c3)
例如:
SELECT * FROM table_name WHERE c1 = v1; SELECT * FROM table_name WHERE c1 = v1 AND c2 = v2; SELECT * FROM table_name WHERE c1 = v1 AND c2 = v2 AND c3 = v3;
如果列不形成索引的最左前綴,則查詢最佳化器無法使用索引執行查找。例如,以下查詢無法使用複合進行查找:
SELECT * FROM table_name WHERE c1 = v1 AND c3 = v3;
MySQL聯合索引範例
我們將使用範例資料庫中的employees表進行示範。
以下語句在lastName和firstName欄位上建立聯合索引:
CREATE INDEX name ON employees(lastName, firstName);
SELECT firstName, lastName, email FROM employees WHERE lastName = 'Patterson';此查詢使用名稱索引,因為索引的最左邊前綴(即lastName欄位)用於尋找。 您可以透過EXPLAIN在查詢中新增子句來驗證這一點:
EXPLAIN SELECT firstName, lastName, email FROM employees WHERE lastName = 'Patterson';這是輸出: 2)查找姓氏Patterson和名字的員工Steve:
SELECT firstName, lastName, email FROM employees WHERE lastName = 'Patterson' AND firstName = 'Steve';在此查詢中,兩個lastName和firstName欄位都用於查找,因此,它使用name索引。 我們來核實一下:
EXPLAIN SELECT firstName, lastName, email FROM employees WHERE lastName = 'Patterson' AND firstName = 'Steve';輸出是: #3)找出姓氏Patterson和名字是Steve或的員工Mary:
SELECT firstName, lastName, email FROM employees WHERE lastName = 'Patterson' AND (firstName = 'Steve' OR firstName = 'Mary');此查詢類似於第二個查詢,其中兩個lastName和firstName欄位都用於尋找。 以下語句驗證索引用法:
EXPLAIN SELECT firstName, lastName, email FROM employees WHERE lastName = 'Patterson' AND (firstName = 'Steve' OR firstName = 'Mary');輸出是: #查詢最佳化器無法在下列查詢中使用name索引進行查找,因為只使用了firstName不是索引最左前綴的列:
SELECT firstName, lastName, email FROM employees WHERE firstName = 'Leslie';類似地,查詢優化器不能在以下查詢中使用名稱索引進行查找,因為firstName或lastName列用於查找。
SELECT firstName, lastName, email FROM employees WHERE firstName = 'Anthony' OR lastName = 'Steve';【相關推薦:
mysql影片教學】
以上是mysql可以建立聯合索引嗎的詳細內容。更多資訊請關注PHP中文網其他相關文章!