1. 程式人生 > >數據庫索引(一)

數據庫索引(一)

java

索引在mysql中也叫做鍵(key),是存儲引擎用於快速找到記錄的一種數據結構。

常見索引類型:

1. B-Tree索引

大多數mysql引擎都支持這種索引;B-Tree通常意味著所有的值都是按順序存儲的,並且每一個葉子頁到根的距離相同;存儲引擎不需要進行全表掃描來獲取需要的數據,取而代之是從索引的根節點開始進行搜索;

適用於:

A. 全鍵值查找(全值匹配)

B. 鍵值範圍(若是有多列的合並索引,需要精確匹配某一列並範圍匹配另一列)

C. 鍵前綴查找

D. 按順序查找(order by

限制:

A. 如果不是按照索引的最左列開始查找,則無法使用索引

B. 不能跳過索引中的列

C. 如果查詢中有某個列的範圍查詢,其右邊的所有列都無法使用索引優化查詢

2. 哈希索引

mysql中,只有memory引擎顯式支持哈希索引;基於哈希表實現,只有精確匹配索引所有列的查詢才有效;對於每一行數據,存儲引擎會對所有的索引列計算一個哈希碼,不同的鍵值行計算出的哈希碼不一樣,哈希索引將所有的哈希碼存儲在索引中,同時在哈希表中保存指向每個數據行的指針;(hash索引結構:hash值:指針)

優勢:

查找速度非常快

限制:

A. 無法用於排序

B. 不支持部分索引列匹配查找

C. 只支持等值比較查詢

存儲引擎不支持哈希索引時,可以建立自定義哈希:

如:建表pseudohashidurlurl_crc;

建立觸發器:insert數據時 set new.url_crc = crc32(new.url);

Update數據時 set new.url_crc = crc32(new.url);

查找:select url , url_crc from pseudohash where url_crc = crc32(www.baidu.com) and url = www.baidu.com;

where語句中帶人hash值和對應列值。

索引的優點:

1. 大大減少了服務器需要掃描的數據量

2. 幫助服務器避免排序和臨時表

3. 將隨機I/O變為順序I/O

索引優化

1. 前綴索引

問題:有時候索引需要存儲很長的字符串,會讓索引變得大且慢

解決:1. hash索引 2. 前綴索引

索引的選擇性:不重復的索引值 / 數據表的記錄總數,數值越高性能越好;

唯一索引的選擇性是1,性能是最好的

計算適合的前綴長度,使前綴的選擇性接近於完整列的選擇性。Mysql無法使用前綴索引做order bygroup by,也無法使用前綴索引做覆蓋掃描;

2. 選擇合適的索引列順序

將選擇性最高的列放在索引最前列


數據庫索引(一)