mysql索引為什麼採用b+樹而不用b樹
(1)b+樹只有葉節點存放資料,其餘節點用來索引,而b樹是每個索引節點都會有data域(索引放磁碟中,磁碟io就會增多)
(2) b+樹所有的data域在葉子節點,並且所有葉子節點之間都有乙個鏈指標。這樣遍歷葉子節點就能獲得全部資料,這樣就能獲得區間訪問了。在資料庫中基於範圍的查詢是非常頻繁的,而b樹不支援這樣的操作。
mysql中myisam和innodb都是使用b+樹
myisam和innodb的區別:(
(1)預設儲存引擎的變遷:在5.1之前使用的是myisam,5.5之後變成了innodb
(2)myisam表級鎖,不支援事務和全文索引,使用大併發,重負荷生產系統上,表級鎖結構效能不好,innodb行級鎖,事務安全(acid),支援外來鍵,5.6.4之後支援全文索引
(3)myisam和innodb效能測試,隨著cpu核數的增加,innodb的吞吐量反而越好,而myisam,其吞吐量幾乎沒有什麼變化,顯然,myisam的表鎖定機制降低了讀和寫的吞吐量。
(4)事務支援與否,myisam是一種非事務的引擎,使得資料庫可以提供高速的儲存和檢索,以及全文搜尋能力,適合頻繁查詢的操作,innodb是事務安全的,中間哪個環節出現問題都可以回滾,myisam不可以
(5)構成上的區別,每個myisam在磁碟上儲存成三個檔案,.frm檔案儲存表定義,資料檔案,其擴充套件名為.myd (mydata),索引檔案,其副檔名是.myi (myindex),
mysql中最小的儲存單位是頁(可以減少磁碟io)
頁目錄(就是b+tree)
等價於(下圖b+tree)(主鍵索引,葉子節點是整行的資料)
聚集索引(主鍵索引)和輔助索引(二級索引)
聚集索引(主鍵索引)
聚集索引就是按照每張表的主鍵構造一顆b+樹,同時葉子節點中存放的即為整張表的記錄資料。
聚集索引的葉子節點稱為資料頁,聚集索引的這種特性決定了索引組織表中的資料也是索引的一部分。
輔助索引(二級索引)
非主鍵索引,葉子節點=鍵值+書籤,innodb儲存引擎的書籤就是相應行資料的主鍵索引值(111,222是資料行中的三列建立的索引值,1是主鍵值)(此時如果查詢不是索引列,查詢用到了索引,就需要回表,通過主鍵值,查詢主鍵索引中的值(也叫回表))
覆蓋索引
(1)就是select的資料列只用從索引中就能夠取得,不必從資料表中讀取,換句話說查詢列要被所使用的索引覆蓋
myisam儲存引擎底層是三個檔案:frm(表結構)myi(索引檔案),myd(資料檔案)
myisam葉節點儲存的是索引和資料節點的磁碟位址,查詢資料需要回表,比innodb相對來說效能差點
索引的鏈結,建立原則)
索引建立的原則:
1)對於查詢頻率高的字段建立索引
2)對排序,分組,聯合查詢頻率高的字段建立索引
3)索引的數目不宜太多(每建立乙個索引都會占用相應的物理控制項,過多的索引會導致insert,update,delete語句的執行效率降低)
4)若在實際中,需要將多個列設定索引時,可以採用多列索引。
5)選擇唯一性索引(唯一性索引的值是唯一的,可以更快速的通過該索引來確定某條記錄。如:學號)
6)盡量使用資料量少的索引
7)盡量使用字首來索引
8)刪除不再使用或者很少使用的索引
在建立乙個n列的索引時,遵循「最左字首」原則:
1)必須用到索引的第乙個字段
eg: create index in_aaa_1 on aaa (a, c);
select * from aaa where b=:*** and c=sysdate;則不會用到索引,因為必須有a出現在where 語句中才會使用到該索引(跟出現在where中的位置先後沒有關係)
2)對於索引的第乙個字段,用like時左邊必須是固定值,萬用字元只能出現在右邊。
eg:select * from aaa where a like '1%';會用到索引;而select * from aaa where a like '%1';不會用到索引。
3)如果在字段前加了函式,則索引會被抑制
eg:select * from aaa where trim(a)=1,則不會用到索引。
4)在字段前嵌入了表示式,索引也將被抑制。
eg:where a+7
還有兩個特殊宣告:
1).select * from aaa where a=:*** and c=sysdate與 select * from aaa where c=sysdate and a=:***;都會用到索引,即與where語句中欄位出現的順序無關;
2).select * from aaa where a=:*** and b=1;會使用索引,此時a出現,即使其他字段不是索引欄位也會使用到索引。
mysql的鎖
表鎖和行鎖
讀鎖(共享鎖)
寫鎖(排他鎖)
innodb儲存引擎由於實現了行級鎖定,雖然在鎖定機制的實現方面帶來了效能損耗可能比表鎖會更高一些,但是在整體併發處理能力方面要遠遠高於myisam的表鎖的。當系統併發量較高的時候,innodb的整體效能和myisam相比就會有比較明顯的優勢。但是,innodb的行級鎖同樣也有其脆弱的一面,當我們使用不當的時候,可能會讓innodb的整體效能表現不僅不能比myisam高,甚至可能會更差。
優化建議:
(1)盡可能讓所有資料檢索都能通過索引來完成,避免無索引行鎖公升級為表鎖。
(2)合理設定索引,盡量縮小鎖的範圍
(3)盡可能較少索引條件,及索引範圍,避免間隙所
(4)盡量控制事務大小,減少鎖定資源量和時間長度
(5)盡可使用低級別事務隔離(但是需要業務層面滿足需求)
mysql的索引怎麼儲存 Mysql中的索引 儲存
索引的使用與資料庫中表的引擎有一定的關聯 索引的儲存的資料型別分為兩種 btree hash myisam innodb 儲存型別只支援btree memory heap支援兩種 一般情況下,有以下幾種常用的索引 普通索引 index create table t1 index 索引名 列名 沒有唯...
mysql 雜湊索引 MySQL索引之雜湊索引
雜湊索引 hash index 建立在雜湊表的基礎上,它只對使用了索引中的每一列的精確查詢有用。對於每一行,儲存引擎計算出了被索引的雜湊碼 hash code 它是乙個較小的值,並且有可能和其他行的雜湊碼不同。它把雜湊碼儲存在索引中,並且儲存了乙個指向雜湊表中的每一行的指標。在mysql中,只有me...
mysql主鍵索引 MySQL索引之主鍵索引
在mysql裡,主鍵索引和輔助索引分別是什麼意思,有什麼區別?上次的分享我們介紹了聚集索引和非聚集索引的區別,本次我們繼續介紹主鍵索引和輔助索引的區別。1 主鍵索引 主鍵索引,簡稱主鍵,原文是primary key,由乙個或多個列組成,用於唯一性標識資料表中的某一條記錄。乙個表可以沒有主鍵,但最多只...