用Python測試InnoDB和MyISAM的讀寫性能

數據科學俱樂部

中國數據科學家社區

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

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條數據

importandas 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條數據

importendas 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 execute():
    with ThreadPoolExecutor(max_workers=5) as executor:
        executor.map(write, data_lst)

execute()

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('innodb', 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無明顯差異

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章