最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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è)谕ㄟ^用戶名檢索用戶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è)不以通配符開頭的常量。像下面的語句就可以使用索引:

復(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)樗酝ㄅ浞_頭,第二條是因?yàn)闆]有使用常量。

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

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

任何一個(gè)沒有覆蓋所有WHERE中AND級(jí)別條件的索引是不會(huì)被使用的。也就是說,要使用一個(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 沒有被使用到 */
... WHERE index_part2=1 AND index_part3=2

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

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

有時(shí)候mysql不會(huì)使用索引,即使這個(gè)在可用的情況下。例如當(dāng)mysql預(yù)估使用索引會(huì)讀取大部分的行數(shù)據(jù)時(shí)。(在這種情況下,一次全表掃描可能比使用索引更快,因?yàn)樗枰俚臋z索)。然而,假如語句中使用LIMIT來限定返回的行數(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索引來為ORDER BY操作符加速。(這類索引不能被用于搜索下一個(gè)次序的值)
3.mysql不能判斷出兩個(gè)值之間有多少條數(shù)據(jù)(這需要使用范圍查詢操作符來決定使用哪個(gè)索引)。假如你將一個(gè)MyISAM表轉(zhuǎn)為一個(gè)依靠hash索引的MEMORY表,可能會(huì)影響一些語句(的性能)。
4.只有完整的鍵才能被用于搜索一行數(shù)據(jù)。(假如用B-tree索引,任何一個(gè)鍵的片段都可以用于查找。我覺得可能意味著帶通配符LIKE操作符會(huì)不起作用)。

后記

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

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

相關(guān)文章

  • 淺談MyISAM 和 InnoDB 的區(qū)別與優(yōu)化

    淺談MyISAM 和 InnoDB 的區(qū)別與優(yōu)化

    InnoDB和MyISAM是在使用MySQL最常用的兩個(gè)表類型,各有優(yōu)缺點(diǎn),視具體應(yīng)用而定。下面我們就來具體探討下吧
    2015-07-07
  • RedHat6.5安裝MySQL5.7教程詳解

    RedHat6.5安裝MySQL5.7教程詳解

    這篇文章主要為大家詳細(xì)介紹了RedHat6.5下MySQL5.7的安裝教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • 一步步帶你學(xué)習(xí)設(shè)計(jì)MySQL索引數(shù)據(jù)結(jié)構(gòu)

    一步步帶你學(xué)習(xí)設(shè)計(jì)MySQL索引數(shù)據(jù)結(jié)構(gòu)

    索引是存儲(chǔ)索引用于快速找到數(shù)據(jù)記錄的一種數(shù)據(jù)結(jié)構(gòu),就好比一本書的目錄部分,通過目錄中對(duì)應(yīng)的文章的頁碼,便可以快速定位到需要的文章,下面這篇文章主要給大家介紹了關(guān)于MySQL索引數(shù)據(jù)結(jié)構(gòu)的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • Mysql中的排序規(guī)則utf8_unicode_ci、utf8_general_ci的區(qū)別總結(jié)

    Mysql中的排序規(guī)則utf8_unicode_ci、utf8_general_ci的區(qū)別總結(jié)

    Mysql中utf8_general_ci與utf8_unicode_ci有什么區(qū)別呢?在編程語言中,通常用unicode對(duì)中文字符做處理,防止出現(xiàn)亂碼,那么在MySQL里,為什么大家都使用utf8_general_ci而不是utf8_unicode_ci呢?
    2014-04-04
  • Mysql中mvcc各場景理解應(yīng)用

    Mysql中mvcc各場景理解應(yīng)用

    這篇文章主要為大家介紹了Mysql中mvcc各場景理解應(yīng)用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • mysql中l(wèi)ower_case_table_names=1參數(shù)的作用

    mysql中l(wèi)ower_case_table_names=1參數(shù)的作用

    lower_case_table_names是MySQL數(shù)據(jù)庫中的一個(gè)系統(tǒng)變量,本文主要介紹了mysql中l(wèi)ower_case_table_names=1參數(shù)的作用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-08-08
  • 關(guān)于MySQL日期類型的選擇建議

    關(guān)于MySQL日期類型的選擇建議

    在軟件開發(fā)中,時(shí)間記錄是不可或缺的功能,如記錄操作時(shí)間、交易時(shí)間等,通常不建議使用字符串存儲(chǔ)日期,因?yàn)樗加每臻g大,并且效率低下,MySQL提供的Datetime和Timestamp是常用的時(shí)間存儲(chǔ)類型,Datetime沒有時(shí)區(qū)信息,而Timestamp與時(shí)區(qū)有關(guān)
    2024-10-10
  • Mysql排序獲取排名的實(shí)例代碼

    Mysql排序獲取排名的實(shí)例代碼

    這篇文章通過實(shí)例代碼給大家介紹了mysql排序獲取排名的相關(guān)知識(shí),感興趣的朋友一起看看吧
    2018-05-05
  • MySQL 5.6主從報(bào)錯(cuò)的實(shí)戰(zhàn)記錄

    MySQL 5.6主從報(bào)錯(cuò)的實(shí)戰(zhàn)記錄

    這篇文章主要給大家介紹了關(guān)于MySQL 5.6主從報(bào)錯(cuò)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • MySQL中SHOW DATABASES語句查看或顯示數(shù)據(jù)庫

    MySQL中SHOW DATABASES語句查看或顯示數(shù)據(jù)庫

    在MySQL中,可使用SHOW DATABASES語句來查看或顯示當(dāng)前用戶權(quán)限范圍以內(nèi)的數(shù)據(jù)庫,下面就來介紹一下如何使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02

最新評(píng)論

波密县| 铁岭县| 台北市| 南平市| 胶南市| 湄潭县| 抚顺市| 蒲江县| 石阡县| 山丹县| 苏尼特左旗| 韶山市| 平罗县| 佛学| 常熟市| 太和县| 开封市| 石台县| 崇明县| 三江| 隆化县| 堆龙德庆县| 陈巴尔虎旗| 黑河市| 岢岚县| 万源市| 上高县| 宁城县| 墨竹工卡县| 瓦房店市| 灵台县| 集贤县| 乌苏市| 衡阳市| 同心县| 诏安县| 呼图壁县| 玉环县| 楚雄市| 霍邱县| 岑溪市|