中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MYSQL的DDL該怎么理解及應用

發布時間:2022-01-04 10:40:48 來源:億速云 閱讀:152 作者:柒染 欄目:大數據

MYSQL的DDL該怎么理解及應用,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

DDL 操作一直是我們的 MYSQL 的一個軟肋,從MYSQL 5.6 其實相關的alter 語句已經有了改變,也就是題目的的inplace 和 copy 。其實很多人都知道,但用的比較少,因為有pt-OSC 工具呀,還有另外一個工具gh-ost。

維護現在有提起這串豆腐的原因就是MYSQL 8 發展的太快, pt 工具有點跟不上,根據官方的文檔,8.013后的版本,PT的部分工具就開始有的時候使用上會出現各種問題。

所以我們在mysql 的正根 alter 語句在高版本上還的拿出來用,而這里面就牽扯,什么時候 inplace 什么時候 copy 到底這都是什么鬼 ?MYSQL 的 DDL 好累心。

OK 下面就是一段官方+測試的東西 + MGR MYSQL 8.018

本次主要是針對字段的DDL 的 增刪改來進行的

MYSQL的DDL該怎么理解及應用

從上面的8.0 提供的表來看

MYSQL的DDL該怎么理解及應用

下面是mysql 5.7 提供的,可以很清晰的看出,的確死不一樣了,多了一列叫Instant

但實際上可以看出這個立即能做的事情不多,adding a column  ,setting a column default value , Dropping the column default value 這些才可以進行instant 但 最常用到的 adding a column也上面有一個* 號,這說明不可以都可以,是要有條件的。

條件:

1 要不你就添加字段,你要是混合使用alter table語句,那恕不進行instant的操作,例如一條語句又是加字段,又是刪字段

2 字段只能加到表最后一列,你要是想在之間加什么字段,恕不管用

3 表的row_format 不能是壓縮的 compressed 的格式

4  表里面有全文索引,no no no  不可以

5  臨時表不可以

6  數據字典表不可以

MYSQL的DDL該怎么理解及應用

添加字段還是蠻快的。下面我們在一個新表,并且一直插入數據的狀態下,看看添加字段還這么愜意嗎?

我們看看結果如何

DROP TABLE IF EXISTS test.test;

CREATE TABLE test.test(

id int(10) not null auto_increment,

name varchar(20) not null,

age smallint not null,

work_years smallint not null,

PRIMARY key (`id`)

)ENGINE INNODB DEFAULT CHARSET utf8 COMMENT 'test';

#清空數據

TRUNCATE table test.test;

*/

#定義存儲過程

delimiter //

DROP PROCEDURE IF EXISTS insert_test_val;

##num_limit 要插入數據的數量,rand_limit 最大隨機的數值

CREATE PROCEDURE insert_test_val()

BEGIN

DECLARE i int default 1;

DECLARE a varchar(20) ;

DECLARE b smallint ;

DECLARE c smallint ;

WHILE i<=1000000 do

set b = FLOOR(rand()*50);

set c = FLOOR(rand()*10);

if i mod 2 = 0 then

set a = 'peter';

elseif i mod 3 = 0 then

set a = 'jimmy';

elseif i mod 5 = 0 then

set a  = 'Tim';

elseif i mod 4 = 0 then

set a = 'semon';

else

set a = 'lisa';

end if;

if b < 20 then

set b = b + 15;

end if;

INSERT into test.test values (null,a,b,c);

set i = i + 1;

END WHILE;

END

//

#調用存儲過程

call insert_test_val();

我們在test 庫建立一個表,并且往里面插入大量的數據,然后我們

alter table test add column column1 varchar(500) ,ALGORITHM=INSTANT;

在這個表上添加一個字段,結果如何

SESSION 1

MYSQL的DDL該怎么理解及應用

SESSION 2

MYSQL的DDL該怎么理解及應用

字段瞬間添加上了,但是存儲過程在運行的途中直接報錯,通過上表的實驗證明 MYSQL 8 添加字段,不在是一個問題,PT 工具可以收手了。

當然這里添加的是一般的column如果你要添加自增的列,則就不可以這樣做,還是需要不能進行 DML 操作,類似鎖表的操作,好在MYSQL 里面添加自增序列的人不多,大多都是添加普通字段而已。

雖然可以瞬間將阻礙的DML 操作終止,并快速添加字段,但這在生產上來說對應用程序的某些事務性的操作時有害的,所以使用的時候,要小心,避免產生不愿意發生的“特殊情況”。instant 好處是只對數據字典中的元數據進行更改。在SE更改期間不需要獲取元數據鎖,也不涉及表的數據。這個更改也影響了LOCK=…語義。沒有必要為INSTANT algorihtm指定鎖。

任何不能立即完成的操作設置ALGORITHM=INSTANT,您將得到一個錯誤,如下所示。這里的思想是預先失敗并快速失敗,而不是進行無聲的轉換并在幕后切換到另一個算法。

所以這是要注意的。這個功能是由騰訊游戲的DBA 團隊提出的功能改進。

那這個更改對實際當中的意義在哪里

1 對于大型表,這可能需要很長時間,特別是在復制設置中。
2 磁盤空間需求將增加一倍以上,大致與現有表的大小相同。
3 DDL操作需要大量資源,對CPU、內存和IO的要求很高。這將從用戶事務中竊取資源。
4 如果涉及復制,用戶可能需要等待更長的時間才能準備好從服務器。DDL完成后將外部化

粗淺的說完alter table 的 instant 的問題, 下面的說說經常要添加索引的問題,在添加索引時是不能使用instant的功能的。目前在MYSQL 8 里面的最優的還是inplace的方。(在你無法使用工具的時候)

我們繼續,一個測試,我們往test表里面插入數據,同時在另一個線程添加索引。

session 1 

MYSQL的DDL該怎么理解及應用

session 2

MYSQL的DDL該怎么理解及應用

他大致的操作步驟

  • 新建frm臨時文件

  • 鎖原表,不許DML,可以查詢

  • 按聚集索引順序,查數據,找索引列數據,排序并插入到新的索引頁中

  • 原表不能讀操作,也就是原表此時不提供讀寫服務

  • 進行rename操作,替換frm文件,完成DDL過程


從上邊的圖可以看到,索引已經添加并且表中國的數據也一直在插入,并沒有產生什么看似不良的影響。(以上操作在MGR 集群中操作)

當然這不能說明,就不會有問題,生產系統的復雜性不是我們可以想象的,所以以上測試僅僅代表他能,但對非常繁忙的系統還是要小心。

而算法inplace——顧名思義,它修改表的模式,而不創建原始表的臨時表,而是修改原始表本身。在更改表模式(DDL)期間,它不會導致對原始表的讀寫鎖(數據操作語言)

算法copy——顧名思義,它改變了模式的現有表創建一個新的臨時表改變模式(在我們的例子中,添加一個新的列),遷移到新的臨時表的數據,改變了鏈接到新表,滴舊表,完成了。

使用ALGORITHM=COPY子句運行的ALTER TABLE操作可以防止并發的DML操作。仍然允許并發查詢。也就是說,表復制操作總是至少包含LOCK=SHARED(允許查詢,但不允許DML)的并發限制。您可以通過指定LOCK=EXCLUSIVE來進一步限制此類操作的并發性,這可以防止DML和查詢。

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

达尔| 贵溪市| 巴南区| 天长市| 五华县| 禹州市| 东宁县| 新干县| 敖汉旗| 黔东| 即墨市| 达拉特旗| 策勒县| 镇江市| 军事| 衡南县| 紫云| 四平市| 隆回县| 甘泉县| 南溪县| 镇原县| 台东市| 武城县| 鹤峰县| 武汉市| 灌云县| 扎赉特旗| 鞍山市| 东光县| 左云县| 紫阳县| 扎囊县| 新兴县| 遂平县| 滨海县| 时尚| 沈丘县| 闵行区| 吴忠市| 淳安县|