Mysql資料庫複習(4)----儲存引擎,事務,索引,檢視和設計三正規化
寫在最前面:本博文如有錯誤,還望指出,謝謝
九、儲存引擎
1.完整的建表語句
例:
CREATE TABLE `login` (
`username` varchar(100) NOT NULL,
`password` varchar(100) NOT NULL,
`name` varchar(100) NOT NULL,
`tel` varchar(15) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
注意:在Mysql當中,凡是識別符號可以用飄號括起來的
建表的時候可以使用儲存引擎,也可以指定字符集。
預設採用的字符集是UTF8
2.什麼是儲存引擎?
儲存引擎這個名字只在mysql中存在,Oracle中有對應的機制,但不叫儲存引擎。Oracle中叫做“表的儲存方式”
MySQL支援很多儲存引擎,每一個儲存引擎都對應了一種不同的儲存方式
每一個儲存引擎都有自己的優缺點,需要在合適的時機選擇合適的儲存引擎
3.檢視當前MySQL支援的儲存引擎
show engines \G
mysql 8.0.19.0支援的儲存引擎有9個
*************************** 1. row *************************** Engine: MEMORY Support: YES Comment: Hash based, stored in memory, useful for temporary tables Transactions: NO XA: NO Savepoints: NO *************************** 2. row *************************** Engine: MRG_MYISAM Support: YES Comment: Collection of identical MyISAM tables Transactions: NO XA: NO Savepoints: NO *************************** 3. row *************************** Engine: CSV Support: YES Comment: CSV storage engine Transactions: NO XA: NO Savepoints: NO *************************** 4. row *************************** Engine: FEDERATED Support: NO Comment: Federated MySQL storage engine Transactions: NULL XA: NULL Savepoints: NULL *************************** 5. row *************************** Engine: PERFORMANCE_SCHEMA Support: YES Comment: Performance Schema Transactions: NO XA: NO Savepoints: NO *************************** 6. row *************************** Engine: MyISAM Support: YES Comment: MyISAM storage engine Transactions: NO XA: NO Savepoints: NO *************************** 7. row *************************** Engine: InnoDB Support: DEFAULT Comment: Supports transactions, row-level locking, and foreign keys Transactions: YES XA: YES Savepoints: YES *************************** 8. row *************************** Engine: BLACKHOLE Support: YES Comment: /dev/null storage engine (anything you write to it disappears) Transactions: NO XA: NO Savepoints: NO *************************** 9. row *************************** Engine: ARCHIVE Support: YES Comment: Archive storage engine Transactions: NO XA: NO Savepoints: NO
4.常見的儲存引擎?
1)MyISAM儲存引擎
這種儲存引擎不支援事務,MyISAM是MySQL最常用的儲存引擎
使用三個檔案表示每個表
a)儲存表結構的定義(mytable.frm)–格式檔案
b)儲存錶行的內容(mytable.MYD) --資料檔案
c)儲存表上的索引(mytable.MYI)—索引檔案
優點:可被壓縮,節省儲存空間。並且可以轉換為只讀表,提高檢索效率
缺點:不支援事務
2)InnoDB儲存引擎
InnoDB儲存引擎是MySQL預設的預設引擎
優點:支援事務,行級鎖,外來鍵等。這種儲存引擎資料的安全得到保障
表的結構儲存在xxx.frm檔案中
資料儲存在tablespace這樣的表空間中(邏輯概念),無法被壓縮,無法轉換成只讀。
InnoDB支援級聯刪除和級聯更新
3)MEMORY儲存引擎
缺點:不支援事務,資料容易丟失,因為所有資料和索引都存在記憶體當中的
優點:查詢速度最快
十、事務(transaction)
1.什麼是事務?
一個事務是一個完整的業務邏輯單元,不可再分
比如:銀行賬戶轉賬,從A賬戶向B賬戶轉賬1000元,需要執行兩條update語句,更新兩張表
update t_act set balance = balance – 1000 where actno = ‘001’;
update t_act set balance = balance + 1000 where actno = ‘002’;
以上兩條DML語句必須同時成功,或者同時失敗,不允許出現一條成功,一條失敗
要想保證以上兩條DML語句同時成功或者同時失敗,那麼就需要使用資料庫的事務機制
2.和事務相關的語句只有DML語句(insert delete update)
因為只有這三個語句是和資料庫表中的資料相關的
事務的存在是為了保證資料的完整性,安全性
3.一個業務通常需要多條DML語句完成,因此需要事務
4.事務的四大特性:ACID
A:原子性:事務是最小的工作單元,不可再分
C:一致性:事務必須保證多條DML語句同時成果或者同時失敗
I:隔離性:事務A與事務B之間具有隔離
D:永續性:最終資料必須持久化到硬碟檔案中,事務才算成功地結束
5.事務的隔離性
事務隔離性存在隔離級別,理論上隔離級別包括4個
第一級別:讀未提交(read uncommitted)
對方事務還未提交,我們當前事務可以讀取到對方未提交的資料
讀未提交存在髒讀(dirty read)現象:表示讀到了髒資料
第二級別:讀已提交(read committed)
對方事務提交之後的資料我方可以讀取到
這種隔離級別解決咯髒讀現象
存在的問題:不可重複讀
第三級別:可重複讀(repeatable read)
這種隔離級別解決了不可重複讀問題
存在問題:讀取到的資料不一定是真實的
第四級別:序列化/序列化讀
解決了所有問題,但效率低,需要事務排隊
Oracle資料庫預設的隔離級別是:讀已提交
MySQL資料庫預設的隔離級別是:可重複讀
6.演示事務
MySQL事務預設情況下是自動提交的,只要執行任意一天DML語句則提交一次
關閉自動提交的方法:start transaction;
設定事務的隔離級別為一級:set global transaction isolation level read uncommitted;
檢視事務的全域性隔離級別:select @@global.tx_isolation;
兩個sql語句:commit和rollback
十一、索引
1.什麼是索引?有什麼用?
索引就相當於一本書的目錄,通過目錄可以快速地找到對應的資源
在資料庫方面,查詢一張表的時候有兩種檢索方式
1)全表掃描
2)根據索引檢索(效率很高)
索引縮小了掃描的範圍
索引雖然可以提高檢索效率,但不能隨意地新增索引,因為索引也是資料庫當中的物件,也需要資料庫不斷的維護。是有維護成本的。比如表中的資料經常被修改這樣就不適合新增索引,因為資料一旦修改,索引需要排序,進行維護
新增索引是給某一個欄位,或者說某些欄位新增索引
select ename,sal from emp where ename = ‘ABC’;
當ename欄位上沒有新增索引的時候,以上sql語句會進行全表掃描,掃描ename欄位中所有的值
當ename欄位上新增索引的時候,以上sql語句會根據索引掃描,快速定位
2.怎麼建立索引物件?怎麼刪除索引物件?
create index 索引名稱 on 表名(欄位名);
drop index 索引名稱 on 表名;
3.什麼時候考慮給欄位新增索引?
1)資料量龐大
2)該欄位很少進行DML操作
3)該欄位經常出現在where子句中
4.注意:主鍵和具有unique約束的欄位自動會新增索引
因此根據主鍵查詢效率較高
5.檢視sql語句的執行計劃:使用explain
explain select ename from emp where sal = 5000;
給sal欄位新增索引
create index emp_sal_index on emp(sal);
6.索引底層採用的資料結構是:B Tree
7.索引的實現原理
通過B Tree縮小了掃描範圍,底層索引進行了排序,分割槽,索引會攜帶資料在表中的“實體地址”,最終通過索引檢索到資料之後,獲取到關聯的實體地址,通過實體地址定位表中的資料,效率是最高的
8.索引的分類?
單一索引:給單個欄位新增索引
複合索引:給多個欄位聯合起來新增1個索引
主鍵索引:主鍵上會自動新增索引
唯一索引:有unique約束的欄位上會自動新增索引
9.索引什麼時候失效?
模糊查詢的時候,第一個萬用字元使用的是%,這個時候索引會失效
比如:
select ename from emp where ename like '%A%';
十二、檢視
1.什麼是檢視?
站在不同的角度去看資料(同一張表的資料,通過不同的角度去看待)
2.怎麼建立檢視?怎麼刪除檢視?
create view myview as select empno,ename from emp;
drop view myview;
注意:只有DQL語句才能建立檢視物件
3.對檢視進行增刪改查,會影響到原表資料
通過檢視影響原表資料,不是直接操作原表
可以對檢視進行CRUD操作
4.面向檢視進行操作
update myview set ename = ‘aa’ where empno = 777;
delete from myview where ename = ‘aa’;
5.檢視的作用?
檢視可以隱藏表的實現細節。保密級別較高的系統,資料庫只對外提供相關的檢視,java程式設計師只對檢視物件進行CRUD。
十三、DBA命令
1.將資料庫中的資料匯出
在Windows的dos命令視窗中執行
匯出abc這整個資料庫
mysqldump abc>D:abc.sql -uroot -p111
2.匯入資料
create database abc;
use abc;
source D:\abc.sql;
十四、資料庫設計三正規化(重點)
1.什麼是設計正規化?
設計表的依據,按照三正規化設計的表不會出現資料冗餘
2.三正規化都是哪些?
第一正規化:任何一張表都應該有主鍵,並且每一個欄位原子性不可再分
第二正規化:在第一正規化的基礎之上,所有非主鍵欄位完全依賴主鍵,不能產生部份依賴
多對多?三張表兩個外來鍵
第三正規化:在第二正規化的基礎上,所有非主鍵欄位直接依賴主鍵,不能產生傳遞依賴
一對多?兩張表,多的表加外來鍵
注意:在實際開發中,為了滿足客戶的需求,有時候會拿冗餘換速度
3.表的經典設計方案
一對一設計
一對一設計有兩種方案
a)主鍵共享:使用者登陸表和使用者詳細資訊表的主鍵id是共享的
b)外來鍵唯一