通過Python測試 InnoDB 和 MyISAM 的讀寫性能

本文測試所用工具版本如下:

Tools Version
MySQL 5.7.18
Python 3.6
Pandas 0.23

① 創(chuàng)建數(shù)據(jù)表

首先我們需要把兩張使用了不同引擎的表創(chuàng)建出來攻臀,使用為了方便起見隐砸,我們直接使用Navicat創(chuàng)建了兩張 員工信息表擦囊,具體字段如下:

使用InnoDB引擎的表彪杉,設(shè)計(jì)表名為innodb行贪,選項(xiàng)如下:


使用MyISAM引擎的表,設(shè)計(jì)表名為myisam抵代,選項(xiàng)如下:


因?yàn)槭呛唵尾僮魈诮冢瑒?chuàng)建的具體細(xì)節(jié)就不詳述了,至此荤牍,我們的數(shù)據(jù)庫就把使用 InnoDB 和 MyISAM 兩種引擎的表創(chuàng)建好了案腺。

② 單線程寫入性能對比

1. InnoDB 引擎

執(zhí)行以下代碼,往使用了InnoDB引擎的表格插入1000條數(shù)據(jù)

import pandas as pd
from sqlalchemy import create_engine
import time

db = create_engine('mysql+pymysql://mysql:123456@127.0.0.1:3306/test')
start = time.time()

for i in range(1000):
    data = {'index': i,
            'name': 'name_' + str(i),
            'age': i,
            'salary': i,
            'level': i}
    df = pd.DataFrame(data, index=[0])
    df.to_sql('innodb', db, if_exists='append', index=False)

end = time.time()
print(end - start)

執(zhí)行3次上面的代碼康吵,得到程序?qū)懭?000條數(shù)據(jù)的時(shí)間分別為:12.58s劈榨、14.10s、12.71s晦嵌,平均寫入時(shí)間為 13.13s同辣。

2. MyISAM 引擎

執(zhí)行以下代碼,往使用了MyISAM引擎的表格插入1000條數(shù)據(jù)

import pandas as pd
from sqlalchemy import create_engine
import time

db = create_engine('mysql+pymysql://mysql:123456@127.0.0.1:3306/test')
start = time.time()

for i in range(1000):
    data = {'index': i,
            'name': 'name_' + str(i),
            'age': i,
            'salary': i,
            'level': i}
    df = pd.DataFrame(data, index=[0])
    df.to_sql('myisam', db, if_exists='append', index=False)

end = time.time()
print(end - start)

執(zhí)行3次上面的代碼惭载,得到程序?qū)懭?000條數(shù)據(jù)的時(shí)間分別為:6.64s旱函、6.99s、7.29s描滔,平均寫入時(shí)間為 6.97s棒妨。

兩種引擎的單線程寫入速度對比如下:


結(jié)論:單線程的情況下,MyISAM引擎的寫入速度比InnoDB引擎的寫入速度快88%

③ 多線程寫入性能對比

1. InnoDB 引擎

執(zhí)行以下代碼含长,往使用了InnoDB引擎的表格插入1000條數(shù)據(jù)

import pandas as pd
from sqlalchemy import create_engine
import time
from concurrent.futures import ThreadPoolExecutor

db = create_engine('mysql+pymysql://mysql:123456@127.0.0.1:3306/test')
start = time.time()

data_lst = [{'index': i,
             'name': 'name_' + str(i),
             'age': i,
             'salary': i,
             'level': i} for i in range(1000)]

def write(data):
    df = pd.DataFrame(data, index=[0])
    df.to_sql('innodb', db, if_exists='append', index=False)

def execute():
    with ThreadPoolExecutor(max_workers=5) as executor:
        executor.map(write, data_lst)

execute()

end = time.time()
print(end - start)

執(zhí)行3次上面的代碼券腔,得到程序?qū)懭?000條數(shù)據(jù)的時(shí)間分別為:4.98s、4.84s拘泞、4.88s纷纫,平均寫入時(shí)間為 4.9s

2. MyISAM 引擎

執(zhí)行以下代碼田弥,往使用了MyISAM引擎的表格插入1000條數(shù)據(jù)

import pandas as pd
from sqlalchemy import create_engine
import time
from concurrent.futures import ThreadPoolExecutor

db = create_engine('mysql+pymysql://mysql:123456@127.0.0.1:3306/test')
start = time.time()

data_lst = [{'index': i,
             'name': 'name_' + str(i),
             'age': i,
             'salary': i,
             'level': i} for i in range(1000)]

