2019/4/7 11:21:33
mysql數據庫裏,對一個(gè)已創建的(de)表進行(xíng)DDL操作,比如(rú)說添加一個(gè)字段。在做測試時,發現ddl操作的(de)時間特别的(de)長。oracle裏,通常情況下隻是修改數據字典就可(kě)以了,操作時間非常的(de)短,阻塞DML的(de)時間也(yě)比較短。mysql數據庫對表進行(xíng)ddl操作跟oracle數據庫有(yǒu)很大(dà)的(de)不同,它先要把原表拷貝一份到(dào)臨時表,這期間不阻塞select,阻塞所有(yǒu)的(de)更改操作(update,delete,insert),對臨時表ddl操作完成,删除原表,重命名臨時表。
如(rú)果一張比較大(dà)的(de)表進行(xíng)ddl變更,比如(rú)說40G,那拷貝的(de)時間讓人(rén)無法忍受,并且阻塞所有(yǒu)的(de)DML操作,讓業(yè)務無法繼續。
以下是測試過程:
mysql> desc t1;
+--------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+-------+
| id | int(11) | YES | MUL | NULL | |
| nick | varchar(32) | YES | | NULL | |
| email | varchar(32) | YES | | NULL | |
| gmt_create | datetime | YES | | NULL | |
| gmt_modified | datetime | YES | | NULL | |
+--------------+-------------+------+-----+---------+-------+
mysql> select count(*) from t1;
+----------+
| count(*) |
+----------+
| 2228017 |
+----------+
1 row in set (1.78 sec)
現在對它進行(xíng)表結構變更,增加一列:
mysql>altertablet1add(telvarchar(20));
QueryOK,2304923rowsaffected(41.03sec)
Records:2304923Duplicates:0Warnings:0
在上(shàng)述表結構變更過程中,啓動另外一個(gè)會(huì)話(huà),進行(xíng)select查詢操作和(hé)一個(gè)更新操作:
mysql> select count(*) from t1;
+----------+
| count(*) |
+----------+
| 2304923 |
+----------+
1 row in set (2.10 sec)
mysql> select * from t1 limit 10;
+------+-------+------------------+---------------------+---------------------+
| id | nick | email | gmt_create | gmt_modified |
+------+-------+------------------+---------------------+---------------------+
| 0 | nick0 | nick0@taobao.com | 2008-03-14 00:00:00 | 2008-03-14 00:00:00 |
| 1 | nick1 | nick1@taobao.com | 2008-03-14 00:00:00 | 2008-03-14 00:00:00 |
| 2 | nick2 | nick2@taobao.com | 2008-03-14 00:00:00 | 2008-03-14 00:00:00 |
| 3 | nick3 | nick3@taobao.com | 2008-03-14 00:00:00 | 2008-03-14 00:00:00 |
| 4 | nick4 | nick4@taobao.com | 2008-03-14 00:00:00 | 2008-03-14 00:00:00 |
| 5 | nick5 | nick5@taobao.com | 2008-03-14 00:00:00 | 2008-03-14 00:00:00 |
| 6 | nick6 | nick6@taobao.com | 2008-03-14 00:00:00 | 2008-03-14 00:00:00 |
| 7 | nick7 | nick7@taobao.com | 2008-03-14 00:00:00 | 2008-03-14 00:00:00 |
| 8 | nick8 | nick8@taobao.com | 2008-03-14 00:00:00 | 2008-03-14 00:00:00 |
| 9 | nick9 | nick9@taobao.com | 2008-03-14 00:00:00 | 2008-03-14 00:00:00 |
+------+-------+------------------+---------------------+---------------------+
10 rows in set (0.00 sec)
mysql> update t1 set nick='test_nick' where id=1;
Query OK, 4 rows affected (43.89 sec) --這裏是阻塞的(de)時間
Rows matched: 4 Changed: 4 Warnings: 0
通過以上(shàng)實驗可(kě)以看出,對表進行(xíng)ddl操作時,mysql并不阻塞select查詢,但(dàn)會(huì)嚴重阻塞dml操作。另外,如(rú)果你(nǐ)要對表進行(xíng)ddl操作,由于有(yǒu)一個(gè)拷貝操作,你(nǐ)要計(jì)算好你(nǐ)的(de)可(kě)用(yòng)空間夠不夠?如(rú)果你(nǐ)的(de)系統經常要進行(xíng)表結構變更,那麽你(nǐ)将不得不要考慮此問題!
深圳市南山區南山街(jiē)道南海(hǎi)大(dà)道西(xī)桂廟路(lù)北陽光(guāng)華藝大(dà)廈1棟4F、4G-04
咨詢電話(huà):136 8237 6272
大(dà)客戶咨詢:139 0290 5075
業(yè)務QQ:195006118
技術(shù)QQ:179981967