由批量插入和單條插入的性能引起的反思

批量插入比一條一條的插入性能高原因如下:

批量插入SQL執行效率高的主要原因是合併後日志量(MySQL的binlog和innodb的事務讓日誌)

減少了,降低日誌刷盤的數據量和頻率,從而提高效率。通過合併SQL語句,同時也能減少SQL語句解析的次數,減少網絡傳輸的IO。

ps:對於innodb,所有未提交的的二進制日誌會被記錄到一個緩存中去,等該事物提交時,直接將緩存中的二進制日誌寫入二進制日誌文件中去,該緩存的大小由

binlog_cache_size決定,二進制日誌記錄了對MYSQL數據庫執行更改的所有操作,但是不包括select和show這類操作,

因爲這類操作對數據本身並沒有修改,二進制日誌的功能:恢復,複製,審計。開啓二進制當然會對性能有所影響,二進制日誌並不是每次寫的時候都同步到磁盤,

參數sync_binlog表示多少次事物會從到磁盤中,如果是批量插入,表示只有1個事物

Mysql中常見的日誌文件有:

  1. 錯誤日誌:對MySQL的啓動,運行,關閉過程進行了記錄

  2. 二進制日誌:j記錄了對mysql數據庫執行更改的所有操作,不包括select和show這種

  3. 慢查詢日誌:可以在mysql啓動時,設一個閾值,將運行時間超過該值的所有SQL語句都記錄到慢查詢日誌文件中

  4. 查詢日誌:記錄了所有對mysql的請求信息

innodb存儲引擎中的文件:

  1. redolog

  2. undolog

  3. 表空間文件:innodb採用將存儲的數據按表空間進行存放

Undo日誌記錄某數據被修改前的值,可以用來在事務失敗時進行rollback;Redo日誌記錄某數據塊被修改後的值,可以用來恢復未寫入data file的已成功事務更新的數據。下面的示例來自於楊傳輝《大數據分佈式存儲系統 原理解析與架構實踐》,略作改動。

例如某一事務的事務序號爲T1,其對數據X進行修改,設X的原值是5,修改後的值爲15,那麼Undo日誌爲<T1, X, 5>,Redo日誌爲<T1, X, 15>。

二進制日誌文件和redolog的區別:

  1. 二進制日誌會記錄所有與mysql數據庫有關的日誌記錄,包括其他存儲引擎的日誌,而redolog只記錄innodb的

  2. 二進制日誌記錄的是一個事物的具體操作內容,如update t set a=1,而redolog記錄的是物理改變,如上述例子

  3. 寫入時間不同,二進制日誌文件盡在事物提交前進行提交,而在事物進行的過程中,卻不斷的有重做日誌被寫入到重做日誌文件中(因爲重做日誌記錄的是改變,因此是在事物執行過程中記錄每一個語句的改變,而二進制日誌只是記錄操作語句)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章