首頁 >資料庫 >mysql教程 >mysql可以建立聯合索引嗎

mysql可以建立聯合索引嗎

青灯夜游
青灯夜游原創
2022-06-15 16:22:425981瀏覽

mysql可以建立聯合索引。 MySQL允許使用者建立一個最多包含16列的聯合索引,建立方法有兩個:1、建立表時創建,語法「CREATE TABLE 表名(列名1 類型PRIMARY KEY,列名2 類型,列名3 類型, ...INDEX 索引名(列名2,列名3...));」;2、修改表時創建,語法「CREATE INDEX 索引名ON 表名(列名2,列名3,列名4 );」。

mysql可以建立聯合索引嗎

本教學操作環境: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表進行示範。

mysql可以建立聯合索引嗎

以下語句在lastName和firstName欄位上建立聯合索引:

CREATE INDEX name 
ON employees(lastName, firstName);
  • ##首先,name索引可用來指定lastName值的查詢中的查找,因為lastName列是索引的最左前綴。

  • 其次,name索引可用來指定lastName和firstName值組合的值的查詢。

name索引用於在以下的查詢中尋找:

1)中尋找姓氏為的員工Patterson

SELECT 
    firstName, 
    lastName, 
    email
FROM
    employees
WHERE
    lastName = 'Patterson';

此查詢使用名稱索引,因為索引的最左邊前綴(即lastName欄位)用於尋找。

您可以透過EXPLAIN在查詢中新增子句來驗證這一點:

EXPLAIN SELECT 
    firstName, 
    lastName, 
    email
FROM
    employees
WHERE
    lastName = 'Patterson';

這是輸出:

mysql可以建立聯合索引嗎

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';

輸出是:

mysql可以建立聯合索引嗎

#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');

輸出是:

mysql可以建立聯合索引嗎

#查詢最佳化器無法在下列查詢中使用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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn