1. 程式人生 > 資料庫 >Mysql資料庫複習(4)----儲存引擎,事務,索引,檢視和設計三正規化

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當中,凡是識別符號可以用飄號括起來的
建表的時候可以使用儲存引擎,也可以指定字符集。

MySQL預設使用的儲存引擎是InnoDB方式
預設採用的字符集是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這樣的表空間中(邏輯概念),無法被壓縮,無法轉換成只讀。

這種儲存引擎在MySQL資料庫崩潰之後提供自動恢復
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)外來鍵唯一

本筆記網課來源