MySQL 是目前最流行的關(guān)系型數(shù)據(jù)庫(kù)之一,在使用過(guò)程中,索引是一個(gè)重要的工具,可以提高數(shù)據(jù)查詢(xún)的效率。默認(rèn)情況下,MySQL 提供了兩種索引類(lèi)型:B-Tree 索引和哈希索引。
B-Tree 索引是一種基于平衡樹(shù)的數(shù)據(jù)結(jié)構(gòu),將索引字段值存儲(chǔ)在樹(shù)中的節(jié)點(diǎn)上。它的查找時(shí)間復(fù)雜度為 O(log n) ,但是需要額外的空間來(lái)存儲(chǔ)樹(shù)的結(jié)構(gòu),當(dāng)數(shù)據(jù)量很大時(shí),可能需要比較大的內(nèi)存來(lái)存儲(chǔ)樹(shù)。
CREATE TABLE users( id INT PRIMARY KEY, name VARCHAR(20) NOT NULL, email VARCHAR(50) NOT NULL, INDEX idx_name(name) ) ENGINE=InnoDB;
如果沒(méi)有指定索引類(lèi)型,那么默認(rèn)創(chuàng)建的索引類(lèi)型為 B-Tree 索引。上面的代碼定義一個(gè) users 表,創(chuàng)建了一個(gè)名為 idx_name 的 B-Tree 索引。
相比較而言,哈希索引是將索引字段值經(jīng)過(guò)哈希函數(shù)計(jì)算出 hash 值,存儲(chǔ)在數(shù)組中。它的優(yōu)點(diǎn)是查找效率高,時(shí)間復(fù)雜度為 O(1) ,但是不能支持范圍查詢(xún),而且不能進(jìn)行排序等操作。哈希索引適用于等值查詢(xún)的場(chǎng)景,例如用戶(hù)的 ID 等。
CREATE TABLE users( id INT PRIMARY KEY, name VARCHAR(20) NOT NULL, email VARCHAR(50) NOT NULL, UNIQUE KEY idx_id USING HASH(id) ) ENGINE=InnoDB;
如果要?jiǎng)?chuàng)建哈希索引,需要指定索引類(lèi)型為 USING HASH ,上面的代碼定義了一個(gè)名為 idx_id 的哈希索引。
綜上所述,MySQL 的默認(rèn)索引類(lèi)型為 B-Tree 索引,對(duì)于大部分的查詢(xún)場(chǎng)景都是適用的。但是對(duì)于某些等值查詢(xún)場(chǎng)景,哈希索引是更為高效的選擇。