複合索引
創建索引的時候可以選擇多列,這樣的索引叫複合索引;例如
CREATE TABLE `account4` (
`id` bigint(20) DEFAULT NULL,
`name` varchar(6) DEFAULT NULL,
`balance` decimal(10,0) DEFAULT NULL,
primary key idx_id(id),
key idx_name_balance(name,balance)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
插入一行數據
insert into account4 value (1,'jim',33);
這裏的 idx_name_balance 便是一個複合索引
覆蓋索引
那麼什麼是覆蓋索引呢?附一張《高性能mysql》裏的一頁信息,從截圖裏可以看出覆蓋索引我們可以稱之爲工具,它的發生場景是:我們的查詢條件和輸出的字段是一個複合索引列的子集;
以account4表爲例子,
select name,balance from account4 where name = 'jim' and balance = 33;
便是一個覆蓋索引查詢,因爲name和balance都在查詢輸出列並作爲where過濾條件,我們可以通過執行計劃看出來:執行計劃的Extra 有Using index則就是覆蓋索引的標記
增加一個條件
主鍵列表作爲輸出
我們修改一下select語句,新增一個id
有人可能會問,按照定義這個應該不是覆蓋索引場景,因爲輸出列多了一個id;
但是主鍵是一個特殊的存在,我們建立的二級索引在存儲的時候是會連同該行的逐漸值一起存儲的,只要查詢的列只需要通過掃描索引而不需要二次索引查詢獲得就叫做覆蓋索引;
主鍵列作爲條件
我們再修改一下sql
有的同學會問,這種情況如果按照上面的描述,應該就是一個覆蓋索引場景了;但是mysql在分析執行計劃的時候,發現有主鍵列參與了where過濾,那麼這個查詢就會優先走主鍵索引就無需二次索引(即通過二級索引先找到主鍵,再根據主鍵索引去查詢真實數據);