訪問方法的概念
設計MySQL的大叔把MySQL執行查詢語句的方式稱為訪問方法(access method)或者訪問類型。同一個查詢語句可以使用多種不同的訪問方法來執行,雖然最後的查詢結果都是一樣的,但是不同的執行方式話費的時間成本可能差距甚大。就像是從北京南鑼鼓巷到什剎海,你可以打車去,也可以坐地鐵去,坐公交去,還可以騎共享單車去,當然也可以走着去。
表結構
CREATE TABLE single_table(
id int not null auto_increment,
key1 VARCHAR(100),
key2 int,
key3 VARCHAR(100),
key_part1 VARCHAR(100),
key_part2 VARCHAR(100),
key_part3 VARCHAR(100),
common_field VARCHAR(100),
PRIMARY KEY(id),
key idx_key1(key1),
unique key uk_key2(key2),
key idx_key3(key3),
key idx_key_part(key_part1,key_part2,key_part3)
)engine=INNODB charset=utf8mb4
const
有時需要通過主鍵列定位一條記錄,如下:
select * from single_table where id = 12;
MySQL會直接利用主鍵值在聚簇索引中定位對應的用户記錄,如下:
與之類似,我們根據唯一二級索引列來定位一條記錄的速度也是賊快的。比如下面的查詢:
select * from single_talbe where key2 = 12;
這個查詢的執行過程的示意圖如下:
可以看到這個查詢的執行分為下面兩步:
- 步驟1. 在uk_key2對應的B+樹索引中,根據key2列與常數的等值比較條件定位到一條二級索引記錄。
- 步驟2. 然後再根據該記錄的id值到聚簇索引中獲取到完整的用户記錄。
設計MySQL的大叔認為,通過主鍵或者唯一二級索引列與常數的等值比較來定位一條記錄像是坐火箭一樣快的,所以他們把這種通過主鍵或者唯一二級索引列來定位一條記錄的訪問方法定義為const(意思是常數級別的,代價是可以忽略不計的)。不過這種const訪問方法只能在主鍵列或者唯一二級索引列與一個常數進行等值比較時才有效。如果主鍵或者唯一二級索引的索引列由多個列構成,則只有在索引列中的每一個列都與常數進行等值比較時,這個const訪問方法才有效(這是因為只有在該索引的每一個列都採用等值比較時,才可以保證最多隻有一條記錄符合搜索條件)。
對於唯一二級索引來説,在查詢列為null值時,情況比較特殊。比如下面這樣:
select * from single_table where key2 is null;
因為唯一二級索引列並不限制null值的數量,所以上述語句可能訪問到多條記錄。也就是説上面這個語句不可以使用const訪問方法來執行。