帶你走進MySQL數據庫(MySQL入門詳細總結三)

導讀:關於MySQL,用三篇文章帶你進入MySQL的世界。文章較長,建議收藏再看!

帶你走進MySQL數據庫(MySQL入門詳細總結二)

帶你走進MySQL數據庫(MySQL入門詳細總結一)


在這裏插入圖片描述

1.存儲引擎

不同的引擎,表具有不同的存儲方式。
建表的時候可以指定存儲引擎,也可以指定字符集。
mysql默認使用的存儲引擎是InnoDB方式。
默認採用的字符集是UTF8

1.什麼是存儲引擎
每一個存儲引擎都對應一種不同的存儲方式。

2.查看當前mysql支持的存儲引擎。
show engines \G

3.常見的存儲引擎:
MySIAM這種存儲引擎不支持事務。
比較常用。
他管理表具有以下特徵:

  • 1.使用三個文件表示每個表:
    格式文件----存儲表結構的定義(mytable.frm) 格式
    數據文件----存儲錶行的內容(mytable.MYD) 數據
    索引文件—存儲表上的索引(mytable.MYI) 索引
    2.靈活的AUTD_INCREMENT
    3.可被壓縮、可轉換爲只讀表,節省空間

缺點:不支持事務。

InnoDB引擎
優點:支持事務,行級鎖,外鍵,級聯刪除和級聯更新等。這種引擎數據最安全。
數據存儲在tabalespace這樣的表空間中(邏輯概念),無法被壓縮,無法轉換成只讀。
在mysql服務器崩潰後提供自動恢復。

MEMORY引擎
缺點:不支持事務,數據容易丟失,因爲表數據和索引都是存儲在內存當中。
優點:查詢數據最快。

2.事務(Transaction)

1.事務的概述
什麼是事務?
一個事務是一個完整的業務邏輯單元,不可再分。
比如:銀行賬戶轉賬,從A賬戶向B賬戶轉賬10000,需要執行兩條update語句。
update t_act set balance = balance -10000 where actno = ‘adfa1’;
update t_act set balance = balance+10000 where actno = ‘adfa2’;
以上兩條DML語句必須同時成功,或者同時失敗,不允許出現一條成功,一條失敗。
要想保證以上的兩條DML語句同時成功或者同時失敗,那麼就需要使用數據庫的“事務機制”。

2.和事務相關的語句只有:DML語句。(insert delete update)
因爲他們這三個語句都是和數據庫表當中的數據相關的。
事物的存在就是爲了保證數據的安全性,和完整性。

3.假設所有的業務都能使用1條DML語句搞定,還需要事務機制嗎?
答:不需要事務。
但通常一個事務(業務),需要多條DML語句共同聯合完成。

在這裏插入圖片描述

提交事務(會寫到文件)commit
回滾事務(不會寫到文件)rollback

4.事務的控制語句(TCL)
事務控制語句:
BEGIN 或 START TRANSACTION 顯式地開啓一個事務;

COMMIT 也可以使用 COMMIT WORK,不過二者是等價的。COMMIT 會提交事務,並使已對數據庫進行的所有修改成爲永久性的;

ROLLBACK 也可以使用 ROLLBACK WORK,不過二者是等價的。回滾會結束用戶的事務,並撤銷正在進行的所有未提交的修改;

SAVEPOINT identifier,SAVEPOINT 允許在事務中創建一個保存點,一個事務中可以有多個 SAVEPOINT;

RELEASE SAVEPOINT identifier 刪除一個事務的保存點,當沒有指定的保存點時,執行該語句會拋出一個異常;

ROLLBACK TO identifier 把事務回滾到標記點;

SET TRANSACTION 用來設置事務的隔離級別。InnoDB 存儲引擎提供事務的隔離級別有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 和 SERIALIZABLE。
5.事務的特性
事務包括四大特性:ACID
A:原子性:事務是最小的工作單元,不可再分。一個事務(transaction)中的所有操作,要麼全部完成,要麼全部不完成,不會結束在中間某個環節。事務在執行過程中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。

B:一致性:事務必須保證多條DML語句同時成功或者同時失敗。在事務開始之前和事務結束以後,數據庫的完整性沒有被破壞。這表示寫入的資料必須完全符合所有的預設規則,這包含資料的精確度、串聯性以及後續數據庫可以自發性地完成預定的工作。

C:隔離性:事務A與事務B之間具有隔離。數據庫允許多個併發事務同時對其數據進行讀寫和修改的能力,隔離性可以防止多個事務併發執行時由於交叉執行而導致數據的不一致。事務隔離分爲不同級別,包括讀未提交(Read uncommitted)、讀提交(read committed)、可重複讀(repeatable read)和串行化(Serializable)。

D:持久性:最終數據必須持久化到硬盤文件中,事務纔算成功的結束。事務處理結束後,對數據的修改就是永久的,即便系統故障也不會丟失。

6.事務之間的隔離性
事務隔離的隔離級別:
第一級別:讀未提交(read uncommitted)
對方事務還沒有提交,我們當前事務可以讀取到對方未提交的數據。存在髒讀(Dirty Read)現象:表示讀到了髒的數據。

第二級別:讀已提交(read committed)
對方事務提交之後的數據我方可以讀取到。
讀已提交存在的問題是:不可重複讀取。
解決了髒讀現象。

第三級別:可重複讀(repeatable read)
這種隔離級別解決了:不可重複讀問題。
存在的問題:讀取到的數據是幻象。

第四級別:串行化/序列化
解決所有的問題。需要事務排隊。
mysql默認的級別是可重複讀。
oracle默認級別是:讀已提交。

演示:
mysql事務默認情況是自動提交。即只要執行一條DML語句則提交一次。
怎麼關閉自動提交?
用:start transaction;

使用兩個以上的事務演示以上的隔離區別:
查詢當前隔離級別:select @@global.tx_isolation;
設置事務的全局隔離級別:set global transaction isolation level read uncommitted;

3.索引

1.什麼是索引
索引就相當於一本書的目錄,通過目錄可以快速的找到對應的資源。
在數據庫方面,查詢一張表的時候有兩種檢索方式:
第一種方式:全表掃描
第二種方式:根據索引檢索(效率很高)
索引雖然可以提高檢索效率,但是不能隨意添加索引,因爲索引也是數據庫當中的對象,也需要數據庫不斷的維護,是由維護成本的,比如,表中的數據經常被修改這樣就不適合添加索引,因爲數據一旦修改,索引就需要重新維護。

2.怎麼創建索引對象?怎麼刪除索引對象?
添加索引是給某些字段添加索引。
如:select ename ,sal from emp where ename = ‘sfsa’;
當ename字段沒有添加索引的時候,以上sql語句會進行全表掃描,掃描ename字段中所有的值。
當ename字段上添加索引的時候,以上sql語句會根據索引掃描,快速定位。

給字段添加索引:
create index emp_sal_index on emp(sal);
create index 索引名稱 on 表名 (字段名)

刪除索引對象:
drop index 索引名稱 on 表名;

3.什麼時候考慮給字段添加索引?(滿足什麼條件)
*數據量龐大。(根據客戶的需求)
*該字段很少修改。(很少DML操作)
*該字段經常出現在where子句中。(經常根據哪個字段查詢)

4.注意:主鍵和具有unique約束字段自動會添加索引。
根據主鍵查詢效率較高,儘量根據主鍵檢索。

5.查看sql語句的執行計劃
explain + sql語句。

6.索引底層採用的數據結構是:B+Tree
7.索引的實現原理:
在內存或硬盤創建一個索引。索引自動排序。
索引分區。
通過b-Tree縮小了掃描範圍,底層索引進行了排序,分區,索引會攜帶數據在表中的“物理地址”,最終通過索引檢索到數據之後,獲取到關聯的物理地址,通過物理地址定位表中的數據,效率是最高的。

8.索引的分類
單一索引:給單個字段添加索引
複合索引:給多個字段聯合起來添加1個索引
主鍵索引:主鍵上自動添加索引。
唯一索引:有unique約束的字段上會自動添加索引。

9.索引什麼時候失效?
比如模糊查詢的時候,第一個字符使用的是%,這時候索引是失效的。

4.視圖(view)

1.什麼是視圖?
站在不同的角度去看數據。(同一張表的數據,通過不同的角度去看待)
2.怎麼創建視圖?怎麼刪除視圖?
create view myview as select empno,ename from emp;

drop view myview;
3.對視圖進行增刪改查,會影響到原表的數據。(通過視圖影響到表數據的原表)可以對視圖進行CRUD操作。

4.視圖的作用?
可以隱藏表的實現細節,保密級別較高的系統,數據庫之對外提供相關的視圖,java程序員只對視圖對象進行CRUD。

5.DBA命令

1.將數據庫當中的數據導出。
在window窗口中:mysqldump xingkong>D:\ -uroot -p+加密碼(導出整個 庫)
在window窗口中:mysqldump xingkong t_student>D:\ -uroot -p+加密碼(導出指定表)

2.導入數據。
create database +數據庫
使用數據庫
source 文件路徑

3.創建用戶
create user username IDENTIFIED BY ‘password’;
4.授權
5.撤銷權限。

菜鳥教程

6.數據庫設計三範式

1.什麼是設計範式?
設計表的依據,按照這個三範式設計的表不會出現數據冗餘。

2.三範式:
第一範式:任何一張表都應該有主鍵,並且每一個字段原子性不可再分。

第二範式:在第一範式的基礎上,所有非主鍵字段完全依賴主鍵,不能產生部分依賴。
多對多?三張表,關係表裏有兩個外鍵
t_student學生表
在這裏插入圖片描述

第三範式:建立在第二範式基礎之上,所有非主鍵字段直接依賴主鍵,不能產生傳遞依賴。

班級t_class
學生t_student
在這裏插入圖片描述
一對多?兩張表,的表加外鍵。

注意:實際開發中以滿足客戶的需求爲主,有的時候拿冗餘換執行速度。

3.一對一怎麼設計?
一對一設計及有兩種方案:
1.主鍵共享(主鍵加外鍵
2.外鍵唯一(某字段外鍵加+unique)
用戶登錄表。
用戶詳細信息表。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章