mysql資料儲存 mysql資料儲存

2021-10-17 11:29:18 字數 2024 閱讀 6008

從磁碟讀取或者寫入資料時,我們通常會指定乙個緩衝區大小,達到緩衝區域大小才會寫入一次資料,較少io操作次數。同樣的從磁碟讀取資料時候,就作業系統而言,讀取一條較小的資料時,並不是只會返回我們需要的資料,而是會將這個資料前後的部分資料一併讀取到記憶體中,以備之後使用。這個從磁碟讀取的最小量的資料被稱為頁,作業系統一頁的大小是4k,而mysql一頁的大小為16k。每一次讀取至少都是一頁大小的資料。

資料儲存

mysql是乙個行資料庫,以一張表為例,當我定義好欄位資訊後,只需要按照字段約束一行行新增資料即可,每一條資料就是一行。為了方便查詢,每一行資料都有乙個唯一主鍵標識(自定義或者使用預設的row_id),並按照資料主鍵進行排序。排序的好處就是能夠方便的快速查詢,例如使用二分的手段,大大減少查詢次數。而mysql使用的手段的b+樹索引,顧名思義,索引就是乙個目錄的存在。

資料是一頁一頁的被查詢,而一頁大小為16k,一行行記錄在乙個頁中的管理大致如下:

在這樣一頁中儲存了10行資料(主要根據一行資料的大小而定),並建立乙個頁索引方便查詢,查詢時會先從頁索查詢,而不用直接遍歷乙個個頁,減少查詢次數。從上面的方式可以從頁中查詢資料,但是在大量的資料中如何定位一條資料的所在的頁呢,這就需要使用b+樹索引

b+樹索引

主鍵索引

在索引的各個節點中,只會儲存主鍵的id值,這通常是乙個非常小的數字,所以乙個16k的頁通常就能儲存這個二叉樹的資料,這樣就構成了乙個索引頁(目錄頁),這個索引頁通常可以直接快取在記憶體中的,當我們查詢乙個條資料時候,根據id值的與二叉樹各個節點進行比較,只需要通過幾次查詢能找出資料所在的頁位置,讀取即可。

普通索引

除了主鍵索引的其他索引我們都將其看作普通索引,普通索引會將該索引列的值進行排序,在建立乙個b+索引樹,和主鍵的b+樹不同的是,主鍵索引的葉子節點上的主鍵值直接關聯行資料,而普通索引葉子節點關聯的資料是主鍵的值,還需要再次通過主鍵進行查詢。

通過主鍵直接可以找到這個主鍵關聯的資料,而使用普通的索引,首先會找到目標資料的主鍵,在通過主鍵索引獲取,需要進行乙個回表的操作。當然,如果想要查詢的資料在可以在這個普通索引的葉子節點中就包含,則不需要回表,而是直接索引覆蓋。

例如有5個字段,a,b,c,d,e,a為主鍵,b為普通索引。如果使用select a,b,c from table where b=1,首先會使用b欄位的索引找到對應資料的主鍵,在通過主鍵查詢到資料中的a,b,c欄位各自的值。這就需要乙個個回表操作。而使用select a,b from table where b=1 查詢時,我們只需要a,b兩個欄位的資料,首先依然通過欄位b的索引查詢主鍵,找到後,由於b欄位和主鍵值已經得到,將不會再根據主鍵去找到全部資料,從而避免了回表操作,加快了查詢速度。

唯一索引

唯一索引在普通索引的基礎上對索引增加了唯一值約束,要求索引列的值必須唯一。在插入資料時候,會查詢通過比較保證該值是唯一的,由於比較的操作,每次插入或者更新資料就必須讀取磁碟中的資料進行比較,然後將資料進行寫入。而普通索引在插入資料時,並不會直接插入資料,而是先將本次插入寫入記憶體中的change buffer,等待寫入的資料足夠多時候,才會正真到磁碟中寫入資料。這樣在大量的寫操作時,比唯一索引更加有效率。而每次讀取資料時候,讀取的資料需要同change buffer中的內容進行一次merge操作,所以在大量讀取的情況下,反而增加change bufffer的維護成本。

聯合索引

聯合索引是指使用多個字段聯合建立索引,例如有5個字段,a,b,c,d,e,使用cde欄位聯合建立乙個索引。同樣的,將三個欄位的值合併到一起進行排序,然後建立索引b+樹,葉子節點關聯主鍵值。聯合索引建立和多個欄位的指定順序有關,當使用這個聯合索引查詢時,需要優先使用第乙個字段進行匹配,如果第乙個欄位不存在,查詢過程中無法通過二叉樹的比較快速定位資料,只能通過全表掃瞄的方式。使用普通索引時候,如果不是唯一索引,那麼可能再b+樹的節點中會出現重複的值,為了區分,重複的值會帶上主鍵值以示區分。保證資料按照規則排序。

mysql 儲存資料 怎麼用mysql儲存資料

seetings中 mysql的基本引數 sql host localhost sql db name spider sql sheetname douban sql user root sql password pipelines中 建構函式用於初始化mysql的各項引數 def init sel...

mysql資料儲存年限 Mysql儲存時間字段

兄弟連教育資料庫培訓教程 mysql儲存時間欄位用int timestamp還是datetime 通常儲存時間用datetime型別,現在很多系統也用int儲存時間,它們有什麼區別?總結如下 int 1 4個位元組儲存,int的長度是4個位元組,儲存空間上比datatime少,int索引儲存空間也相...

python爬蟲之資料儲存(四) MySQL資料庫

pip install pymysql 連線 db pymysql.connect host 127.0.0.1 port 3306 user root password root database csdn crawler charset utf8 port 在外網一般會更換埠號,不會為3306,...