程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> Mysql中的Btree與Hash索引比擬

Mysql中的Btree與Hash索引比擬

編輯:MySQL綜合教程

Mysql中的Btree與Hash索引比擬。本站提示廣大學習愛好者:(Mysql中的Btree與Hash索引比擬)文章只能為提供參考,不一定能成為您想要的結果。以下是Mysql中的Btree與Hash索引比擬正文


mysql最經常使用的索引構造是btree(O(log(n))),然則總有一些情形下我們為了更好的機能願望能應用其余類型的索引。hash就是個中一種選擇,例如我們在經由過程用戶名檢索用戶id的時刻,他們老是一對一的關系,用到的操作符只是=罷了,假設應用hash作為索引數據構造的話,時光龐雜度可以降到O(1)。不幸的是,今朝的mysql版本(5.6)中,hash只支撐MEMORY和NDB兩種引擎,而我們最經常使用的INNODB和MYISAM都不支撐hash類型的索引。

不論如何,照樣要懂得一下這兩種索引的差別,上面翻譯自mysql官網文檔中對這二者的說明。 

B-Tree 索引特點

B-Tree索引可以被用在像=,>,>=,<,<=和BETWEEN這些比擬操作符上。並且還可以用於LIKE操作符,只需它的查詢前提是一個不以通配符開首的常量。像上面的語句便可以應用索引:

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

上面這兩種情形不會應用索引:

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算法來初始化查詢表達式,然後用這個表達式來讓查詢更敏捷。

一個如許的查詢col_name IS NULL是可使用col_name的索引的。

任何一個沒有籠罩一切WHERE中AND級別前提的索引是不會被應用的。也就是說,要應用一個索引,這個索引中的第一列須要在每一個AND組中湧現。

上面的WHERE前提會應用索引:

... 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
    /* 優化成 "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前提不會應用索引:


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

    /* 索引 index 沒有湧現在每一個 where 子句中 */
... WHERE index=1 OR A=10

    /* 沒有索引籠罩一切列 */
... WHERE index_part1=1 OR index_part2=10

有時刻mysql不會應用索引,即便這個在可用的情形下。例如當mysql預估應用索引會讀取年夜部門的行數據時。(在這類情形下,一次全表掃描能夠比應用索引更快,由於它須要更少的檢索)。但是,假設語句中應用LIMIT來限制前往的行數,mysql則會應用索引。由於當成果行數較少的情形下應用索引的效力會更高。

Hash 索引特點

Hash類型的索引有一些差別於以上所述的特點:

1.它們只能用於對等比擬,例如=和<=>操作符(然則快許多)。它們不克不及被用於像<如許的規模查詢前提。假設體系只須要應用像“鍵值對”的如許的存儲構造,盡可能應用hash類型索引。
2.優化器不克不及用hash索引來為ORDER BY操作符加快。(這類索引不克不及被用於搜刮下一個順序的值)
3.mysql不克不及斷定出兩個值之間有若干條數據(這須要應用規模查詢操作符來決議應用哪一個索引)。假設你將一個MyISAM表轉為一個依附hash索引的MEMORY表,能夠會影響一些語句(的機能)。
4.只要完全的鍵能力被用於搜刮一行數據。(假設用B-tree索引,任何一個鍵的片斷都可以用於查找。我認為能夠意味著帶通配符LIKE操作符會不起感化)。

跋文

趁便記載一下在應用mysql進程中碰著的一些成績:

有時刻應用劇本遷徙數據時會碰著亂碼的成績,即便將表字符集設置成utf8也杯水車薪,這個時刻在履行sql之前加一句set names utf8便可。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved