Mysql與tidb測試數據為8000萬行。
1、修改一個字段的列名,比如將“ctime”修改為“cctime”。
Tidb測試:
MySQL測試:
2、同一屬性之間切換,即修改一個字段的屬性大小。比如將int類型修改為bigint類型
Tidb:
Mysql:
MySQL是創建臨時表的方式來加字段,因此這個時間花費已超過40分鍾,所以停止了操作。
總結:同一個屬性之間切換時,可以對比出來,tidb花費的時間是極少的,在8000萬行的數據時依然能表現出極好的性能,但是同比之下MySQL的表現極差,花費時間太長。
3、不同屬性之間切換,即修改一個字段的屬性為其他屬性,比如將int類型修改為varchar類型
Tidb:
可以看出來tidb暫時不支持此種語法。
MySQL
MySQL是支持此語法的。
但是上面的這個例子中,test這個表只有一行數據,所以很快就修改了。如果對於大數據集下,比如co2這個表,有8000萬行數據,那么此時MySQL在修改列屬性花費的時間非常長。
總結:此時可以查看tidb的官方說明書。
4、上面的三個例子中,我們修改的是非索引的列,在接下來的例子中,我們修改一個索引列嘗試一下,將trace_app_id修改為trace_app_idd。
Tidb:
MySQL:
mysql修改字段時間過長,這里終止了
5、將trace_app_idd的屬性范圍修改大一些,比如將varchar(200)修改為varchar(300)。
Tidb:
MySQL:
mysql修改字段時間過長,這里終止了
6、在原表基礎上增加一個列。
Tidb:
MySQL:
mysql修改字段時間過長,這里終止了
7、在原表基礎上再次同時增加多個列:
Tidb:
可以看出來tidb不支持同時創建多個列,因此要創建多個列只能一個個列的來。
MySQL:
在MySQL中是可以同時創建多個列的,因此不做測試。
總結:在tidb中,ADD COLUMN 操作目前不支持同時創建多個列。
8、在原表基礎上增加一個索引。
Tidb:
9、在原表基礎上增加多個索引。
Tidb
MySQL:
在MySQL中是可以同時創建多個索引的,因此不做測試。
總結:在tidb中,ADD INDEX 操作目前不支持同時創建多個索引。
10、刪除一個列(此列是索引列):
Tidb:
MySQL:
在MySQL中,如果此列是索引列,也是可以直接刪除此列的。
總結:在tidb中,要刪除一個列,那么要先確認此列是否含有索引,如果不含索引,是可以直接刪除的。如果含有索引,此列是不能直接刪除。
11、刪除一個列,此列含有自增主鍵。
Tidb:
MySQL:
在MySQL中,是可以直接刪除主鍵列的。
總結:在tidb中,如果刪除的列含有主鍵,此列不能直接刪除。
12、添加復合索引。
Tidb:
MySQL:
實驗時間已超過1個小時,所以就停止了測試。
------------------------------------------------------------------------------------------------------------------------------
接下來我們測試在線DDL語句的影響。Tidb官方稱tidb是支持在線DDL的。而MySQL這里是使用5.7.24版本,mysql官方也聲明5.7版本開始支持了在線DDL。我們使用壓力測試來進行查看,測試數據為一個表:1000萬行的數據。開啟三個終端,分別負責:壓力測試、DDL語句、show processlist。
1、首先測試tidb的改表語句。
我們開啟兩個終端,一個終端負責壓力測試。另外一個終端負責修改建表語句。兩個終端都是操作同一個數據庫的同一張表。
在壓力測試端,使用oltp腳本測試,如下:
在建表語句端,修改一個字段的屬性:
我們看到這個結果還是比較可觀的。過程中基本沒有鎖表。而且壓力測試的數據值也沒有下降。
2、終端壓力測試oltp繼續進行。
另外一端添加字段。
接下來查看mysql進程:
發現tidb在處理上並沒有鎖表,因此正常業務情況下是可以進行在線DDL語句的。
3、刪除字段
一個終端繼續進行壓力測試
二終端進行刪除某列字段
三終端此時查看Mysql進程
4、刪除索引
一個終端繼續進行壓力測試
二終端進行刪除索引
三終端查看mysql進程狀態
5、創建索引
一個終端繼續進行壓力測試
從結果上看基本對壓力測試的結果影響不大,不過偶爾有如圖所示的qps和tps異常降低的現象出現,然后又恢復正常。
二終端進行創建索引
三終端查看進程狀態
從“lock”和“wait”關鍵字來看並沒有出現。
現在我們查看一下修改語句:
這個我只是截取了一部分內容,從這里看出來沒有鎖表現象的出現,說明在正常業務情況下進行DDL添加索引並不會出現鎖表現象。
下面這個是我測試時使用的腳本: