mysql非主鍵索引_主鍵索引和非主鍵索引的區別

1. 什么是最左前綴原則?

以下回答全部是基于MySQL的InnoDB引擎

例如對于下面這一張表

a018ed1d70b4ad5f49611c7a92436c74.png

如果我們按照 name 字段來建立索引的話,采用B+樹的結構,大概的索引結構如下

fc02304eaf546822091e66fe576cda82.png

如果我們要進行模糊查找,查找name 以“張"開頭的所有人的ID,即 sql 語句為

select?ID?from?table?where?name?like?'張%'

由于在B+樹結構的索引中,索引項是按照索引定義里面出現的字段順序排序的,索引在查找的時候,可以快速定位到 ID 為 100的張一,然后直接向右遍歷所有張開頭的人,直到條件不滿足為止。

也就是說,我們找到第一個滿足條件的人之后,直接向右遍歷就可以了,由于索引是有序的,所有滿足條件的人都會聚集在一起。

而這種定位到最左邊,然后向右遍歷尋找,就是我們所說的最左前綴原則。

2. 為什么用 B+ 樹做索引而不用哈希表做索引?

1、哈希表是把索引字段映射成對應的哈希碼然后再存放在對應的位置,這樣的話,如果我們要進行模糊查找的話,顯然哈希表這種結構是不支持的,只能遍歷這個表。而B+樹則可以通過最左前綴原則快速找到對應的數據。

2、如果我們要進行范圍查找,例如查找ID為100 ~ 400的人,哈希表同樣不支持,只能遍歷全表。

3、索引字段通過哈希映射成哈希碼,如果很多字段都剛好映射到相同值的哈希碼的話,那么形成的索引結構將會是一條很長的鏈表,這樣的話,查找的時間就會大大增加。

3. 主鍵索引和非主鍵索引有什么區別?

例如對于下面這個表(其實就是上面的表中增加了一個k字段),且ID是主鍵。

8614e41ea6b9fd95accedc9288ffb5cc.png

主鍵索引和非主鍵索引的示意圖如下:

77ee2e3cda1156586eed50e359bf971b.png

其中R代表一整行的值。

從圖中不難看出,主鍵索引和非主鍵索引的區別是:非主鍵索引的葉子節點存放的是主鍵的值,而主鍵索引的葉子節點存放的是整行數據,其中非主鍵索引也被稱為二級索引,而主鍵索引也被稱為聚簇索引。

根據這兩種結構我們來進行下查詢,看看他們在查詢上有什么區別。

1、如果查詢語句是 select * from table where ID = 100,即主鍵查詢的方式,則只需要搜索 ID 這棵 B+樹。

2、如果查詢語句是 select * from table where k = 1,即非主鍵的查詢方式,則先搜索k索引樹,得到ID=100,再到ID索引樹搜索一次,這個過程也被稱為回表。

現在,知道他們的區別了吧?

4. 為什么建議使用主鍵自增的索引?

對于這顆主鍵索引的樹

04ebd3a20f911e6a4f99f54105966cbc.png

如果我們插入 ID = 650 的一行數據,那么直接在最右邊插入就可以了

6d47aa2a76276044dd77b031b38aa9cf.png

但是如果插入的是 ID = 350 的一行數據,由于 B+ 樹是有序的,那么需要將下面的葉子節點進行移動,騰出位置來插入 ID = 350 的數據,這樣就會比較消耗時間,如果剛好 R4 所在的數據頁已經滿了,需要進行頁分裂操作,這樣會更加糟糕。

但是,如果我們的主鍵是自增的,每次插入的 ID 都會比前面的大,那么我們每次只需要在后面插入就行, 不需要移動位置、分裂等操作,這樣可以提高性能。也就是為什么建議使用主鍵自增的索引。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/457318.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/457318.shtml
英文地址,請注明出處:http://en.pswp.cn/news/457318.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

優美的配色方案設計

