欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Mysql中的Btree與Hash索引比較

 更新時(shí)間:2015年03月20日 09:22:30   投稿:junjie  
這篇文章主要介紹了Mysql中的Btree與Hash索引比較,本文起講解了B-Tree 索引特征、Hash 索引特征等內(nèi)容,需要的朋友可以參考下

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

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

B-Tree 索引特征

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

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

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

下面這兩種情況不會(huì)使用索引:

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

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

第一條是因?yàn)樗酝ㄅ浞_(kāi)頭,第二條是因?yàn)闆](méi)有使用常量。

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

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

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

下面的WHERE條件會(huì)使用索引:

復(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 的索引但是不會(huì)使用 index2 和 index3 */
... WHERE index1=1 AND index2=2 OR index1=3 AND index3=3;

下面的WHERE條件不會(huì)使用索引:

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

    /* index_part1 沒(méi)有被使用到 */
... WHERE index_part2=1 AND index_part3=2

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

    /* 沒(méi)有索引覆蓋所有列 */
... WHERE index_part1=1 OR index_part2=10

有時(shí)候mysql不會(huì)使用索引,即使這個(gè)在可用的情況下。例如當(dāng)mysql預(yù)估使用索引會(huì)讀取大部分的行數(shù)據(jù)時(shí)。(在這種情況下,一次全表掃描可能比使用索引更快,因?yàn)樗枰俚臋z索)。然而,假如語(yǔ)句中使用LIMIT來(lái)限定返回的行數(shù),mysql則會(huì)使用索引。因?yàn)楫?dāng)結(jié)果行數(shù)較少的情況下使用索引的效率會(huì)更高。

Hash 索引特征

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

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

后記

順便記錄一下在使用mysql過(guò)程中碰到的一些問(wèn)題:

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

相關(guān)文章

  • mysql分區(qū)功能詳解,以及實(shí)例分析

    mysql分區(qū)功能詳解,以及實(shí)例分析

    下面小編就為大家?guī)?lái)一篇mysql分區(qū)功能詳解,以及實(shí)例分析。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-03-03
  • mysql實(shí)現(xiàn)if語(yǔ)句判斷功能的6種使用形式小結(jié)

    mysql實(shí)現(xiàn)if語(yǔ)句判斷功能的6種使用形式小結(jié)

    這篇文章主要給大家介紹了關(guān)于mysql實(shí)現(xiàn)if語(yǔ)句判斷功能的6種使用形式,MySQL的IF既可以作為表達(dá)式用,也可在存儲(chǔ)過(guò)程中作為流程控制語(yǔ)句使用,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • mysql 觸發(fā)器創(chuàng)建與使用方法示例

    mysql 觸發(fā)器創(chuàng)建與使用方法示例

    這篇文章主要介紹了mysql 觸發(fā)器創(chuàng)建與使用方法,結(jié)合實(shí)例形式分析了mysql 觸發(fā)器基本概念、原理、創(chuàng)建、使用方法及操作注意事項(xiàng),需要的朋友可以參考下
    2020-05-05
  • MySQL筆記之修改數(shù)據(jù)的解決方法

    MySQL筆記之修改數(shù)據(jù)的解決方法

    本篇文章介紹了,在mysql中修改數(shù)據(jù)的解決方法。需要的朋友參考下
    2013-05-05
  • mysql innodb的重要組件匯總

    mysql innodb的重要組件匯總

    這篇文章主要介紹了mysql innodb的重要組件的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)MySQL,感興趣的朋友可以了解下
    2020-12-12
  • mysql實(shí)現(xiàn)表內(nèi)增加一個(gè)字段并賦值

    mysql實(shí)現(xiàn)表內(nèi)增加一個(gè)字段并賦值

    這篇文章主要介紹了mysql實(shí)現(xiàn)表內(nèi)增加一個(gè)字段并賦值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • mysql死鎖和分庫(kù)分表問(wèn)題詳解

    mysql死鎖和分庫(kù)分表問(wèn)題詳解

    這篇文章主要給大家介紹了關(guān)于mysql死鎖和分庫(kù)分表問(wèn)題的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • mysql修改自增主鍵數(shù)值無(wú)效的問(wèn)題及解決

    mysql修改自增主鍵數(shù)值無(wú)效的問(wèn)題及解決

    這篇文章主要介紹了mysql修改自增主鍵數(shù)值無(wú)效的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • MySQL新手入門(mén)指南--快速參考

    MySQL新手入門(mén)指南--快速參考

    MySQL新手入門(mén)指南--快速參考...
    2006-11-11
  • MySQL數(shù)據(jù)庫(kù)主從復(fù)制原理及作用分析

    MySQL數(shù)據(jù)庫(kù)主從復(fù)制原理及作用分析

    這篇文章主要介紹了MySQL數(shù)據(jù)庫(kù)主從復(fù)制原理并分析了主從復(fù)制的作用和使用方法,有需要的的朋友可以借鑒參考下,希望可以有所幫助,感謝閱讀
    2021-09-09

最新評(píng)論