欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

探究MySQL中索引和提交頻率對InnoDB表寫入速度的影響

 更新時間:2015年05月08日 11:20:53   投稿:goldensun  
這篇文章主要介紹了MySQL中索引和提交頻率對InnoDB表寫入速度的影響,作者通過實際測試運行時間的對比來驗證,需要的朋友可以參考下

本次,我們來看看索引、提交頻率對InnoDB表寫入速度的影響,了解有哪些需要注意的。

先直接說幾個結論吧:

1、關于索引對寫入速度的影響:
a、如果有自增列做主鍵,相對完全沒索引的情況,寫入速度約提升 3.11%;
b、如果有自增列做主鍵,并且二級索引,相對完全沒索引的情況,寫入速度約降低 27.37%;

因此,InnoDB表最好總是有一個自增列做主鍵。

2、關于提交頻率對寫入速度的影響(以表中只有自增列做主鍵的場景,一次寫入數(shù)據(jù)30萬行數(shù)據(jù)為例):

a、等待全部數(shù)據(jù)寫入完成后,最后再執(zhí)行commit提交的效率最高;
b、每10萬行提交一次,相對一次性提交,約慢了1.17%;
c、每1萬行提交一次,相對一次性提交,約慢了3.01%;
d、每1千行提交一次,相對一次性提交,約慢了23.38%;
e、每100行提交一次,相對一次性提交,約慢了24.44%;
f、每10行提交一次,相對一次性提交,約慢了92.78%;
g、每行提交一次,相對一次性提交,約慢了546.78%,也就是慢了5倍;

因此,最好是等待所有事務結束后再批量提交,而不是每執(zhí)行完一個SQL就提交一次。
曾經有一次對比測試mysqldump啟用extended-insert和未啟用導出的SQL腳本,后者比前者慢了不止5倍。
重要:這個建議并不是絕對成立的,要看具體的場景。如果是一個高并發(fā)的在線業(yè)務,就需要盡快提交事務,避免鎖范圍被擴大。但如果是在非高并發(fā)的業(yè)務場景,尤其是做數(shù)據(jù)批量導入的場景下,就建議采用批量提交的方式。

下面是詳細的測試案例過程,有興趣的同學可以看看:

DROP TABLE IF EXISTS `mytab`;
CREATE TABLE `mytab` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`c1` int(11) NOT NULL DEFAULT ‘0',
`c2` int(11) NOT NULL DEFAULT ‘0',
`c3` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`c4` varchar(200) NOT NULL DEFAULT ”,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;

DELIMITER $$$
DROP PROCEDURE IF EXISTS `insert_mytab`;

CREATE PROCEDURE `insert_mytab`(in rownum int, in commitrate int)
BEGIN
DECLARE i INT DEFAULT 0;

SET AUTOCOMMIT = 0;

WHILE i < rownum DO INSERT INTO mytab(c1, c2, c3,c4) VALUES( FLOOR(RAND()*rownum),FLOOR(RAND()*rownum),NOW(), REPEAT(CHAR(ROUND(RAND()*255)),200)); SET i = i+1; /* 達到每 COMMITRATE 頻率時提交一次 */ IF (commitrate > 0) AND (i % commitrate = 0) THEN
COMMIT;
SELECT CONCAT(‘commitrate: ‘, commitrate, ‘ in ‘, I);
END IF;

END WHILE;

/* 最終再提交一次,確保成功 */

COMMIT;
SELECT ‘ALL COMMIT;';

END; $$$

#測試調用
call insert_mytab(300000, 1); — 每次一提交
call insert_mytab(300000, 10); — 每10次一提交
call insert_mytab(300000, 100); — 每100次一提交
call insert_mytab(300000, 1000); — 每1千次一提交
call insert_mytab(300000, 10000); — 每1萬次提交
call insert_mytab(300000, 100000); — 每10萬次一提交
call insert_mytab(300000, 0); — 一次性提交

測試耗時結果對比:

201558110956408.png (455×173)

相關文章

  • MySQL系列之三 基礎篇

    MySQL系列之三 基礎篇

    本文主要介紹了MySQL基礎使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-07-07
  • mysql中l(wèi)imit查詢踩坑實戰(zhàn)記錄

    mysql中l(wèi)imit查詢踩坑實戰(zhàn)記錄

    在MySQL中我們常常用order by來進行排序,使用limit來進行分頁,下面這篇文章主要給大家介紹了關于mysql中l(wèi)imit查詢踩坑的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-03-03
  • 麒麟系統(tǒng)上安裝?MySQL?8.0.24的詳細步驟(避坑指南)

    麒麟系統(tǒng)上安裝?MySQL?8.0.24的詳細步驟(避坑指南)

    這篇文章主要介紹了麒麟系統(tǒng)上安裝MySQL8.0.24的詳細步驟,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08
  • MySQL學習(七):Innodb存儲引擎索引的實現(xiàn)原理詳解

    MySQL學習(七):Innodb存儲引擎索引的實現(xiàn)原理詳解

    這篇文章主要介紹了Innodb存儲引擎索引的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • Mac下忘記Mysql的root用戶密碼的解決方法

    Mac下忘記Mysql的root用戶密碼的解決方法

    mac中安裝MySQL時系統(tǒng)會自動為root 賬戶生成一個密碼(改密碼一般為一個不好記的字符串),若自己沒有記住改密碼,這時 mysql 就無法進入了。解決方案是修改root 賬戶的密碼,問題是mysql進不去如何修改,下面就是改問題的解決方法:
    2017-03-03
  • mysql字符串格式化方式

    mysql字符串格式化方式

    這篇文章主要介紹了mysql字符串格式化方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • 詳細聊一聊mysql的樹形結構存儲以及查詢

    詳細聊一聊mysql的樹形結構存儲以及查詢

    由于mysql是關系型數(shù)據(jù)庫,因此對于類似組織架構,子任務等相關的樹形結構的處理不是很友好,下面這篇文章主要給大家介紹了關于mysql樹形結構存儲以及查詢的相關資料,需要的朋友可以參考下
    2022-04-04
  • SQL字段拼接成新字段幾種常見的方法

    SQL字段拼接成新字段幾種常見的方法

    這篇文章主要給大家介紹了關于SQL字段拼接成新字段幾種常見的方法,如我們在選擇商品的時候不止需要知道商品的名字,還需要商品代碼型號等,這個時候需要把這些字段拼接為一個字段進行操作或者輸出,需要的朋友可以參考下
    2023-08-08
  • mysql事務的基本要素與事務隔離級別詳解

    mysql事務的基本要素與事務隔離級別詳解

    這篇文章主要介紹了mysql事務的基本要素與事務隔離級別詳解,事務是一種機制、一個操作序列,包含了一組數(shù)據(jù)庫操作命令,并且把所有的命令作為一個整體一起向系統(tǒng)提交或撤銷操作請求,需要的朋友可以參考下
    2023-08-08
  • 深度分析mysql GROUP BY 與 ORDER BY

    深度分析mysql GROUP BY 與 ORDER BY

    鑒于項目的需要,就從網上找到該文章,文章分析得很詳細也很易懂,在android里,(不知道是不是現(xiàn)在水平的限制,總之我還沒找到在用ContentProvider時可以使用子查詢),主要方法是用SQLiteDatabase 的 rawQuery,直接運行sql語句就可以了。
    2014-06-06

最新評論