2019獨角獸企業重金招聘Python工程師標準>>> 怎么做好設計配色一直是個難題,雖然網站上有各種各樣的色庫,但配色仍然至關重要,不得已的話可以親自動手,況且樂趣滿滿。 這個沒有一套標準,所以看自己怎么喜歡…

It's a start!

開始博客之旅轉載于:https://www.cnblogs.com/catchingdream/p/5843172.html

mysql死鎖釋放時間參數_【Mysql】mysql 事務未提交導致死鎖 Lock wait timeout exceeded; try restarting transaction 解決辦法...

問題場景問題出現環境:1、在同一事務內先后對同一條數據進行插入和更新操作;2、多臺服務器操作同一數據庫;3、瞬時出現高并發現象;不斷的有一下異常拋出,異常信息:org.springframework.dao.CannotAcquireLo…

ORACLE sqlplus設置行數和寬度

1) 查看目前的pagesize,默認是14:Sqlplus代碼show pagesize; 2) 將pagesize設置好100,則可以一次顯示夠多行記錄了:Sqlplus代碼set pagesize 100; 2. 設置行的寬度1) 查看目前的linesize,默認是80:Sqlplus代碼show linesize; 2) 設置成100或者更寬都可以:Sqlplus代碼set li…

mysql關系模式怎么畫_關系數據庫與mysql

表下面是阿里的mysql設計原則,可以參考,不一定按照阿里規則,但一個團隊一定要有規則,如果現在沒有規則,從現在開始,慢慢推廣,適應1.【強制】表達是與否概念的字段,必須使用 is_xxx的…

Javascript 構造函數模式、原型模式

前兩天寫完組合繼承,打算總結一下原型繼承的,不過今天看了一下工廠模式、構造函數模式和原型模式,覺得有必要總結一下以加深印象。 ———————————————————————————————————————————————————…

2016年CCF第七次測試 俄羅斯方塊

1 //2016年CCF第七次測試 俄羅斯方塊2 // 這道小模擬題還是不錯3 // 思路&#xff1a;處理出輸入矩陣中含1格子的行數和列數4 // 再判是否有一個格子碰到底部&#xff0c;否則整體再往下移動一步&#xff0c;如果有一個格子不能移動&#xff0c;要返回到前一步5 6 #include <…

springmvc視圖解析器_SpringMVC視圖及REST風格

什么是視圖解析器&#xff1f;springMVC用于處理視圖最重要的兩個接口是ViewResolver和View。ViewResolver的主要作用是把一個邏輯上的視圖名稱解析成一個真的的視圖&#xff0c;而SpringMVC中用于把View對象呈現給客戶端的是View對象本身&#xff0c;而ViewResolver只是把邏輯…

mysql5.7.x 1251_MySql-8.0.x免安裝版下載與配置,Navicat打開數據庫鏈接報錯1251的解決辦法...

概述MySQL從5.7一下子跳到了MySQL8.0, 其中的變化必然是很大的, 這里就不說了, 本文主要講解最新版MySQL安裝的事情.實際上5.7版本后的mysql免安裝版都是沒有data文件和my.ini文件的&#xff0c;下面再具體說明怎么生成&#xff0c;注意不能自己手動新建.下載下載程序必然去官網…

To install 64-bit ODBC drivers

為了更充分的利用硬件資源&#xff0c;我想很多人都開使用64位操作系統了&#xff0c;同時你可以也發現了在64位操作系統上ODBC的驅動找不到了&#xff0c;所以ODBC的東西都沒法用了。 因為2007以前版本的Office只有32位版本&#xff0c;所以我們不能在64位系統上使用ODBC。使用…

【Qt開發】QTableWidget設置根據內容調整列寬和行高

QTableWidget要調整表格行寬主要涉及以下一個函數 1.resizeColumnsToContents(); 根據內容調整列寬 2.resizeColumnToContents(int col); 根據內容自動調整給定列寬 3.horizontalHeader()->setResizeMode 把給定列…

