<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      一文讓你對mysql索引底層實現明明白白

      開篇:

      圖片是本人隨筆畫的,有點粗糙,望大家諒解,如有不妥之處,請聯系我們,感謝

      一、索引到底是什么

      .索引是幫助mysql高效獲取數據的排好序的數據結構

      .索引是存儲在文件里的

      .數據結構: 二叉樹 HASH BTREE

       

       

       

      如果沒有索引的話,循環一條一條的找,找一次就是一次IO,這樣速度就會很慢

      我們知道數據庫數據都是存在磁盤上的,當我們查找數據時,就會從磁盤上取數據,每取一次就是一次IO,IO是非常耗時的,為了速度快會把數據放到緩存里,然后在緩存里進行操作

       

      二、磁盤存取原理

       

       

       

      當查找數據的時候,就是磁頭循環找此道,就會一直循環查找,一次查找就是一次IO,IO是很耗時的

      三、Mysql數據結構詳解

      就拿上面的7條數據來說,如果沒有索引,當我們查找第7條數據時,就會循環7次,如果有百萬級別的數據,那么就會查找百萬次,顯然這樣是不行的,就需要數據結構算法來優化,那我們就從二叉樹----HASH---BTREE來一一說起

      二叉樹:

      二叉樹節點保存的都是單個索引,高度會隨著數據增大而增高,但是比一條一條的循環會快

       

       

       

       

       

       

      不用二叉樹是因為的極端情況下會出現單邊增長,這樣在數量大的情況下,和一條一條查找沒有區別。

      紅黑樹:

      紅黑樹有自平衡性質,不會出現單邊增長,它會動態自旋轉,在性能上比二叉樹又高一點,但是mysql也沒有用這種數據結構,因為數據量超大的情況下,數據高度也會一直增大,在最終這個樹高度也非常大,解決不了根本問題

       

       

       

      HASH:

      hash算法一次就會定位到文件指針,速度快,但是還是沒有用,如果范圍查找的話就沒有辦法了,如果只是內存中的話,他的時間復雜度是O(1),速度會會很快,但是索引文件也是保存在磁盤上,而且hash是不連續的放在磁盤上的,這樣查詢起來也很慢,這才是不用hash的最根本原因

       

       

       

      B-TREE:

      相比上面的數據結構,b-tree增加了橫向大?。ǘ菵egree),那么在高度上就減小了,查找次數就少了

       

       

       

      15,56,77.。。。。是索引,data就是對應的一行數據

      那么在橫向的度上最大多少合適呢??總不能橫向上一直擴展下呀,磁盤一次IO,就是取一個橫向的節點(度),把一個節點的數據放在緩存中,那么一次IO也不能把所用的數據全取出來,所以最好是一次io,就把這個節點全取處理,電腦操作系統從磁盤一次取數據到內存中一般是4K,而mysql取一次數據一般是16K,所以橫向節點一般設置為16K。因為一個節點設置成16K的話,這個節點保存了索引和索引對應行的數據,那么這個節點橫向保存不了太多的數據,所以,這種數據結構也不合適,引入新的數據結構

       

       

       

      B+Tree

      查找一次數據就是和磁盤一次IO,一次IO會把這個數據相鄰的數據一下全部查處理,這樣速度會更快,這樣的一頁就是咱們說的一個節點(4K),分配空間的時候也是一頁一頁分配的,這樣會更快,一頁就是一個節點

       

       

       

       

      mysql 常用的引擎有MyISAM和InNoDb,兩種引擎得索引結構是不一樣的

      MyISAM的數據結構:

      .frm表結構文件 .myd表數據文件 .myi表索引文件

       

       

       

       

       

       

      myisam引擎的主鍵索引數據結構是左上圖,普通索引是右上圖,葉子節點存的不是數據本身,是數據文件指針,和b_tree數據不一樣,注意:每類的索引,都是各自的樹,不是混合在一起的

       

      .frm表結構文件 .ibd 表數據和索引文件

       

       

       

       

       

       

      主鍵索引是聚集索引,因為葉子節點是所有的數據,就是一行數據,非主鍵索引葉子節點只包括索引和主鍵,再用主鍵找對應數據

      非主鍵索引葉子節點只包括索引和主鍵,再用主鍵找對應數據,這樣是為了節省空間和數據一致性

       

      聯合索引:

      要滿足最左原則

      聯合索引(col1, col2, col3)也是一棵B+樹,其非葉子節點存儲的是第一個關鍵字的索引,而葉子節點存儲的則是三個關鍵字col1、col2、col3三個關鍵字的數據,且按照col1-col2-col3的順序進行排序。

       

       

       

       

       

      例如:

      如果執行的是,SELECT * FROM T WHERE B=‘Tom’ AND C=4567;

      那么無法使用索引,因為索引是用A字段先排序的,如果沒有先確定A,直接查找B和C,那么將會是全表查詢。

       

      如果執行的是,SELECT * FROM T WHERE A=‘30’ ;

      那么,會先找到A字段,再在A等于30的數據中(比如有很多條),找B等于Demi的數據。這樣是可以用到索引的。

       

      如果執行的是,SELECT * FROM T WHERE A=‘18’ AND C=1234;

      那么,A字段可以索引,而C不能索引。所以可以部分索引,也比全表查詢快。

       

      如果執行 SELECT * FROM T WHERE B=Demi AND C=1234 and A=‘18’

      是用到索引的,在and的情況下如果把第一個放到最后位置也是能用到索引的

       

      現在我想大家應該了解了什么為什么是最左原則。因為,B+樹是按照最左邊的字段以此構建的。

      作者:京東零售 韓航云

      來源:京東云開發者社區 轉載請注明來源

      posted @ 2024-01-16 11:22  京東云技術團隊  閱讀(180)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 漳浦县| 国模无吗一区二区二区视频| 偷窥少妇久久久久久久久| 亚洲成亚洲成网中文字幕| 性少妇tubevⅰdeos高清| 喀喇| 国产精品国产精品国产精品| 亚洲精品三区二区一区一| 国产特级毛片aaaaaa毛片| 99久久激情国产精品| 亚洲精品日韩久久精品| 日本中文一二区有码在线| 色综合久久久久综合体桃花网| 国产精品久久久久7777| 久久精品一本到东京热| 67194熟妇在线观看线路| 欧洲码亚洲码的区别入口| 在线涩涩免费观看国产精品| 元码人妻精品一区二区三区9 | 黄色A级国产免费大片视频| 影音先锋人妻啪啪av资源网站| 伊人精品成人久久综合97| 色综合国产一区二区三区| 2019国产精品青青草原| 激情综合色五月六月婷婷| 亚洲免费视频一区二区三区| 美女午夜福利视频一区二区| 制服丝袜国产精品| 中文字幕人妻中出制服诱惑 | 国产伦精品一区二区亚洲| 午夜成人精品福利网站在线观看 | 国产久9视频这里只有精品| 成人午夜福利视频后入| 亚洲男人电影天堂无码| 四虎成人高清永久免费看| 久女女热精品视频在线观看 | 亚洲欧美综合中文| 日韩精品卡1卡2日韩在线| 精品国产美女福到在线不卡| 国产精品视频一区不卡| 伊人精品成人久久综合97|