久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

mysql可不可以創建聯合索引

145次閱讀
沒有評論

共計 2635 個字符,預計需要花費 7 分鐘才能閱讀完成。

這篇文章主要介紹“mysql 可不可以創建聯合索引”,在日常操作中,相信很多人在 mysql 可不可以創建聯合索引問題上存在疑惑,丸趣 TV 小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”mysql 可不可以創建聯合索引”的疑惑有所幫助!接下來,請跟著丸趣 TV 小編一起來學習吧!

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
 *
 table_name
WHERE
 c1 = v1;
 
 
SELECT
 *
 table_name
WHERE
 c1 = v1 AND 
 c2 = v2;
 
 
SELECT 
 *
 table_name
WHERE
 c1 = v1 AND 
 c2 = v2 AND 
 c3 = v3;

如果列不形成索引的最左前綴,則查詢優化器無法使用索引執行查找。例如,以下查詢無法使用復合進行查找:

SELECT
 *
 table_name
WHERE
 c1 = v1 AND 
 c3 = v3;

MySQL 聯合索引示例

我們將使用示例數據庫中的 employees 表進行演示。

以下語句在 lastName 和 firstName 列上創建聯合索引:

CREATE INDEX name 
ON employees(lastName, firstName);

首先,name 索引可用于指定 lastName 值的查詢中的查找,因為 lastName 列是索引的最左前綴。

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

name 索引用于在以下的查詢查找:

1)查找姓氏為的員工 Patterson

SELECT 
 firstName, 
 lastName, 
 email
 employees
WHERE
 lastName =  Patterson

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

您可以通過 EXPLAIN 在查詢中添加子句來驗證這一點:

EXPLAIN SELECT 
 firstName, 
 lastName, 
 email
 employees
WHERE
 lastName =  Patterson

這是輸出:

2)查找姓氏 Patterson 和名字的員工 Steve:

SELECT 
 firstName, 
 lastName, 
 email
 employees
WHERE
 lastName =  Patterson AND
 firstName =  Steve 

在此查詢中,兩個 lastName 和 firstName 列都用于查找,因此,它使用 name 索引。

我們來核實一下:

EXPLAIN SELECT 
 firstName, 
 lastName, 
 email
 employees
WHERE
 lastName =  Patterson AND
 firstName =  Steve 

輸出是:

3)查找姓氏 Patterson 和名字是 Steve 或的員工 Mary:

SELECT 
 firstName, 
 lastName, 
 email
 employees
WHERE
 lastName =  Patterson AND
 (firstName =  Steve  OR 
 firstName =  Mary 

此查詢類似于第二個查詢,其中兩個 lastName 和 firstName 列都用于查找。

以下語句驗證索引用法:

EXPLAIN SELECT 
 firstName, 
 lastName, 
 email
 employees
WHERE
 lastName =  Patterson AND
 (firstName =  Steve  OR 
 firstName =  Mary 

輸出是:

查詢優化器不能在以下查詢中使用 name 索引進行查找,因為只使用了 firstName 不是索引最左前綴的列:

SELECT 
 firstName, 
 lastName, 
 email
 employees
WHERE
 firstName =  Leslie

類似地,查詢優化器不能在以下查詢中使用名稱索引進行查找,因為 firstName 或者 lastName 列用于查找。

SELECT 
 firstName, 
 lastName, 
 email
 employees
WHERE
 firstName =  Anthony  OR
 lastName =  Steve

到此,關于“mysql 可不可以創建聯合索引”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注丸趣 TV 網站,丸趣 TV 小編會繼續努力為大家帶來更多實用的文章!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-13發表,共計2635字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 大安市| 城步| 会昌县| 屏东市| 阜南县| 怀化市| 石狮市| 海伦市| 台东县| 宁化县| 富川| 兴化市| 榆中县| 来安县| 子洲县| 永泰县| 英超| 永安市| 扎囊县| 涞源县| 郑州市| 大英县| 康乐县| 镇安县| 静宁县| 沿河| 南投市| 玉门市| 射洪县| 育儿| 河池市| 兴仁县| 郁南县| 四川省| 镇原县| 红河县| 利辛县| 河东区| 南充市| 新民市| 资阳市|