使用Python如何測(cè)試InnoDB與MyISAM的讀寫(xiě)性能
前言
由于近期有個(gè)項(xiàng)目對(duì)系統(tǒng)性能要求很高,技術(shù)選型上由于種種原因已經(jīng)確定使用Mysql數(shù)據(jù)庫(kù),接下來(lái)就是要確定到底使用哪種存儲(chǔ)引擎。我們的應(yīng)用是典型的寫(xiě)多讀少,寫(xiě)入內(nèi)容為也很短,對(duì)系統(tǒng)的穩(wěn)定性要求很高。所以存儲(chǔ)引擎肯定就定在廣泛使用的Innodb和MyISAM之中了。
至于兩者的比較網(wǎng)上也有很多,但是畢竟這個(gè)事情也不復(fù)雜,決定還是自己來(lái)做,去驗(yàn)證一下在我們的場(chǎng)景下誰(shuí)更優(yōu)。
本文測(cè)試所用工具版本如下:
| Tools | Version |
|---|---|
| MySQL | 5.7.18 |
| Python | 3.6 |
| Pandas | 0.23 |
① 創(chuàng)建數(shù)據(jù)表
首先我們需要把兩張使用了不同引擎的表創(chuàng)建出來(lái),使用為了方便起見(jiàn),我們直接使用Navicat創(chuàng)建了兩張 員工信息表,具體字段如下:

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

使用InnoDB引擎的表,設(shè)計(jì)表名為myisam,選項(xiàng)如下:
因?yàn)槭呛?jiǎn)單操作,創(chuàng)建的具體細(xì)節(jié)就不詳述了,至此,我們的數(shù)據(jù)庫(kù)就把使用 InnoDB 和 MyISAM 兩種引擎的表創(chuàng)建好了。
② 單線程寫(xiě)入性能對(duì)比
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,平均寫(xiě)入時(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,平均寫(xiě)入時(shí)間為 6.97s。
兩種引擎的單線程寫(xiě)入速度對(duì)比如下:

結(jié)論:?jiǎn)尉€程的情況下,MyISAM引擎的寫(xiě)入速度比InnoDB引擎的寫(xiě)入速度快88%
③ 多線程寫(xiě)入性能對(duì)比
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,平均寫(xiě)入時(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,平均寫(xiě)入時(shí)間為 3.46s。
兩種引擎的多線程寫(xiě)入速度對(duì)比如下:

結(jié)論:多線程的情況下,MyISAM引擎的寫(xiě)入速度比InnoDB引擎的寫(xiě)入速度快42%
④ 讀取性能對(duì)比
為了獲得數(shù)據(jù)量較大的表用于測(cè)試數(shù)據(jù)庫(kù)的讀取性能,我們循環(huán)執(zhí)行10遍上面多線程寫(xiě)入數(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,平均寫(xiě)入時(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,平均寫(xiě)入時(shí)間為 28.8s。
兩種引擎的讀取速度對(duì)比如下:

結(jié)論:MyISAM引擎和InnoDB引擎的讀取速度無(wú)明顯差異
⑤ 總結(jié)
1. 寫(xiě)入速度,MyISAM比InnoDB快,單線程的情況下,兩者差異尤為明顯
2. 讀取速度,InnoDB和MyISAM無(wú)明顯差異
好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
- mysql更改引擎(InnoDB,MyISAM)的方法
- MySQL存儲(chǔ)引擎中的MyISAM和InnoDB區(qū)別詳解
- 淺談MySQL存儲(chǔ)引擎選擇 InnoDB與MyISAM的優(yōu)缺點(diǎn)分析
- MySQL數(shù)據(jù)庫(kù)修復(fù)方法(MyISAM/InnoDB)
- 將MySQL從MyISAM轉(zhuǎn)換成InnoDB錯(cuò)誤和解決辦法
- MySQL存儲(chǔ)引擎 InnoDB與MyISAM的區(qū)別
- MySQL兩種表存儲(chǔ)結(jié)構(gòu)MyISAM和InnoDB的性能比較測(cè)試
- MySQL從MyISAM轉(zhuǎn)換成InnoDB錯(cuò)誤與常用解決辦法
- mysql 中InnoDB和MyISAM的區(qū)別分析小結(jié)
- 淺談MyISAM 和 InnoDB 的區(qū)別與優(yōu)化
相關(guān)文章
PyCharm軟件無(wú)法安裝lxml庫(kù)的問(wèn)題及解決
這篇文章主要介紹了PyCharm軟件無(wú)法安裝lxml庫(kù)的問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01
pytorch中的優(yōu)化器optimizer.param_groups用法
這篇文章主要介紹了pytorch中的優(yōu)化器optimizer.param_groups用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05
Python 字節(jié)流,字符串,十六進(jìn)制相互轉(zhuǎn)換實(shí)例(binascii,bytes)
這篇文章主要介紹了Python 字節(jié)流,字符串,十六進(jìn)制相互轉(zhuǎn)換實(shí)例(binascii,bytes),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05
Python實(shí)現(xiàn)DBSCAN聚類算法并樣例測(cè)試
聚類是一種機(jī)器學(xué)習(xí)技術(shù),它涉及到數(shù)據(jù)點(diǎn)的分組,聚類是一種無(wú)監(jiān)督學(xué)習(xí)的方法,是許多領(lǐng)域中常用的統(tǒng)計(jì)數(shù)據(jù)分析技術(shù)。本文給大家分享Python實(shí)現(xiàn)DBSCAN聚類算法并樣例測(cè)試,感興趣的朋友一起看看吧2021-06-06
pytorch:model.train和model.eval用法及區(qū)別詳解
今天小編就為大家分享一篇pytorch:model.train和model.eval用法及區(qū)別詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02

