色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

為什么說B+比B樹更適合實際應用中操作系統的文件索引和數據庫索引?

電子工程師 ? 來源:lp ? 2019-04-04 14:25 ? 次閱讀

一、為什么用自增列作為主鍵

1、如果我們定義了主鍵(PRIMARY KEY),那么InnoDB會選擇主鍵作為聚集索引、如果沒有顯式定義主鍵,則InnoDB會選擇第一個不包含有NULL值的唯一索引作為主鍵索引、如果也沒有這樣的唯一索引,則InnoDB會選擇內置6字節長的ROWID作為隱含的聚集索引(ROWID隨著行記錄的寫入而主鍵遞增,這個ROWID不像ORACLE的ROWID那樣可引用,是隱含的)。

2、數據記錄本身被存于主索引(一顆B+Tree)的葉子節點上。這就要求同一個葉子節點內(大小為一個內存頁或磁盤頁)的各條數據記錄按主鍵順序存放,因此每當有一條新的記錄插入時,MySQL會根據其主鍵將其插入適當的節點和位置,如果頁面達到裝載因子(InnoDB默認為15/16),則開辟一個新的頁(節點)

3、如果表使用自增主鍵,那么每次插入新的記錄,記錄就會順序添加到當前索引節點的后續位置,當一頁寫滿,就會自動開辟一個新的頁

4、如果使用非自增主鍵(如果身份證號或學號等),由于每次插入主鍵的值近似于隨機,因此每次新紀錄都要被插到現有索引頁得中間某個位置,此時MySQL不得不為了將新記錄插到合適位置而移動數據,甚至目標頁面可能已經被回寫到磁盤上而從緩存中清掉,此時又要從磁盤上讀回來,這增加了很多開銷,同時頻繁的移動、分頁操作造成了大量的碎片,得到了不夠緊湊的索引結構,后續不得不通過OPTIMIZE TABLE來重建表并優化填充頁面。

二、為什么使用數據索引能提高效率

1、數據索引的存儲是有序的

2、在有序的情況下,通過索引查詢一個數據是無需遍歷索引記錄的

3、極端情況下,數據索引的查詢效率為二分法查詢效率,趨近于 log2(N)

三、B+樹索引和哈希索引的區別

B+樹是一個平衡的多叉樹,從根節點到每個葉子節點的高度差值不超過1,而且同層級的節點間有指針相互鏈接,是有序的

哈希索引就是采用一定的哈希算法,把鍵值換算成新的哈希值,檢索時不需要類似B+樹那樣從根節點到葉子節點逐級查找,只需一次哈希算法即可,是無序的

四、哈希索引的優勢

1、等值查詢。哈希索引具有絕對優勢(前提是:沒有大量重復鍵值,如果大量重復鍵值時,哈希索引的效率很低,因為存在所謂的哈希碰撞問題。)

五、哈希索引不適用的場景

1、不支持范圍查詢

2、不支持索引完成排序

3、不支持聯合索引的最左前綴匹配規則

通常,B+樹索引結構適用于絕大多數場景,像下面這種場景用哈希索引才更有優勢:

在HEAP表中,如果存儲的數據重復度很低(也就是說基數很大),對該列數據以等值查詢為主,沒有范圍查詢、沒有排序的時候,特別適合采用哈希索引,例如這種SQL:

selectid,namefromtablewherename='李明'; — 僅等值查詢

而常用的InnoDB引擎中默認使用的是B+樹索引,它會實時監控表上索引的使用情況,如果認為建立哈希索引可以提高查詢效率,則自動在內存中的“自適應哈希索引緩沖區”建立哈希索引(在InnoDB中默認開啟自適應哈希索引),通過觀察搜索模式,MySQL會利用index key的前綴建立哈希索引,如果一個表幾乎大部分都在緩沖池中,那么建立一個哈希索引能夠加快等值查詢。

