1.DDL(Data Definition Language):數據定義語言,用來定義數據庫對象,庫、表、列等;創(chuàng)建、刪除、修改:庫,表結構;
成都創(chuàng)新互聯公司-專業(yè)網站定制、快速模板網站建設、高性價比沽源網站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式沽源網站制作公司更省心,省錢,快速模板網站建設找我們,業(yè)務覆蓋沽源地區(qū)。費用合理售后完善,10余年實體公司更值得信賴。
2.DML(Data Manipulation Language):數據操作語言,用來定義數據庫記錄(數據);增、刪、改:表記錄
3.DCL(Data Control Language):數據控制語言,用來定義訪問權限和安全級別
4.DQL(Data Query Language):數據查詢語言,用來查詢記錄(數據)
DDL之操作數據庫
創(chuàng)建數據庫:
create database mydb1;
1
1
刪除數據庫:
drop database mysql;
1
1
數據類型(列類型)
int :整型
double :浮點型,例如double(5,2)表示最多5位,其中必須有兩位小數。即最大值為999.99
decimal:浮點型,在表單錢方面使用該類型,因為不會出現精度缺失問題
char:固定長度字符串類型 char(255),數據最長為255,數據的長度不足指定長度,補足到指定長度
varchar: 可變字符串類型,varchar(65535),不補
text(club):字符串類型(mysql獨有)
tinytext小
text:
mediumtext:中
longtext:大
blob:字節(jié)型
data:日期類型:格式為yyyy-MM-dd;
time:時間類型:格式為hh:mm:ss
timestamp:時間戳類型,既有日期,又有時間
DDL之操作表
創(chuàng)建表:
create table student(
- sno char(5),
- sname varchar(10),
- sage int
- ),
1
2
3
4
5
1
2
3
4
5
查詢表結構
desc student;
1
1
刪除表:
drop table student;
1
1
表中增加列:
alter table student
- add(
- educadtion varchar(50)
- );
1
2
3
4
1
2
3
4
表中修改列屬性:
alter table student
- modify sage varchar(20);
1
2
1
2
表中刪除列:
alter table student
- drop sage;
1
2
1
2
表的重命名:
mysql alter table student
- rename to ss;
實際測試中add primary key 和修改字段類型是需要copy tmp table的并且阻塞dml操作,另外在5.6.17版本之前時候用alter table table_name engine=innodb 是需要 copy table的并且也阻塞dml。
本來打算翻譯成中文,后來發(fā)現這些英文實在是太簡單了,就直接貼出來吧。
請看下圖:
MySQL8.0 開始支持原? DDL(atomic DDL),數據字典的更新,存儲引擎操作,寫?進制日志結合成了一個事務。在沒有原?DDL之前,DROP TABLE test1,test2;如遇到server crash,可能會有test1被drop了,test2沒有被drop掉。下面來看下在MySQL8.0之前和MySQL8.0 數據字典的區(qū)別
在MySQL8.0 之前,Data Dictionary除了存在與.FRM, .TRG, .OPT ?件外,還存在于系統(tǒng)表中(MyISAM ?事務引擎表中),在MySQL8.0 ,Data Dictionary 全部存在于Data Dictionary Storage Engine(即 InnoDB表中),這使crash recovery 維持原?性成為了可能
存儲引擎?持
目前,只有InnoDB存儲引擎?持原子DDL,為了實現原子DDL,Innodb要寫DDL logs 到 mysql.innodb_ddl_log 表,這是?個隱藏在mysql.ibd 數據字典表空間?的數據字典表。要看mysql.innodb_ddl_log 中的內容,需要
SET GLOBAL?LOG_ERROR_VERBOSITY=3;(MySQL 8.0 默認為2,error log 記錄Errors and
warnings,不不記錄notes)
SET GLOBAL innodb_print_ddl_logs=1;
CREATE TABLE?t1 (c1 INT)?ENGINE?=?InnoDB;
查看error log
[Note] [MY-011066] InnoDB: DDL log?insert?: [DDL?record:?DELETE SPACE,?id=30,
thread_id=25, space_id=9, old_file_path=./test/t1.ibd]
[Note] [MY-011066]?InnoDB:?DDL log?delete?:?by id?30
[Note] [MY-011066]?InnoDB:?DDL log?insert?: [DDL?record: REMOVE?CACHE,?id=31,
thread_id=25, table_id=1066, new_file_path=test/t1]
[Note] [MY-011066]?InnoDB:?DDL log?delete?:?by id?31
[Note] [MY-011066]?InnoDB:?DDL log?insert?: [DDL?record: FREE,?id=32, thread_
id=25, space_id=9, index_id=143, page_no=4]
[Note] [MY-011066]?InnoDB:?DDL log delete?:?by id?32
[Note] [MY-011066]?InnoDB:?DDL log?post ddl :?begin for thread id?: 25
[Note] [MY-011066]?InnoDB:?DDL log?post ddl :?end for thread id?: 25
原子DDL 操作步驟
準備:創(chuàng)建所需的對象并將DDL?志寫入 mysql.innodb_ddl_log表中。DDL日志定義了如何前滾和回滾DDL操作。
執(zhí)行:執(zhí)?DDL操作。例如,為CREATE TABLE操作執(zhí)?創(chuàng)建。
提交:更新數據字典并提交數據字典事務。
Post-DDL:重播并從mysql.innodb_ddl_log表格中刪除DDL?志。為確?;貪L可以安全執(zhí)??不引?不?致性,在此最后階段執(zhí)??件操作(如重命名或刪除數據文件)。這一階段還從 mysql.innodb_dynamic_metadata的數據字典表刪除的動態(tài)元數據為了DROP TABLE,TRUNCATE和其它重建表的DDL操作。
?論事務是提交還是回滾,DDL日志都會mysql.innodb_ddl_log在Post-DDL階段重播并從表中刪除 。mysql.innodb_ddl_log如果服務器在DDL操作期間暫停,DDL?志應該只保留在表中。在這種情況下,DDL?志會在恢復后重播并刪除。
在恢復情況下,當服務器重新啟動時,可能會提交或回退DDL事務。如果在重做?志和?進制日志中存在DDL操作的提交階段期間執(zhí)?的數據字典事務,則該操作被認為是成功的并且被前滾。否則,在InnoDB重放數據字典重做日志時回滾不完整的數據字典事務 ,并且回滾DDL事務。
原?DDL ?持類型
? DROP TABLES , all tables dropped or none
? DROP SCHEMA, all entities in the schema are dropped, or none
? Note that atomic DDL statements will be rolled back or committed even in case of crash, e.g. RENAME TABLES
? CREATE TABLE would be successfully committed or rolled back (no orphan ibd left)
? TRUNCATE TABLE (including InnoDB tables with FTS AUX tables) would be successfully committed or rolled back
? RENAME TABLES, all or none
? ALTER TABLE successful or not done
示例
請點擊輸入圖片描述
請點擊輸入圖片描述
結論
在MySQL8.0之前,alter table 操作在server crash的情況下,會遺留.frm,.ibd文件。MySQL8.0 能實現原?DDL(包括 DROP TABLE, DROP SCHEMA, CREATE TABLE, TRUNCATE TABLE, ALTER TABLE),alter table 操作,在server crash的情況下,不會遺留.frm,.ibd臨時文件。讓我們?起期待MySQL8.0 GA的到來吧!
隨著 MySQL 版本的不斷更新,對 DDL 操作的支持也在不斷的完善和更新:比如從 MySQL 5.6 引入 Online DDL ,在 MySQL 5.7 對 Online DDL 進一步完善,到現在的 8.0 版本,則對 DDL 的實現重新進行了設計,比如 DDL 操作支持原子特性,在 MySQL 8.0.27 引入并行 DDL 。本篇就來探究一下 MySQL 8.0.27 的并行 DDL 對于 DDL 操作速度的提升。
MySQL 8.0.14 引入了 innodb_parallel_read_threads 變量來控制掃描聚簇索引的并行線程。MySQL 8.0.27 引入了 innodb_ddl_threads 變量來控制用于創(chuàng)建二級索引時的并行線程數量,此參數一般和一并引入的 innodb_ddl_buffer_size 一起使用,innodb_ddl_buffer_size 用于指定進行并行 DDL 操作時能夠使用的 buffer 大小,buffer 是在所有的 DDL 并行線程中平均分配的,所以一般如果調大 innodb_ddl_threads 變量時,也需要調大 innodb_ddl_buffer_size 的大小。
innodb_ddl_threads 、innodb_ddl_buffer_size 和 innodb_parallel_read_threads 的默認大小分別為:
接下來測試一下調大 innodb_ddl_threads 、innodb_ddl_buffer_size 和 innodb_parallel_read_threads 參數值對 DDL 操作的性能提升。
首先創(chuàng)建一張 5000 萬的表:
分別測試不同的線程數量和緩沖區(qū)大小的 DDL 操作時間,例如:
通過不斷調整相關參數得到以下結果:
可以看到,隨著并發(fā)線程的增多和 buffer 的增加,DDL 操作所占用的資源也越多,而 DDL 操作所花費的時間則越少。不過通過對比資源的消耗和 DDL 速度的提升比例,最合理的并行線程數量為4-8個,而 buffer 大小可以根據情況進行調整。
參考鏈接:
網站名稱:mysql怎么創(chuàng)建ddl mysql怎么創(chuàng)建myini
新聞來源:http://muchs.cn/article0/doshgoo.html
成都網站建設公司_創(chuàng)新互聯,為您提供標簽優(yōu)化、全網營銷推廣、用戶體驗、響應式網站、網站維護、網站排名
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