深入淺出mysql數據開發_深入淺出MySQL數據庫開發、優化與管理維護 PDF掃描版[513KB]...

深入淺出MySQL數據庫開發、優化與管理維護 內容介紹&#xff1a;本書從數據庫的基礎、開發、優化、管理維護4個方面對MySQL進行了詳細的介紹&#xff0c;其中每一部分都獨立成篇。本書內容實用&#xff0c;覆蓋廣泛&#xff0c;講解由淺入深&#xff0c;適合于各個層次的讀者。…

Understand Lambda Expressions in 3 minutes(翻譯)

本文翻譯自CodeProject上的一篇簡單解釋Lambda表達式的文章&#xff0c;適合新手理解。譯文后面我補充了一點對Lambda表達式的說明。 1.什么是Lambda表達式&#xff1f; Lambda表達式是一種匿名方法&#xff0c;多數情況下用來在LINQ中快速創建委托。簡單地說&#xff0c;它代表…

Hibernate二級緩存配置

一、定義&#xff1a; 二級緩存是進程或集群范圍內的緩存&#xff0c;可以被所有的Session共享&#xff0c;是可配置的插件 二、二級緩存原理圖 解析&#xff1a;每次從二級緩存中取出的對象&#xff0c;都是一個新的對象。 三、配置步驟如下&#xff1a; 同理&#xff1a;以員…

redis配置主從沒效果_跟我一起學Redis之加個哨兵讓主從復制更加高可用

Redis哨兵(Sentinel)其實本質就是一個RedisServer節點&#xff0c;通過設置 運行模式 來開啟哨兵的功能&#xff1b;主要功能如下&#xff1a;監控(Monitoring )&#xff1a;哨兵節點會不斷地檢查的主服務和從服務的運行狀態&#xff1b;自動故障遷移(Automatic failover) &…

閏秒導致MySQL服務器的CPU sys過高

今天&#xff0c;有個哥們碰到一個問題&#xff0c;他有一個從庫&#xff0c;只要是啟動MySQL&#xff0c;CPU使用率就非常高&#xff0c;其中sys占比也比較高&#xff0c;具體可見下圖。 注意&#xff1a;他的生產環境是物理機&#xff0c;單個CPU&#xff0c;4個Core。 于是&…

position定位——讓人又愛又恨的屬性

關于css中的position這個屬性&#xff0c;在使用的時候&#xff0c;有時很強大&#xff0c;有時又讓人很無奈。 強大的時候&#xff0c;對于div中的一些小物件不方便使用margin或者padding的時候&#xff0c;給與position:absolute;再配備left、right、top和bottom&#xff0c;…

CentOS 6.8安裝Python2.7.13

轉載自&#xff1a;http://www.cnblogs.com/94YY/p/6224441.html查看當前系統中的 Python 版本python --version返回 Python 2.6.6 為正常。檢查 CentOS 版本cat /etc/redhat-release返回 CentOS release 6.8 (Final) 為正常。安裝所有的開發工具包yum groupinstall -y "D…

新安裝數據庫sqlserver2008r2,使用javaweb連接不上問題處理

鼠標右鍵【計算機】--》【管理】&#xff0c;打開界面如下&#xff1a; 選擇自己數據庫的實例名&#xff1a; 選擇TCP/IP&#xff1a;右鍵【屬性】&#xff0c;將所有TCP動態端口的【0】刪掉&#xff0c;TCP端口設為1433&#xff1b;重啟服務&#xff0c;即可連接。PS:不知道這…

vue 鼠標點擊事件_VBA代碼解決方案第115講:點擊鼠標實現精準控制觸發事件的VBA代碼第二方案...

大家好&#xff0c;我們今日繼續講解VBA代碼解決方案的第115講內容&#xff1a;工作表事件中&#xff0c;根據Target參數不同&#xff0c;實現精準控制觸發事件的VBA代碼第二方案。在上一講中我們講了利用Address的屬性實現控制觸發事件的方案&#xff0c;今日講解第二方案&…