注意:在某些工作負載下,通過哈希索引查找帶來的性能提升遠大于額外的監控索引搜索情況和保持這個哈希表結構所帶來的開銷。但某些時候,在負載高的情況下,自適應哈希索引中添加的read/write鎖也會帶來競爭,比如高并發的join操作。like操作和%的通配符操作也不適用于自適應哈希索引,可能要關閉自適應哈希索引。

六、B樹和B+樹的區別

1、B樹,每個節點都存儲key和data,所有節點組成這棵樹,并且葉子節點指針為nul,葉子結點不包含任何關鍵字信息

2、B+樹,所有的葉子結點中包含了全部關鍵字的信息,及指向含有這些關鍵字記錄的指針,且葉子結點本身依關鍵字的大小自小而大的順序鏈接,所有的非終端結點可以看成是索引部分,結點中僅含有其子樹根結點中最大(或最小)關鍵字。 (而B 樹的非終節點也包含需要查找的有效信息)

七、為什么說B+比B樹更適合實際應用中操作系統的文件索引和數據庫索引?

1、B+的磁盤讀寫代價更低B+的內部結點并沒有指向關鍵字具體信息的指針。因此其內部結點相對B樹更小。如果把所有同一內部結點的關鍵字存放在同一盤塊中,那么盤塊所能容納的關鍵字數量也越多。一次性讀入內存中的需要查找的關鍵字也就越多。相對來說IO讀寫次數也就降低了。

2、B+-tree的查詢效率更加穩定由于非終結點并不是最終指向文件內容的結點,而只是葉子結點中關鍵字的索引。所以任何關鍵字的查找必須走一條從根結點到葉子結點的路。所有關鍵字查詢的路徑長度相同,導致每一個數據的查詢效率相當。

八、MySQL聯合索引

1、聯合索引是兩個或更多個列上的索引。對于聯合索引:Mysql從左到右的使用索引中的字段,一個查詢可以只使用索引中的一部份,但只能是最左側部分。例如索引是key index (a,b,c). 可以支持a 、 a,b 、 a,b,c 3種組合進行查找,但不支持 b,c進行查找 .當最左側字段是常量引用時,索引就十分有效。

2、利用索引中的附加列,您可以縮小搜索的范圍,但使用一個具有兩列的索引 不同于使用兩個單獨的索引。復合索引的結構與電話簿類似,人名由姓和名構成,電話簿首先按姓氏對進行排序,然后按名字對有相同姓氏的人進行排序。如果您知 道姓,電話簿將非常有用;如果您知道姓和名,電話簿則更為有用,但如果您只知道名不姓,電話簿將沒有用處。

九、什么情況下應不建或少建索引

1、表記錄太少

2、經常插入、刪除、修改的表

3、數據重復且分布平均的表字段,假如一個表有10萬行記錄,有一個字段A只有T和F兩種值,且每個值的分布概率大約為50%,那么對這種表A字段建索引一般不會提高數據庫的查詢速度。

4、經常和主字段一塊查詢但主字段索引值比較多的表字段

十、什么是表分區?

表分區,是指根據一定規則,將數據庫中的一張表分解成多個更小的,容易管理的部分。從邏輯上看,只有一張表,但是底層卻是由多個物理分區組成。

十一、表分區與分表的區別

分表:指的是通過一定規則,將一張表分解成多張不同的表。比如將用戶訂單記錄根據時間成多個表。

分表與分區的區別在于:分區從邏輯上來講只有一張表,而分表則是將一張表分解成多張表。

十二、表分區有什么好處?

1、分區表的數據可以分布在不同的物理設備上,從而高效地利用多個硬件設備。 2. 和單個磁盤或者文件系統相比,可以存儲更多數據

2、優化查詢。在where語句中包含分區條件時,可以只掃描一個或多個分區表來提高查詢效率;涉及sum和count語句時,也可以在多個分區上并行處理,最后匯總結果。

3、分區表更容易維護。例如:想批量刪除大量數據可以清除整個分區。

4、可以使用分區表來避免某些特殊的瓶頸,例如InnoDB的單個索引的互斥訪問,ext3問價你系統的inode鎖競爭等。

