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

首頁 > 數(shù)據(jù)庫 > MySQL > 正文

Mysql中的Btree與Hash索引比較

2024-07-24 13:06:52
字體:
供稿:網(wǎng)友
這篇文章主要介紹了Mysql中的Btree與Hash索引比較,本文起講解了B-Tree 索引特征、Hash 索引特征等內(nèi)容,需要的朋友可以參考下
 

mysql最常用的索引結(jié)構(gòu)是btree(O(log(n))),但是總有一些情況下我們?yōu)榱烁玫男阅芟M苁褂脛e的類型的索引。hash就是其中一種選擇,例如我們在通過用戶名檢索用戶id的時候,他們總是一對一的關(guān)系,用到的操作符只是=而已,假如使用hash作為索引數(shù)據(jù)結(jié)構(gòu)的話,時間復(fù)雜度可以降到O(1)。不幸的是,目前的mysql版本(5.6)中,hash只支持MEMORY和NDB兩種引擎,而我們最常用的INNODB和MYISAM都不支持hash類型的索引。

不管怎樣,還是要了解一下這兩種索引的區(qū)別,下面翻譯自mysql官網(wǎng)文檔中對這兩者的解釋。 

B-Tree 索引特征

B-Tree索引可以被用在像=,>,>=,<,<=和BETWEEN這些比較操作符上。而且還可以用于LIKE操作符,只要它的查詢條件是一個不以通配符開頭的常量。像下面的語句就可以使用索引:

復(fù)制代碼代碼如下:

SELECT * FROM tbl_name WHERE key_col LIKE 'Patrick%';
SELECT * FROM tbl_name WHERE key_col LIKE 'Pat%_ck%';

 

下面這兩種情況不會使用索引:

復(fù)制代碼代碼如下:

SELECT * FROM tbl_name WHERE key_col LIKE '%Patrick%';
SELECT * FROM tbl_name WHERE key_col LIKE other_col;

 

第一條是因為它以通配符開頭,第二條是因為沒有使用常量。

假如你使用... LIKE '%string%'而且string超過三個字符,MYSQL使用Turbo Boyer-Moore algorithm算法來初始化查詢表達(dá)式,然后用這個表達(dá)式來讓查詢更迅速。

一個這樣的查詢col_name IS NULL是可以使用col_name的索引的。

任何一個沒有覆蓋所有WHERE中AND級別條件的索引是不會被使用的。也就是說,要使用一個索引,這個索引中的第一列需要在每個AND組中出現(xiàn)。

下面的WHERE條件會使用索引:

復(fù)制代碼代碼如下:

... WHERE index_part1=1 AND index_part2=2 AND other_column=3
    /* index = 1 OR index = 2 */
... WHERE index=1 OR A=10 AND index=2
    /* 優(yōu)化成 "index_part1='hello'" */
... WHERE index_part1='hello' AND index_part3=5
    /* 可以使用 index1 的索引但是不會使用 index2 和 index3 */
... WHERE index1=1 AND index2=2 OR index1=3 AND index3=3;

 

下面的WHERE條件不會使用索引:

 

復(fù)制代碼代碼如下:

    /* index_part1 沒有被使用到 */
... WHERE index_part2=1 AND index_part3=2

 

    /* 索引 index 沒有出現(xiàn)在每個 where 子句中 */
... WHERE index=1 OR A=10

    /* 沒有索引覆蓋所有列 */
... WHERE index_part1=1 OR index_part2=10

 

有時候mysql不會使用索引,即使這個在可用的情況下。例如當(dāng)mysql預(yù)估使用索引會讀取大部分的行數(shù)據(jù)時。(在這種情況下,一次全表掃描可能比使用索引更快,因為它需要更少的檢索)。然而,假如語句中使用LIMIT來限定返回的行數(shù),mysql則會使用索引。因為當(dāng)結(jié)果行數(shù)較少的情況下使用索引的效率會更高。

Hash 索引特征

Hash類型的索引有一些區(qū)別于以上所述的特征:

1.它們只能用于對等比較,例如=和<=>操作符(但是快很多)。它們不能被用于像<這樣的范圍查詢條件。假如系統(tǒng)只需要使用像“鍵值對”的這樣的存儲結(jié)構(gòu),盡量使用hash類型索引。
2.優(yōu)化器不能用hash索引來為ORDER BY操作符加速。(這類索引不能被用于搜索下一個次序的值)
3.mysql不能判斷出兩個值之間有多少條數(shù)據(jù)(這需要使用范圍查詢操作符來決定使用哪個索引)。假如你將一個MyISAM表轉(zhuǎn)為一個依靠hash索引的MEMORY表,可能會影響一些語句(的性能)。
4.只有完整的鍵才能被用于搜索一行數(shù)據(jù)。(假如用B-tree索引,任何一個鍵的片段都可以用于查找。我覺得可能意味著帶通配符LIKE操作符會不起作用)。

后記

順便記錄一下在使用mysql過程中碰到的一些問題:

有時候使用腳本遷移數(shù)據(jù)時會碰到亂碼的問題,即使將表字符集設(shè)置成utf8也無濟(jì)于事,這個時候在執(zhí)行sql之前加一句set names utf8即可。

 

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 瓮安县| 泰州市| 庆城县| 定日县| 鞍山市| 石狮市| 浪卡子县| 长乐市| 肇东市| 金堂县| 五寨县| 正阳县| 北宁市| 四平市| 延庆县| 新兴县| 永丰县| 理塘县| 翁牛特旗| 璧山县| 平乐县| 竹山县| 邮箱| 紫阳县| 名山县| 即墨市| 舟山市| 东台市| 普兰县| 池州市| 翁牛特旗| 金乡县| 崇文区| 炎陵县| 建宁县| 松江区| 温泉县| 启东市| 商洛市| 安吉县| 麻江县|