索引是mysql資料庫中很重要的組成部分,也是程式設計師最關注的部分,索引的目的主要在於提高查詢的效率。可以模擬於字典中的目錄。查詢字典中的內容的同時,可以根據目錄查詢資料的存放位置,從而提取到資料。mysql 支援多種儲存引擎,我們只針對innodb下面的b+tree索引進行學習
在生活中隨處可見索引的列子,比如上面提到的圖書的目錄,車次表,原理都是一樣的通過不斷的縮小查詢範圍的資料,來獲取結果。資料庫也是一樣的,但是顯然要複雜很多,因為我們不僅僅面著著等值查詢(=),還有範圍查詢(, between and , in ),模糊匹配 (like), 並集的查詢(or) 等等。
基於這些問題,資料庫應該怎麼來設計應對這樣的問題?基於資料庫的實現,我們的資料是儲存在磁碟上的,為了提高效能,每次我們又需要把部分資料載入到記憶體中計算,我們知道訪問磁碟的成本大概是訪問記憶體成本的10萬倍左右。
磁碟io跟預讀取
這裡補充一點計算機的基礎知識
io thread
purge thread
page cleaner thread
page 是innodb儲存引擎用於管理資料的最小磁碟單位。常見的頁型別,有資料頁,undo頁,系統頁,事務資料頁等。我們主要研究一下資料頁跟行記錄資料結構。
從上到下依次為:tablespace(表空間,ibd檔案)、segment(段,乙個索引2個段)、extent(區,預設1mb,1 extent=64page)、 page (頁,預設16kb,磁碟管理最小單位)page跟row的結構。每個page占用了16kb,64個連續的page占用1mb叫做extent, 多個extent 組合在一起就是乙個表空間,也叫做表檔案。
幾個基本概念
page的邏輯儲存結構圖
mysql
記錄儲存
虛記錄(infimum+supremum records)最小虛記錄以及最大虛記錄
兩個固定位置儲存的記錄,本身並不儲存資料。
記錄堆(record heap) 對應 user record
未分配空間: 指頁面未使用的儲存空間,隨著頁面的不斷使用,未分配空間將會越來越小。當新插入一條記錄時,首先嘗試從自由空間鍊錶,獲得合適的儲存位置,(空間足夠),如果沒有滿足的,就會在未分配的空間中申請。
solt 區(目錄槽)page directory: slot區是一些頁面有效記錄的指標,每個slot占用兩個位元組,儲存了記錄相對頁面的首位址的偏移。記錄了頁面有序和二分查詢的關鍵。
頁尾(page tailer): 頁面的最後部分,佔8個位元組,主要儲存頁面的校驗資訊。
c 獲取當前時間 毫秒 C 獲取系統時間
1 datetime 數字型 system.datetime currenttime new system.datetime 1.1 取當前年月日時分秒 currenttime system.datetime.now 1.2 取當前年 int 年 currenttime.year 1.3 取當前月 ...
jquery獲取系統當前時間精確到毫秒
1.jquery獲取系統當前時間精確到毫秒 獲取當前年 var year mydate.getfullyear 獲取當前月 var month mydate.getmonth 1 獲取當前日 var date mydate.getdate var h mydate.gethours 獲取當前小時數 ...
mysql 獲取系統時間(毫秒數)
sql語句 select time to sec now now current timestamp replace unix timestamp current timestamp 3 執行結果 優化版 最後乙個,就是你想要的系統毫秒數了 獲取已知日期的時間毫秒數 select unix time...