十三、分區表的限制因素

1、一個表最多只能有1024個分區

2、MySQL5.1中,分區表達式必須是整數,或者返回整數的表達式。在MySQL5.5中提供了非整數表達式分區的支持。

3、如果分區字段中有主鍵或者唯一索引的列,那么多有主鍵列和唯一索引列都必須包含進來。即:分區字段要么不包含主鍵或者索引列,要么包含全部主鍵和索引列。

4、分區表中無法使用外鍵約束

5、MySQL的分區適用于一個表的所有數據和索引,不能只對表數據分區而不對索引分區,也不能只對索引分區而不對表分區,也不能只對表的一部分數據分區。

十四、如何判斷當前MySQL是否支持分區?

命令:show variables like '%partition%' 運行結果:

mysql> show variables like'%partition%';+-------------------+-------+| Variable_name |Value|+-------------------+-------+|have_partitioning| YES |+-------------------+-------+1rowinset (0.00sec)

have_partintioning 的值為YES,表示支持分區。

十五、MySQL支持的分區類型有哪些?

1、RANGE分區:這種模式允許將數據劃分不同范圍。例如可以將一個表通過年份劃分成若干個分區

2、LIST分區:這種模式允許系統通過預定義的列表的值來對數據進行分割。按照List中的值分區,與RANGE的區別是,range分區的區間范圍值是連續的。

3、HASH分區 :這中模式允許通過對表的一個或多個列的Hash Key進行計算,最后通過這個Hash碼不同數值對應的數據區域進行分區。例如可以建立一個對表主鍵進行分區的表。

4、KEY分區 :上面Hash模式的一種延伸,這里的Hash Key是MySQL系統產生的。

十六、四種隔離級別

1、Serializable (串行化):可避免臟讀、不可重復讀、幻讀的發生。

2、Repeatable read (可重復讀):可避免臟讀、不可重復讀的發生。

3、Read committed (讀已提交):可避免臟讀的發生。

4、Read uncommitted (讀未提交):最低級別,任何情況都無法保證。。

十七、關于MVVC

MySQL InnoDB存儲引擎,實現的是基于多版本的并發控制協議——MVCC (Multi-Version Concurrency Control) (注:與MVCC相對的,是基于鎖的并發控制,Lock-Based Concurrency Control)。MVCC最大的好處:讀不加鎖,讀寫不沖突。在讀多寫少的OLTP應用中,讀寫不沖突是非常重要的,極大的增加了系統的并發性能,現階段幾乎所有的RDBMS,都支持了MVCC。

1、LBCC:Lock-Based Concurrency Control,基于鎖的并發控制。

2、MVCC:Multi-Version Concurrency Control,基于多版本的并發控制協議。純粹基于鎖的并發機制并發量低,MVCC是在基于鎖的并發控制上的改進,主要是在讀操作上提高了并發量。

十八、在MVCC并發控制中,讀操作可以分成兩類

1、快照讀 (snapshot read):讀取的是記錄的可見版本 (有可能是歷史版本),不用加鎖(共享讀鎖s鎖也不加,所以不會阻塞其他事務的寫)。

2、當前讀 (current read):讀取的是記錄的最新版本,并且,當前讀返回的記錄,都會加上鎖,保證其他事務不會再并發修改這條記錄。

十九、行級鎖定的優點

1、當在許多線程中訪問不同的行時只存在少量鎖定沖突。

2、回滾時只有少量的更改

3、可以長時間鎖定單一的行。

二十、行級鎖定的缺點

1、比頁級或表級鎖定占用更多的內存。

2、當在表的大部分中使用時,比頁級或表級鎖定速度慢,因為你必須獲取更多的鎖。

3、如果你在大部分數據上經常進行GROUP BY操作或者必須經常掃描整個表,比其它鎖定明顯慢很多。

4、用高級別鎖定,通過支持不同的類型鎖定,你也可以很容易地調節應用程序,因為其鎖成本小于行級鎖定。

