国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

mysql可以創建聯合索引嗎

2024-07-24 12:34:22
字體:
來源:轉載
供稿:網友
  什么是聯合索引?聯合索引的本質:最左匹配
 
  兩個或更多個列上的索引被稱作聯合索引,聯合索引又叫復合索引。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';
 
  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可不可以創建聯合索引”的學習就結束了,希望能夠解決大家的疑惑。

(編輯:武林網)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 汉源县| 泰顺县| 隆昌县| 武宁县| 太白县| 平塘县| 平邑县| 桂阳县| 淮南市| 将乐县| 句容市| 太和县| 南靖县| 海原县| 新竹县| 巴里| 海淀区| 沧州市| 宣化县| 黑水县| 广丰县| 房产| 稻城县| 都安| 万年县| 通山县| 仪陇县| 电白县| 云安县| 道真| 高尔夫| 澳门| 平乡县| 甘谷县| 长顺县| 敖汉旗| 平江县| 大渡口区| 克山县| 琼海市| 广元市|