Log File物理結構
log block結構分為日誌頭段、日誌記錄、日誌尾部
Block Header,佔用12位元組
Data部分
Block tailer,佔用4位元組
Block Header
這個部分是每個Block的頭部,主要記錄的塊的信息
Block Number,表示這是第幾個block,佔用4位元組,是通過LSN計算得來的,佔用4位元組
Block data len,表示該block中有多少位元組已經被使用了,佔用2位元組
First Rec offet,表示該block中作為第一個新的mtr開始的偏移量,佔用2位元組
Checkpoint number,表示該log block最後被寫入時的檢查點的值,佔用4位元組
㈡ 如何設計一個能夠高效查詢的千萬級MySQL資料庫
我們先探討非高並發量的實現。
對於查詢頻次較高的欄位,加上索引。
加索引注意事項:1.對那些字元內容較長的最好不要加索引2.按照官方文檔,單表加的索引不要超過16個,索引的長度不要超過256個位元組。隨意加索引,會給數據維護增知臘加負擔其實,可以引入分區。
分區注意事項:1.常見的分區類型有range,list,hash,key等。用的比較多的就是range分區。2.對於初始建立索引的時候,我們往往會忽視一個前提條件,導致添加失敗報錯。這里的前提是,如果表是有主鍵的,分區的鍵和主鍵不是同一個,那麼分區的鍵也必須是主鍵。引入分區後,數據寫入時,資料庫會自動判斷寫入哪個分區
對於譽慎並發量較高的,我們除了做上搭虛滑面的操作外,就要考慮分庫分表或者採用一主多從的方式。
未來我相信這類問題需要採用NewSQl這類資料庫來解決,如TiDb等,此時,我們將不必考慮數據分區的問題,而且可以做到數據水平無限擴展,和熱點數據的動態分布。
㈢ 如何設計一個能夠高效查詢的千萬級MySQL資料庫
首先要確定你的目標,所謂千萬級是每秒千萬次查詢還是千萬條記錄的資料庫,前者是一個極其復雜的,這個不是光告mysql能解決的,我想不是前者,而後者卻是很簡單的一件事,前提是定義高效,定義兩個指標:
1,每秒查詢的次數是多少
2,每次查詢時長
確定好以後再考慮以下幾個因素的優化
1,存儲的類型,SSD比普通磁碟的隨機讀寫能力可以提高不少禪嫌凱,一般2到3個數量級,還要看索引和數據塊的大小,比較復雜
2,先擇RAID類型,如果選raid0和raid10可以提升近似1倍的速度
3,使用高帶寬的網速,可以減少網路傳輸延遲,用10g的光纖比1g的電纜理論上可以提升1個數量級的吞吐量,尤其對大數據據量的結果集特別有效
4,合理的索引,帶條件的檢索欄位加上索引
5,用大寬表,盡可能減少多表關聯查詢,用空間換時間吧
6,_用主從的集群,基本上查詢的並發量和伺服器的數量成正比的
7,使賀喚用緩存,如memcached,尤其對靜態數據提升尤其明顯
8,合理選擇資料庫欄位的類型,用定長字字,不要用變長的,如定長的int,char,decimal類型,別用varchar,text等
9,給資料庫配置更大的內存
10,檢查下瓶頸在不在CPU,如果查詢復雜,換個更高配置的伺服器
總的原剛就是,盡可能用內存替代碰盤提升IO速度,提高網路和CPU的配置以減少查詢時間;盡可能提升網路速度,內存和主機的數量以提高並發
我們先探討非高並發量的實現。
對於查詢頻次較高的欄位,加上索引。
加索引注意事項:
1.對那些字元內容較長的最好不要加索引
2.按照官方文檔,單表加的索引不要超過16個,索引的長度不要超過256個位元組。
隨意加索引,會給數據維護增加負擔
其實,可以引入分區。
分區注意事項:
1.常見的分區類型有range,list,hash,key等。用的比較多的就是range分區。
2.對於初始建立索引的時候,我們往往會忽視一個前提條件,導致添加失敗報錯。
這里的前提是,如果表是有主鍵的,分區的鍵和主鍵不是同一個,者宴那麼分區的鍵也必須是主鍵。
引入分區後,數據寫入時,資料庫會自動判斷寫入哪個分區
對於並發量較高的,我們除了做上面的操作外,就要考慮分庫分表或者採用一主多從的方式。
未來我相信這類問題需要採用NewSQl這類資料庫來解決,如TiDb等,此時,我們將不必考慮數據分區的問題,而且可以做到數據水平無限擴展,和熱點數據的動態分布。