二十一、MySQL優化

1、開啟查詢緩存,優化查詢

2、explain你的select查詢,這可以幫你分析你的查詢語句或是表結構的性能瓶頸。EXPLAIN 的查詢結果還會告訴你你的索引主鍵被如何利用的,你的數據表是如何被搜索和排序的

3、當只要一行數據時使用limit 1,MySQL數據庫引擎會在找到一條數據后停止搜索,而不是繼續往后查少下一條符合記錄的數據

4、為搜索字段建索引

5、使用 ENUM 而不是 VARCHAR,如果你有一個字段,比如“性別”,“國家”,“民族”,“狀態”或“部門”,你知道這些字段的取值是有限而且固定的,那么,你應該使用 ENUM 而不是VARCHAR。

6、Prepared StatementsPreparedStatements很像存儲過程,是一種運行在后臺的SQL語句集合,我們可以從使用 prepared statements 獲得很多好處,無論是性能問題還是安全問題。Prepared Statements 可以檢查一些你綁定好的變量,這樣可以保護你的程序不會受到“SQL注入式”攻擊

7、垂直分表

8、選擇正確的存儲引擎

二十二、key和index的區別

1、key 是數據庫的物理結構,它包含兩層意義和作用,一是約束(偏重于約束和規范數據庫的結構完整性),二是索引(輔助查詢用的)。包括primary key, unique key, foreign key 等

2、index是數據庫的物理結構,它只是輔助查詢的,它創建時會在另外的表空間(mysql中的innodb表空間)以一個類似目錄的結構存儲。索引要分類的話,分為前綴索引、全文本索引等;

二十三、Mysql 中 MyISAM 和 InnoDB 的區別有哪些?

區別:

1、InnoDB支持事務,MyISAM不支持,對于InnoDB每一條SQL語言都默認封裝成事務,自動提交,這樣會影響速度,所以最好把多條SQL語言放在begin和commit之間,組成一個事務;

2、InnoDB支持外鍵,而MyISAM不支持。對一個包含外鍵的InnoDB表轉為MYISAM會失敗;

3、InnoDB是聚集索引,數據文件是和索引綁在一起的,必須要有主鍵,通過主鍵索引效率很高。但是輔助索引需要兩次查詢,先查詢到主鍵,然后再通過主鍵查詢到數據。因此,主鍵不應該過大,因為主鍵太大,其他索引也都會很大。而MyISAM是非聚集索引,數據文件是分離的,索引保存的是數據文件的指針。主鍵索引和輔助索引是獨立的。

4、InnoDB不保存表的具體行數,執行select count(*) from table時需要全表掃描。而MyISAM用一個變量保存了整個表的行數,執行上述語句時只需要讀出該變量即可,速度很快;

5、Innodb不支持全文索引,而MyISAM支持全文索引,查詢效率上MyISAM要高;

如何選擇:

1、是否要支持事務,如果要請選擇innodb,如果不需要可以考慮MyISAM;

2、如果表中絕大多數都只是讀查詢,可以考慮MyISAM,如果既有讀寫也挺頻繁,請使用InnoDB。

3、系統奔潰后,MyISAM恢復起來更困難,能否接受;

4、MySQL5.5版本開始Innodb已經成為Mysql的默認引擎(之前是MyISAM),說明其優勢是有目共睹的,如果你不知道用什么,那就用InnoDB,至少不會差。

二十四、數據庫表創建注意事項

1、字段名及字段配制合理性

剔除關系不密切的字段;

字段命名要有規則及相對應的含義(不要一部分英文,一部分拼音,還有類似a.b.c這樣不明含義的字段);

字段命名盡量不要使用縮寫(大多數縮寫都不能明確字段含義);

字段不要大小寫混用(想要具有可讀性,多個英文單詞可使用下劃線形式連接);

字段名不要使用保留字或者關鍵字;

保持字段名和類型的一致性;

慎重選擇數字類型;

給文本字段留足余量;

