05-表的操作
本節(jié)掌握
- 存儲(chǔ)引擎介紹(了解)
- 表的增刪改查
一、存儲(chǔ)引擎(了解)
前幾節(jié)我們知道m(xù)ysql中建立的庫(kù)===》文件夾,庫(kù)中的表====》文件
現(xiàn)實(shí)生活中我們用來(lái)存儲(chǔ)數(shù)據(jù)的文件有不同的類型,每種文件類型對(duì)應(yīng)各自不同的處理機(jī)制:比如處理文本用txt類型,處理表格用excel,處理圖片用png等
數(shù)據(jù)庫(kù)中的表也應(yīng)該有不同的類型,表的類型不同,會(huì)對(duì)應(yīng)mysql不同的存取機(jī)制,表類型又稱為存儲(chǔ)引擎。
ps: 存儲(chǔ)引擎說(shuō)白了就是如何存儲(chǔ)數(shù)據(jù)、如何為存儲(chǔ)的數(shù)據(jù)建立索引和如何更新、查詢數(shù)據(jù)等技術(shù)的實(shí)現(xiàn)方法。因?yàn)樵陉P(guān)系數(shù)據(jù)庫(kù)中數(shù)據(jù)的存儲(chǔ)是以表的形式存儲(chǔ)的,所以存儲(chǔ)引擎也可以稱為表類型(即存儲(chǔ)和操作此表的類型)
在Oracle 和SQL Server等數(shù)據(jù)庫(kù)中只有一種存儲(chǔ)引擎,所有數(shù)據(jù)存儲(chǔ)管理機(jī)制都是一樣的。而MySql
數(shù)據(jù)庫(kù)提供了多種存儲(chǔ)引擎。用戶可以根據(jù)不同的需求為數(shù)據(jù)表選擇不同的存儲(chǔ)引擎,用戶也可以根據(jù)
自己的需要編寫(xiě)自己的存儲(chǔ)引擎
SQL 解析器、SQL 優(yōu)化器、緩沖池、存儲(chǔ)引擎等組件在每個(gè)數(shù)據(jù)庫(kù)中都存在,但不是每 個(gè)數(shù)據(jù)庫(kù)都有這么多存儲(chǔ)引擎。MySQL 的插件式存儲(chǔ)引擎可以讓存儲(chǔ)引擎層的開(kāi)發(fā)人員設(shè) 計(jì)他們希望的存儲(chǔ)層,例如,有的應(yīng)用需要滿足事務(wù)的要求,有的應(yīng)用則不需要對(duì)事務(wù)有這 么強(qiáng)的要求 ;有的希望數(shù)據(jù)能持久存儲(chǔ),有的只希望放在內(nèi)存中,臨時(shí)并快速地提供對(duì)數(shù)據(jù) 的查詢。
?
二、mysql支持的存儲(chǔ)引擎
mysql> show engines\G;# 查看所有支持的引擎 mysql> show variables like 'storage_engine%'; # 查看正在使用的存儲(chǔ)引擎?
1、InnoDB 存儲(chǔ)引擎
支持事務(wù),其設(shè)計(jì)目標(biāo)主要面向聯(lián)機(jī)事務(wù)處理(OLTP)的應(yīng)用。其
特點(diǎn)是行鎖設(shè)計(jì)、支持外鍵,并支持類似 Oracle 的非鎖定讀,即默認(rèn)讀取操作不會(huì)產(chǎn)生鎖。 從 MySQL 5.5.8 版本開(kāi)始是默認(rèn)的存儲(chǔ)引擎。
InnoDB 存儲(chǔ)引擎將數(shù)據(jù)放在一個(gè)邏輯的表空間中,這個(gè)表空間就像黑盒一樣由 InnoDB 存儲(chǔ)引擎自身來(lái)管理。從 MySQL 4.1(包括 4.1)版本開(kāi)始,可以將每個(gè) InnoDB 存儲(chǔ)引擎的 表單獨(dú)存放到一個(gè)獨(dú)立的 ibd 文件中。此外,InnoDB 存儲(chǔ)引擎支持將裸設(shè)備(row disk)用 于建立其表空間。
InnoDB 通過(guò)使用多版本并發(fā)控制(MVCC)來(lái)獲得高并發(fā)性,并且實(shí)現(xiàn)了 SQL 標(biāo)準(zhǔn) 的 4 種隔離級(jí)別,默認(rèn)為 REPEATABLE 級(jí)別,同時(shí)使用一種稱為 netx-key locking 的策略來(lái) 避免幻讀(phantom)現(xiàn)象的產(chǎn)生。除此之外,InnoDB 存儲(chǔ)引擎還提供了插入緩沖(insert buffer)、二次寫(xiě)(double write)、自適應(yīng)哈希索引(adaptive hash index)、預(yù)讀(read ahead) 等高性能和高可用的功能。
對(duì)于表中數(shù)據(jù)的存儲(chǔ),InnoDB 存儲(chǔ)引擎采用了聚集(clustered)的方式,每張表都是按 主鍵的順序進(jìn)行存儲(chǔ)的,如果沒(méi)有顯式地在表定義時(shí)指定主鍵,InnoDB 存儲(chǔ)引擎會(huì)為每一 行生成一個(gè) 6 字節(jié)的 ROWID,并以此作為主鍵。
InnoDB 存儲(chǔ)引擎是 MySQL 數(shù)據(jù)庫(kù)最為常用的一種引擎,Facebook、Google、Yahoo 等 公司的成功應(yīng)用已經(jīng)證明了 InnoDB 存儲(chǔ)引擎具備高可用性、高性能以及高可擴(kuò)展性。對(duì)其 底層實(shí)現(xiàn)的掌握和理解也需要時(shí)間和技術(shù)的積累。如果想深入了解 InnoDB 存儲(chǔ)引擎的工作 原理、實(shí)現(xiàn)和應(yīng)用,可以參考《MySQL 技術(shù)內(nèi)幕:InnoDB 存儲(chǔ)引擎》一書(shū)。
2、MyISAM 存儲(chǔ)引擎
不支持事務(wù)、表鎖設(shè)計(jì)、支持全文索引,主要面向一些 OLAP 數(shù) 據(jù)庫(kù)應(yīng)用,在 MySQL 5.5.8 版本之前是默認(rèn)的存儲(chǔ)引擎(除 Windows 版本外)。數(shù)據(jù)庫(kù)系統(tǒng) 與文件系統(tǒng)一個(gè)很大的不同在于對(duì)事務(wù)的支持,MyISAM 存儲(chǔ)引擎是不支持事務(wù)的。究其根 本,這也并不難理解。用戶在所有的應(yīng)用中是否都需要事務(wù)呢?在數(shù)據(jù)倉(cāng)庫(kù)中,如果沒(méi)有 ETL 這些操作,只是簡(jiǎn)單地通過(guò)報(bào)表查詢還需要事務(wù)的支持嗎?此外,MyISAM 存儲(chǔ)引擎的 另一個(gè)與眾不同的地方是,它的緩沖池只緩存(cache)索引文件,而不緩存數(shù)據(jù)文件,這與 大多數(shù)的數(shù)據(jù)庫(kù)都不相同。
3、NDB 存儲(chǔ)引擎
年,MySQL AB 公司從 Sony Ericsson 公司收購(gòu)了 NDB 存儲(chǔ)引擎。 NDB 存儲(chǔ)引擎是一個(gè)集群存儲(chǔ)引擎,類似于 Oracle 的 RAC 集群,不過(guò)與 Oracle RAC 的 share everything 結(jié)構(gòu)不同的是,其結(jié)構(gòu)是 share nothing 的集群架構(gòu),因此能提供更高級(jí)別的 高可用性。NDB 存儲(chǔ)引擎的特點(diǎn)是數(shù)據(jù)全部放在內(nèi)存中(從 5.1 版本開(kāi)始,可以將非索引數(shù) 據(jù)放在磁盤上),因此主鍵查找(primary key lookups)的速度極快,并且能夠在線添加 NDB 數(shù)據(jù)存儲(chǔ)節(jié)點(diǎn)(data node)以便線性地提高數(shù)據(jù)庫(kù)性能。由此可見(jiàn),NDB 存儲(chǔ)引擎是高可用、 高性能、高可擴(kuò)展性的數(shù)據(jù)庫(kù)集群系統(tǒng),其面向的也是 OLTP 的數(shù)據(jù)庫(kù)應(yīng)用類型。
4、Memory 存儲(chǔ)引擎
正如其名,Memory 存儲(chǔ)引擎中的數(shù)據(jù)都存放在內(nèi)存中,數(shù)據(jù)庫(kù)重 啟或發(fā)生崩潰,表中的數(shù)據(jù)都將消失。它非常適合于存儲(chǔ) OLTP 數(shù)據(jù)庫(kù)應(yīng)用中臨時(shí)數(shù)據(jù)的臨時(shí)表,也可以作為 OLAP 數(shù)據(jù)庫(kù)應(yīng)用中數(shù)據(jù)倉(cāng)庫(kù)的維度表。Memory 存儲(chǔ)引擎默認(rèn)使用哈希 索引,而不是通常熟悉的 B+ 樹(shù)索引。
5、Infobright 存儲(chǔ)引擎
第三方的存儲(chǔ)引擎。其特點(diǎn)是存儲(chǔ)是按照列而非行的,因此非常 適合 OLAP 的數(shù)據(jù)庫(kù)應(yīng)用。其官方網(wǎng)站是?http://www.infobright.org/,上面有不少成功的數(shù)據(jù)?倉(cāng)庫(kù)案例可供分析。
6、NTSE 存儲(chǔ)引擎
網(wǎng)易公司開(kāi)發(fā)的面向其內(nèi)部使用的存儲(chǔ)引擎。目前的版本不支持事務(wù), 但提供壓縮、行級(jí)緩存等特性,不久的將來(lái)會(huì)實(shí)現(xiàn)面向內(nèi)存的事務(wù)支持。
7、BLACKHOLE
黑洞存儲(chǔ)引擎,可以應(yīng)用于主備復(fù)制中的分發(fā)主庫(kù)。
MySQL 數(shù)據(jù)庫(kù)還有很多其他存儲(chǔ)引擎,上述只是列舉了最為常用的一些引擎。如果 你喜歡,完全可以編寫(xiě)專屬于自己的引擎,這就是開(kāi)源賦予我們的能力,也是開(kāi)源的魅 力所在。
?
指定表類型/存儲(chǔ)引擎
create table t1(id int)engine=innodb;# 默認(rèn)不寫(xiě)就是innodb?
小練習(xí):
創(chuàng)建四張表,分別使用innodb,myisam,memory,blackhole存儲(chǔ)引擎,進(jìn)行插入數(shù)據(jù)測(cè)試?
create table t1(id int)engine=innodb; create table t2(id int)engine=myisam; create table t3(id int)engine=memory; create table t4(id int)engine=blackhole;查看data文件下db1數(shù)據(jù)庫(kù)中的文件:
#.frm是存儲(chǔ)數(shù)據(jù)表的框架結(jié)構(gòu)# .ibd是mysql數(shù)據(jù)文件 #.MYD是MyISAM表的數(shù)據(jù)文件的擴(kuò)展名#.MYI是MyISAM表的索引的擴(kuò)展名#發(fā)現(xiàn)后兩種存儲(chǔ)引擎只有表結(jié)構(gòu),無(wú)數(shù)據(jù)#memory,在重啟mysql或者重啟機(jī)器后,表內(nèi)數(shù)據(jù)清空 #blackhole,往表內(nèi)插入任何數(shù)據(jù),都相當(dāng)于丟入黑洞,表內(nèi)永遠(yuǎn)不存記錄?
三、表介紹
表相當(dāng)于文件,表中的一條記錄就相當(dāng)于文件的一行內(nèi)容,不同的是,表中的一條記錄有對(duì)應(yīng)的標(biāo)題,稱為表的字段
id,name,sex,age,birth稱為字段,其余的,一行內(nèi)容稱為一條記錄
?
四、創(chuàng)建表
語(yǔ)法:
create table 表名( 字段名1 類型[(寬度) 約束條件], 字段名2 類型[(寬度) 約束條件], 字段名3 類型[(寬度) 約束條件] );#注意: 1. 在同一張表中,字段名是不能相同 2. 寬度和約束條件可選 3. 字段名和類型是必須的
1.創(chuàng)建數(shù)據(jù)庫(kù)
2.使用數(shù)據(jù)庫(kù)
3.創(chuàng)建a1表
4.插入表的記錄
insert into a1 values (1,'mjj',18), (2,'wusir',28);ps:以;作為mysql的結(jié)束語(yǔ)
5.查詢表的數(shù)據(jù)和結(jié)構(gòu)
(1)查詢a1表中的存儲(chǔ)數(shù)據(jù)
mysql>?select * from a1;
+------+-------+------+
| id | name | age |
+------+-------+------+
| 1 | mjj? ?| 18? |
| 2 | wusir | 28? |
+------+-------+------+
2 rows in set (0.02 sec)
mysql>
?
(2)查看a1表的結(jié)構(gòu)
mysql> desc a1; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | name | varchar(50) | YES | | NULL | | | age | int(3) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 3 rows in set (0.16 sec)(3)查看表的詳細(xì)結(jié)構(gòu)
mysql> show create table a1\G; *************************** 1. row ***************************Table: a1 Create Table: CREATE TABLE `a1` (`id` int(11) DEFAULT NULL,`name` varchar(50) DEFAULT NULL,`age` int(3) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 1 row in set (0.00 sec)6.復(fù)制表
(1)新創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)db3
mysql> create database db3 charset utf8; Query OK, 1 row affected (0.00 sec)(2)使用db3
mysql> use db3; Database changed #這是上個(gè)創(chuàng)建的db2數(shù)據(jù)庫(kù)中的a1表 mysql> select * from db2.a1; +------+-------+------+ | id | name | age | +------+-------+------+ | 1 | mjj | 18 | | 2 | wusir | 28 | +------+-------+------+(3)復(fù)制db2.a1的表結(jié)構(gòu)和記錄
# 這就是復(fù)制表的操作(既復(fù)制了表結(jié)構(gòu),又復(fù)制了記錄) mysql> create table b1 select * from db2.a1; Query OK, 2 rows affected (0.03 sec)(4)查看db3.b1中的數(shù)據(jù)和表結(jié)構(gòu)
#再去查看db3文件夾下的b1表發(fā)現(xiàn) 跟db2文件下的a1表數(shù)據(jù)一樣 mysql> select * from db3.b1; +------+-------+------+ | id | name | age | +------+-------+------+ | 1 | mjj | 18 | | 2 | wusir | 28 | +------+-------+------+ 2 rows in set (0.00 sec)?
ps1:如果只要表結(jié)構(gòu),不要記錄
#在db2數(shù)據(jù)庫(kù)下新創(chuàng)建一個(gè)b2表,給一個(gè)where條件,條件要求不成立,條件為false,只拷貝表結(jié)構(gòu) mysql> create table b2 select * from db2.a1 where 1>5; Query OK, 0 rows affected (0.05 sec) Records: 0 Duplicates: 0 Warnings: 0查看表結(jié)構(gòu):
# 查看表結(jié)構(gòu) mysql> desc b2; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | name | varchar(50) | YES | | NULL | | | age | int(3) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 3 rows in set (0.02 sec)#查看表結(jié)構(gòu)中的數(shù)據(jù),發(fā)現(xiàn)是空數(shù)據(jù) mysql> select * from b2; Empty set (0.00 sec)?
ps2:還有一種做法,使用like(只拷貝表結(jié)構(gòu),不拷貝記錄)
mysql> create table b3 like db2.a1; Query OK, 0 rows affected (0.01 sec)mysql> desc b3; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | name | varchar(50) | YES | | NULL | | | age | int(3) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 3 rows in set (0.02 sec)mysql> select * from db3.b3; Empty set (0.00 sec)?
7.刪除表:
drop table 表名;?
轉(zhuǎn)載于:https://www.cnblogs.com/yanyufeng/p/9567158.html
總結(jié)
- 上一篇: SpringBoot中使用AOP打印接口
- 下一篇: lg4820 书堆