本文測試所用工具版本如下:
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無明顯差異