表相關操作
目錄
一:儲存引擎介紹
1:什麼是儲存引擎?
儲存引擎就是表的型別,針對不同型別的表,mysql使用不同的程式碼處理
現實生活中我們用來儲存資料的檔案有不同的型別,每種檔案型別對應各自不同的處理機制:比如處理文字用txt型別,處理表格用excel,處理圖片用png等 資料庫中的表也應該有不同的型別,表的型別不同,會對應mysql不同的存取機制,表型別又稱為儲存引擎。 儲存引擎說白了就是如何儲存資料、如何為儲存的資料建立索引和如何更新、查詢資料等技術的實現方 法。因為在關係資料庫中資料的儲存是以表的形式儲存的,所以儲存引擎也可以稱為表型別(即儲存和 操作此表的型別)
擴充套件
在Oracle 和SQL Server等資料庫中只有一種儲存引擎,所有資料儲存管理機制都是一樣的。而MySql 資料庫提供了多種儲存引擎。使用者可以根據不同的需求為資料表選擇不同的儲存引擎,使用者也可以根據 自己的需要編寫自己的儲存引擎 SQL 解析器、SQL 優化器、緩衝池、儲存引擎等元件在每個資料庫中都存在,但不是每 個數據庫都有這麼多儲存引擎。MySQL 的外掛式儲存引擎可以讓儲存引擎層的開發人員設 計他們希望的儲存層,例如,有的應用需要滿足事務的要求,有的應用則不需要對事務有這 麼強的要求 ;有的希望資料能持久儲存,有的只希望放在記憶體中,臨時並快速地提供對資料 的查詢。
2:mysql四種主要的儲存引擎介紹
-
InnoDB
使用版本: MySQL5.5版本及之後預設的儲存引擎 優點: 支援事務, 行級鎖定和外來鍵約束對資料的安全性較 半個缺點: 訪問速度沒有MyISAM快, 但是我們更加註重的是資料的安全. 每個InnoDB在磁碟上儲存成2個檔案,其中檔名和表名都相同,但是副檔名分別為: .frm(儲存表結構) .idb(i -> index. 索引+資料組織表)
-
MyISAM
使用版本: MySQL5.5版本之前預設的儲存引擎 優點: 訪問速度要比Innodb更快 缺點: 不支援事務,也不支援外來鍵, 對事務完整性沒有要求, 資料的安全性沒有Innodb高. 每個MyISAM在磁碟上儲存成3個檔案,其中檔名和表名都相同,但是副檔名分別為: .frm(儲存表結構) .MYD(MyData,儲存資料) .MYI(MyIndex,儲存索引)
-
MEMORY
優點: 採用記憶體儲存, 訪問資料可以得到最快的響應. 缺點: 斷電資料丟失. 或當mysqld守護程序崩潰時,所有的Memory資料也會丟失. 每個MEMORY在磁碟上儲存成1個檔案,其中檔名和表名都相同,但是副檔名分別為: .frm(儲存表結構)
-
BLACKHOLE
特點: 無論存什麼,都立刻消失(黑洞). 類似於回收站 每個BLACKHOLE在磁碟上儲存成1個檔案,其中檔名和表名都相同,但是副檔名分別為: .frm(儲存表結構)
總結
1: InnoDB支援事務,MyISAM 不支援,這一點是非常之重要。事務是一種高階的處理方式,如在一些列增刪改中只要 哪個出錯還可以回滾還原,而MyISAM就不可以了.
2:MyISAM適合查詢以及插入為主的應用,InnoDB 適合頻繁修改以及涉及到安全性較高的應用.
3:InnoDB支援外來鍵,MyISAM 不支援
4:InnoDB中不儲存表的行數, InnoDB需要掃描一遍整個表來計算有多少行. MyISAM只要簡單的讀出儲存好的行數即可。注意的是,當count()語句包含where條件時MyISAM也需要掃描整個表;
5:對於自增長的欄位,InnoDB 中必須包含只有該欄位的索引,但是在MyISAM表中可以和其他欄位一起建立聯合索引;
6:清空整個表時,InnoDB 是一行一行的刪除,效率非常慢。MyISAM 則會重建表;
7:InnoDB支援行鎖(注意: 某些情況下還是鎖整表)
3:驗證不同的儲存引擎
指定不同儲存引擎進行插入資料測試
檢視所有的支援的儲存引擎
show engines;
常看正在使用的儲存引擎
# storage儲存 儲存 保管
show variables like '%storage_engine%'
建立不同的表指定不同的儲存引擎
create database test;
use test;
create table innodb_t1(id int) engine=innodb;
create table myisam_t1(id int) engine=myisam;
create table memory_t1(id int) engine=memory;
create table blackhole_t1(id int) engine=blackhole;
插入資料
insert into innodb_t1 values(1);
insert into myisam_t1 values(1);
insert into memory_t1 values(1);
insert into blackhole_t1 values(1)
檢視
select * from innodb_t1
select * from myisam_t1
select * from memory_t1
select * from blackhole_t1
結果
mysql> select * from innodb_t1;
+------+
| id |
+------+
| 1 |
+------+
1 row in set (0.07 sec)
mysql> select * from myisam_t1;
+------+
| id |
+------+
| 1 |
+------+
1 row in set (0.07 sec)
mysql> select * from memory_t1;
+------+
| id |
+------+
| 1 |
+------+
1 row in set (0.06 sec)
mysql> select * from blackhole_t1;
Empty set (0.07 sec)
重啟測試
net stop mysql & net start mysql
mysql> select * from memory_t1;
Empty set (0.08 sec)
二:表介紹
表相當於檔案,表中的一條記錄就相當於檔案的一行內容,不用的是,表中的一條記錄有對應的標題,稱為表的欄位
id,name,age,sex稱為欄位,其餘,一行內容稱為一條記錄
三:建立表的完整語法
# 語法
create table 表名(
欄位名1 型別(寬度) 約束條件,
欄位名2 型別(寬度) 約束條件,
欄位名3 型別(寬度) 約束條件,
)
注意
-
同一張表中欄位名不能重複
-
寬度和約束條件是可選的(可有可無)而欄位名和欄位型別是必須的
約束條件寫的話,可以支援多個,欄位名1 型別(寬度) 約束條件1 約束條件2....,
-
最後一行指定不能有逗號
create table t( id int, name char, # -->出錯了 );
警告
-
char不指定寬度,預設寬度為1
create table t1(name char); insert into t1 values('json')
-
關鍵字null沒有寬度限制
insert into t1 values(null);
-
針對不同的版本會出現不同的問題
- 5.6版本預設沒有開啟嚴格模式 規定只能存一個字元你給了多個字元,那麼會自動幫你擷取.
- 5.7版本及以上或者開啟了嚴格模式 那麼規定只能存幾個 就不能超,一旦超出範圍立刻報錯(Data too long for column 'name' at row 1.)
-
嚴格模式開不開?
mysql5.7之後的版本預設都是開啟嚴格模式的
使用資料庫準則
- 能儘量少的讓資料庫幹活就儘量少 不要給資料庫增加額外的壓力.
- 因為沒有開啟嚴格模式, 當遇到寬度超出時, 會進行額外的擷取操作這種操作就會給資料庫增加額外的壓力. 換個角度來說, 本來資料的儲存就不因該超出限制範圍.
-
總結
寬度是用來限制資料的儲存
約束條件是在寬度的基礎之上增加額外的約束
四:資料庫的三種模式指定
variables /'vɛrɪəbl/ 變數
session /ˈseʃn/ 會 話
trans /trænz 反式
pad /pæd/ 填補
substitution /ˌsʌbstɪˈtuːʃn/ 替代 換人 換船
strict trans tables 嚴格的反式表
no engine substitution 沒有引擎提交
pad char to full length 填補字元到全長度'
檢視當前模式的
一:方式一
大範圍查詢 variables + 模糊匹配
show variables like "%mode%";
# like 模糊匹配關鍵字
# % 匹配任意多個字元
# _ 匹配任意單個字元
二:方式二
select @@sql_mode;
修改模式
注意!!: 這種修改是替換操作, 如果想保留原來得模式並增添新得模式需要使用逗號隔開. 示例: 'strict_trans_tables,no_engine_substitution'
方式
set global sql_mode = 'STRICT_TRANS_TABLES';
set session # 只在當前視窗有效
set golbal # 全域性有效
# 注意修改完之後,需要重新登入服務端
五:資料型別
六:表完整性約束
七:修改表alter table 瞭解
注意:一下所有的約束條件可以指定多個
修改表名
alter table 表名 rename 新的表名;
增加欄位
alter table 表名 add 欄位名 欄位型別(寬度) 約束條件;
alter table 表名 add 欄位名 欄位型別(寬度) 約束條件 first;
alter table 表名 add 欄位名 欄位型別(寬度) 約束條件 after 欄位名;
刪除欄位
alter table 表名 drop 欄位名;
修改欄位
alter table 表名 modify 欄位名 欄位型別(寬度) 約束條件;
alter table 表名 change 舊欄位名 新欄位名 欄位型別(寬度) 約束條件;
八:複製表
注意:
複製不包含的key. 主鍵key, 外來鍵key, 索引key
如果通過where篩選的舊錶中沒有資料, 會生成一張空的表.
create table 新表名 select * from 就表名;
create table 新表名 select * from 舊錶名 where id 1 != 1;
九:刪除表
drop table 表名;
十:總結
# mysql四種儲存引擎: InnoDB, MyISAM, MEMORY, BLACKHOLE
"""
InnoDB: 支援事務, 外來鍵與約束, 行鎖, 資料安全, 訪問速度沒有MyISAM快. 5.5版本後
建立一個該模式的表生成2個檔案. 字尾名: .frm, .idb
MyISAM: 不支援事務, 外來鍵與約束, 行鎖, 資料不太安全, 只是訪問問資料快於InnoDB. 5.5版本前
建立一個該模式的表生成3個檔案. 字尾名: .frm, .MYD, .MYI
MEMORY: 記憶體
建立一個該模式的表生成1個檔案. 字尾名: .frm
BLACKHOLE: 垃圾回收站
建立一個該模式的表生成1個檔案. 字尾名: .frm
"""
# 瞭解3種模式
"""
普通模式: no_engine_substitution
嚴格模式: strict_trans_tables
取消剔除char空格模式: pad_char_to_full_length
注意: 模式的的修該方式是替換.
檢視模式2種方式:
show variable like '%mode';
select @@sql_mode;
修改模式的2種方式:
set session sql_mode=模式;
set global sql_mode=模式;