2、系統特殊字段處理及建成后建議

添加刪除標記(例如操作人、刪除時間);

建立版本機制;

3、表結構合理性配置

多型字段的處理,就是表中是否存在字段能夠分解成更小獨立的幾部分(例如:人可以分為男人和女人);

多值字段的處理,可以將表分為三張表,這樣使得檢索和排序更加有調理,且保證數據的完整性!

4、其它建議

對于大數據字段,獨立表進行存儲,以便影響性能(例如:簡介字段);

使用varchar類型代替char,因為varchar會動態分配長度,char指定長度是固定的;

給表創建主鍵,對于沒有主鍵的表,在查詢和索引定義上有一定的影響;

避免表字段運行為null,建議設置默認值(例如:int類型設置默認值為0)在索引查詢上,效率立顯;

建立索引,最好建立在唯一和非空的字段上,建立太多的索引對后期插入、更新都存在一定的影響(考慮實際情況來創建);

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 操作系統
    +關注

    關注

    37

    文章

    6801

    瀏覽量

    123283
  • 數據庫
    +關注

    關注

    7

    文章

    3794

    瀏覽量

    64362
  • MySQL
    +關注

    關注

    1

    文章

    804

    瀏覽量

    26530

原文標題:面試中有哪些經典的數據庫問題?

