目錄
MySQL刷盤原理
臟頁和干凈頁
MySQL出現短暫的堵塞SQL現象
情況分析
應對措施
數據庫表中數據刪除原理
刪除表中數據數據庫空間大小不會改變
情況分析
應對措施
MySQL刷盤原理
一般主要分為兩個步驟
????????內存更新和 redo log 記錄是同一事務修改的兩個必要操作,缺一不可
????????步驟1、數據進行修改的時候,把修改數據的記錄放入內存并且寫入到redo log
????????步驟2、當空閑的時候會進行數據的刷盤,這里的刷盤是指把修改的數據刷入到MySQL中
臟頁和干凈頁
臟頁:? ? ? ?內存和redo log修改了,但是MySQL磁盤沒有修改
干凈頁:? ? 內存、redo log、MySQL磁盤都修改了
MySQL出現短暫的堵塞SQL現象
常見的MySQL沒有規律的偶爾堵塞的問題,一般就是和MySQL刷盤有關
情況分析
常見原因有兩種
1、當redo log日志寫滿之后,會短暫的出現停止更新,強制MySQL刷盤操作
2、當內存滿了之后,需要淘汰一些數據頁,如果數據頁是臟頁,也會短暫的出現停止更新,強制MySQL刷盤操作
應對措施
此時我們需要合理的控制MySQL刷盤的速度,減少待刷盤臟頁比例小于75%,減少這兩種場景的出現
其中,控制MySQL刷盤速度需要考慮的因素
?? ??? ?MySQL刷盤速度臟頁比例和redo log寫盤速度
數據庫表中數據刪除原理
在刪除數據庫中表的數據,因為數據是使用主鍵索引B+樹存儲的
所以即使刪除,MySQL也只是在這個表的B+數索引上面加一個刪除標記,后面插入數據的時候可能會復用,并不會重新構建一個沒有刪除數據的B+樹
刪除表中數據數據庫空間大小不會改變
情況分析
通過上面的數據庫刪除原理可以知道,數據庫表數據存儲是通過主鍵索引B+樹存儲的。
數據庫表中的數據刪除只是在B+樹上面的節點添加刪除標記,并不會真正刪除,后面有新數據插入可以復用這部分空間
應對措施
刪表重建
1、把表需要保存的數據進行導出,然后把整個表刪除掉,這里本質就是把這個表的主鍵索引B+樹刪除
2、重新創建表,導入需要保存的數據,此時本質就是重新建立主鍵索引B+樹,主鍵索引 更緊湊,數據?的利?率也更?
這里只討論原理,在具體場景中怎么保證數據庫刪表重建,具體問題具體分析
如:使用? ? ? ?ALTER TABLE 表名 ENGINE=InnoDB? ? 命令重建表
? ? ? ? 這個命令的原理就是先創建一個數據相同的臨時表,然后直接替換原表,執行過程中會限制表修改防止數據出現不一致現象