def write(data):
    df = pd.DataFrame(data, index=[0])
    df.to_sql('myisam', db, if_exists='append', index=False)

def execute():
    with ThreadPoolExecutor(max_workers=5) as executor:
        executor.map(write, data_lst)

execute()

end = time.time()
print(end - start)

執(zhí)行3次上面的代碼,得到程序?qū)懭?000條數(shù)據(jù)的時(shí)間分別為:3.29s铡原、3.62s偷厦、3.47s,平均寫入時(shí)間為 3.46s燕刻。

兩種引擎的多線程寫入速度對比如下:


結(jié)論:多線程的情況下只泼,MyISAM引擎的寫入速度比InnoDB引擎的寫入速度快42%

④ 讀取性能對比

為了獲得數(shù)據(jù)量較大的表用于測試數(shù)據(jù)庫的讀取性能,我們循環(huán)執(zhí)行10遍上面多線程寫入數(shù)據(jù)的操作卵洗,得到兩張數(shù)據(jù)量為10000條數(shù)據(jù)的表格请唱,然后讀取10遍該表格弥咪,獲取讀取時(shí)間

1. InnoDB 引擎

執(zhí)行以下代碼,讀取10遍使用了InnoDB引擎的表格

import pandas as pd
from sqlalchemy import create_engine
import time

db = create_engine('mysql+pymysql://mysql:123456@127.0.0.1:3306/test')
start = time.time()

for _ in range(10):
    df = pd.read_sql('innodb', db)

end = time.time()
print(end - start)

執(zhí)行3次上面的代碼十绑,得到程序10次讀取10000條數(shù)據(jù)的時(shí)間分別為:28.94s聚至、28.88s、28.48s本橙,平均寫入時(shí)間為 28.77s扳躬。

2. MyISAM 引擎

執(zhí)行以下代碼,讀取10遍使用了MyISAM引擎的表格

import pandas as pd
from sqlalchemy import create_engine
import time

db = create_engine('mysql+pymysql://mysql:123456@127.0.0.1:3306/test')
start = time.time()

for _ in range(10):
    df = pd.read_sql('innodb', db)

end = time.time()
print(end - start)

執(zhí)行3次上面的代碼甚亭,得到程序10次讀取10000條數(shù)據(jù)的時(shí)間分別為:28.51s贷币、29.12s、28.76s亏狰,平均寫入時(shí)間為 28.8s役纹。

兩種引擎的讀取速度對比如下:


結(jié)論:MyISAM引擎和InnoDB引擎的讀取速度無明顯差異

⑤ 總結(jié)

1. 寫入速度,MyISAM比InnoDB快暇唾,單線程的情況下促脉,兩者差異尤為明顯
2. 讀取速度,InnoDB和MyISAM無明顯差異

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末信不,一起剝皮案震驚了整個(gè)濱河市嘲叔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌抽活,老刑警劉巖硫戈,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異下硕,居然都是意外死亡丁逝,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門梭姓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來霜幼,“玉大人,你說我怎么就攤上這事誉尖∽锛龋” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵铡恕,是天一觀的道長琢感。 經(jīng)常有香客問我,道長探熔,這世上最難降的妖魔是什么驹针? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮诀艰,結(jié)果婚禮上柬甥,老公的妹妹穿的比我還像新娘饮六。我一直安慰自己,他們只是感情好苛蒲,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布卤橄。 她就那樣靜靜地躺著,像睡著了一般撤防。 火紅的嫁衣襯著肌膚如雪虽风。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天寄月,我揣著相機(jī)與錄音辜膝,去河邊找鬼。 笑死漾肮,一個(gè)胖子當(dāng)著我的面吹牛厂抖,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播克懊,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼忱辅,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了谭溉?” 一聲冷哼從身側(cè)響起墙懂,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎扮念,沒想到半個(gè)月后损搬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡柜与,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年巧勤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片弄匕。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡颅悉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出迁匠,到底是詐尸還是另有隱情剩瓶,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布城丧,位于F島的核電站延曙,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏芙贫。R本人自食惡果不足惜搂鲫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一傍药、第九天 我趴在偏房一處隱蔽的房頂上張望磺平。 院中可真熱鬧魂仍,春花似錦、人聲如沸拣挪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽菠劝。三九已至赊舶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間赶诊,已是汗流浹背笼平。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留舔痪,地道東北人寓调。 一個(gè)月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像锄码,于是被迫代替她去往敵國和親夺英。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容