MyISAM和InnoDB的區別(讀寫效能)
MyISAM 和 InnoDB 引擎的區別有很多,下面通過例項測試 MySQL 5.7 讀寫效能的差異
本文測試所用工具版本如下:
MySQL:5.7.18
Python:3.6
Pandas:0.23
① 建立資料表
首先我們需要把兩張使用了不同引擎的表創建出來,使用為了方便起見,我們直接使用Navicat建立了兩張 員工資訊表,具體欄位如下:
使用InnoDB引擎的表,設計表名為innodb,選項如下:
使用MyISAM引擎的表,設計表名為myisam,選項如下:
因為是簡單操作,建立的具體細節就不詳述了,至此,我們的資料庫就把使用 InnoDB 和 MyISAM 兩種引擎的表建立好了。
② 單執行緒寫入效能對比
1. InnoDB 引擎
執行以下程式碼,往使用了InnoDB引擎的表格插入1000條資料
import pandas as pd from sqlalchemy import create_engine import time db = create_engine('mysql+pymysql://mysql:[email protected]: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)
執行3次上面的程式碼,得到程式寫入1000條資料的時間分別為:12.58s、14.10s、12.71s,平均寫入時間為 13.13s。
2. MyISAM 引擎
執行以下程式碼,往使用了MyISAM引擎的表格插入1000條資料
import pandas as pd from sqlalchemy import create_engine import time db = create_engine('mysql+pymysql://mysql:[email protected]: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)
執行3次上面的程式碼,得到程式寫入1000條資料的時間分別為:6.64s、6.99s、7.29s,平均寫入時間為 6.97s。
兩種引擎的單執行緒寫入速度對比如下:
結論:單執行緒的情況下,MyISAM引擎的寫入速度比InnoDB引擎的寫入速度快88%
③ 多執行緒寫入效能對比
1. InnoDB 引擎
執行以下程式碼,往使用了InnoDB引擎的表格插入1000條資料
import pandas as pd
from sqlalchemy import create_engine
import time
from concurrent.futures import ThreadPoolExecutor
db = create_engine('mysql+pymysql://mysql:[email protected]: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)
執行3次上面的程式碼,得到程式寫入1000條資料的時間分別為:4.98s、4.84s、4.88s,平均寫入時間為 4.9s。
2. MyISAM 引擎
執行以下程式碼,往使用了MyISAM引擎的表格插入1000條資料
import pandas as pd
from sqlalchemy import create_engine
import time
from concurrent.futures import ThreadPoolExecutor
db = create_engine('mysql+pymysql://mysql:[email protected]: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 execution():
with ThreadPoolExecutor(max_workers=5) as executor:
executor.map(write, data_lst)
execution()
end = time.time()
print(end - start)
執行3次上面的程式碼,得到程式寫入1000條資料的時間分別為:3.29s、3.62s、3.47s,平均寫入時間為 3.46s。
兩種引擎的多執行緒寫入速度對比如下:
結論:多執行緒的情況下,MyISAM引擎的寫入速度比InnoDB引擎的寫入速度快42%
④ 讀取效能對比
為了獲得資料量較大的表用於測試資料庫的讀取效能,我們迴圈執行10遍上面多執行緒寫入資料的操作,得到兩張資料量為10000條資料的表格,然後讀取10遍該表格,獲取讀取時間
1. InnoDB 引擎
執行以下程式碼,讀取10遍使用了InnoDB引擎的表格
import pandas as pd
from sqlalchemy import create_engine
import time
db = create_engine('mysql+pymysql://mysql:[email protected]:3306/test')
start = time.time()
for _ in range(10):
df = pd.read_sql('innodb', db)
end = time.time()
print(end - start)
執行3次上面的程式碼,得到程式10次讀取10000條資料的時間分別為:28.94s、28.88s、28.48s,平均寫入時間為 28.77s。
2. MyISAM 引擎
執行以下程式碼,讀取10遍使用了MyISAM引擎的表格
import pandas as pd
from sqlalchemy import create_engine
import time
db = create_engine('mysql+pymysql://mysql:[email protected]:3306/test')
start = time.time()
for _ in range(10):
df = pd.read_sql('myisam', db)
end = time.time()
print(end - start)
執行3次上面的程式碼,得到程式10次讀取10000條資料的時間分別為:28.51s、29.12s、28.76s,平均寫入時間為 28.8s。
兩種引擎的讀取速度對比如下:
結論:MyISAM引擎和InnoDB引擎的讀取速度無明顯差異
⑤ 總結
1. 寫入速度,MyISAM比InnoDB快,單執行緒的情況下,兩者差異尤為明顯
2. 讀取速度,InnoDB和MyISAM無明顯差異