文章出處:【微信號:DBDevs,微信公眾號:數據分析與開發】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    MySQL數據庫索引的底層是怎么實現的

    更低,3次磁盤IO即可。好的數據結構,應該是能盡量減少磁盤IO的次數。既然BB+的一個節點可以存儲多個節點。這個存儲的節點數量是看節點
    發表于 07-28 15:30

    時空數據庫索引研究

    時空數據庫為了快速訪問其龐大的數據量,必須建立有效的時空索引以提高各類時空查詢效率。本文提出了一種基于3D R-tree 算法的時空索引方法:3D R*-tree。3D R*-tree
    發表于 09-17 11:14 ?9次下載

    數據庫索引技術應用

    在對數據庫索引技術進行討論和研究,論述如何準確有效的設置數據庫索引,并結合具體的實例對數據庫索引
    發表于 11-04 11:28 ?26次下載

    基于B+的動態數據持有性證明方案

    針對云存儲環境下的數據持有性證明( PDP)方案效率較低、不能很好支持全動態更新的問題,設計了一種基于B+的動態數據持有性證明方案。該方案引入雙線性對技術
    發表于 11-30 17:14 ?0次下載
    基于<b class='flag-5'>B+</b><b class='flag-5'>樹</b>的動態<b class='flag-5'>數據</b>持有性證明方案

    基于圖形數據庫構建可持久化索引的方法

    可搜索加密技術提供了對加密文件的關鍵詞搜索能力,但是無法有效對云環境中海量文件形成的巨大索引進行操作。在樹形索引的基礎上,提出基于圖形
    發表于 12-04 16:00 ?0次下載
    基于圖形<b class='flag-5'>數據庫</b>構建可持久化<b class='flag-5'>索引</b>的方法

    基于KD和R的多維索引結構

    針對云存儲系統大多基于鍵值對 key,value模型存儲數據,多維查詢需要對整個數據集進行完全掃描,查詢效率較低的問題,提出了一種基于KD和R
    發表于 01-25 15:13 ?0次下載
    基于KD<b class='flag-5'>樹</b>和R<b class='flag-5'>樹</b>的多維<b class='flag-5'>索引</b>結構

    如何在Oracle數據庫找出損壞索引

    在Oracle數據庫如何找出損壞索引呢?下面我們人為構造一個案例,將索引塊損壞。
    的頭像 發表于 10-18 14:24 ?3521次閱讀

    solr管理后臺操作維護索引

    查詢索引的內容在我們的Query的模塊當中,什么都不操作直接點擊Eexcute Query默認查詢10條數據,前提是之前有導入
    發表于 06-03 16:17 ?1154次閱讀
    solr管理后臺<b class='flag-5'>操作</b>維護<b class='flag-5'>索引</b><b class='flag-5'>庫</b>

    數據庫索引使用策略及優化

    的內容完全基于上文的理論基礎,實際上一旦理解了索引背后的機制,那么選擇高性能的策略就變成了純粹的推理,并且可以理解這些策略背后的邏輯。 示例數據庫 為了討論索引策略,需要一個
    的頭像 發表于 11-02 15:13 ?1710次閱讀
    <b class='flag-5'>數據庫</b><b class='flag-5'>索引</b>使用策略及優化

    B+ 索引在 MySQL 的認識

    概述 本質:數據庫維護某種數據結構以某種方式引用(指向)數據 索引取舍原則:索引的結構組織要盡量減少查找過程
    的頭像 發表于 11-08 11:11 ?1264次閱讀
    對 <b class='flag-5'>B+</b> <b class='flag-5'>樹</b>與<b class='flag-5'>索引</b>在 MySQL <b class='flag-5'>中</b>的認識

    面向關系數據庫的智能索引調優方法

    保持數據庫高效的查詢性能.現有的方法大多利用了數據庫實例的查詢日志,它們先從查詢日志得到候選索引,再利用人工設計的模型選擇索引,從而調節
    的頭像 發表于 02-21 17:31 ?1316次閱讀
    面向關系<b class='flag-5'>數據庫</b>的智能<b class='flag-5'>索引</b>調優方法

    MySQL為什么選擇B+作為索引結構?

    在MySQL,無論是Innodb還是MyIsam,都使用了B+索引結構(這里不考慮hash等其他索引)。本文將從最普通的二叉查找
    的頭像 發表于 07-20 11:28 ?947次閱讀
    MySQL為什么選擇<b class='flag-5'>B+</b><b class='flag-5'>樹</b>作為<b class='flag-5'>索引</b>結構?

    MySQL索引的常用知識點

    索引結構:B+ 索引其實是一種數據結構 注意B+
    的頭像 發表于 09-30 16:43 ?455次閱讀

    索引是什么意思 優缺點有哪些

    數據結構,以協助快速查詢、更新數據庫數據索引的實現通常使用B
    的頭像 發表于 10-09 10:19 ?2917次閱讀

    索引的底層實現詳解

    存儲在索引,同時在索引表中保存指向每個數據行的指針。 B-Tree索引(MySQL使用
    的頭像 發表于 10-09 10:26 ?745次閱讀
    <b class='flag-5'>索引</b>的底層實現詳解
    主站蜘蛛池模板: 秋霞电影网午夜一级鲁丝片| 99视频在线看观免费| 国产一区二区三区内射高清 | 99久久久A片无码国产精| 久久草福利自拍视频在线观看| 亚洲 日韩 在线 国产 精品| 国产成人免费观看| 入禽太深免费视频10| www.av天堂网.com| 亲女乱h文小兰第一次| caoporn免费视频在线| 免费网站在线观看国产v片| 123成人站| 麻豆精选2021| 中文字幕无码亚洲字幕成A人蜜桃| 久久se精品一区二区国产| 亚洲视频欧美视频| 好想被狂躁A片免费久99| 亚洲国产精品自在自线观看| 国产午夜精品不卡视频| 午夜伦理 第1页| 国产一区二区内射最近更新| 亚洲精品国产自在在线观看| 国产亚洲欧美高清在线| 亚洲精品视频免费在线观看| 国内精品免费久久影院| 亚洲色噜噜狠狠网站| 九九视频在线观看视频6| 伊人久久亚洲精品一区| 久久久精品免费视频| 19十主播福利视频| 男人和女人一级黄色大片| a级成人免费毛片完整版| 青柠在线观看免费全集 | 亚洲无吗在线视频| 久久久精品成人免费看| 中文字幕在线观看亚洲| 男人都懂www深夜免费网站| yellow2019在线观看视频| 日日操夜夜操天天操| 国产精品第一综合首页|