導讀:關於MySQL,用三篇文章帶你進入MySQL的世界。文章較長,建議收藏再看!html
不一樣的引擎,表具備不一樣的存儲方式。
建表的時候能夠指定存儲引擎,也能夠指定字符集。
mysql默認使用的存儲引擎是InnoDB方式。
默認採用的字符集是UTF8程序員
1.什麼是存儲引擎
每個存儲引擎都對應一種不一樣的存儲方式。sql
2.查看當前mysql支持的存儲引擎。
show engines \G數據庫
3.常見的存儲引擎:
MySIAM這種存儲引擎不支持事務。
比較經常使用。
他管理表具備如下特徵:安全
缺點:不支持事務。服務器
InnoDB引擎
優勢:支持事務,行級鎖,外鍵,級聯刪除和級聯更新等。這種引擎數據最安全。
數據存儲在tabalespace這樣的表空間中(邏輯概念),沒法被壓縮,沒法轉換成只讀。
在mysql服務器崩潰後提供自動恢復。數據結構
MEMORY引擎
缺點:不支持事務,數據容易丟失,由於表數據和索引都是存儲在內存當中。
優勢:查詢數據最快。併發
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;
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.索引何時失效?
好比模糊查詢的時候,第一個字符使用的是%,這時候索引是失效的。
1.什麼是視圖?
站在不一樣的角度去看數據。(同一張表的數據,經過不一樣的角度去看待)
2.怎麼建立視圖?怎麼刪除視圖?
create view myview as select empno,ename from emp;
drop view myview;
3.對視圖進行增刪改查,會影響到原表的數據。(經過視圖影響到表數據的原表)能夠對視圖進行CRUD操做。
4.視圖的做用?
能夠隱藏表的實現細節,保密級別較高的系統,數據庫之對外提供相關的視圖,java程序員只對視圖對象進行CRUD。
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.撤銷權限。
1.什麼是設計範式?
設計表的依據,按照這個三範式設計的表不會出現數據冗餘。
2.三範式:
第一範式:任何一張表都應該有主鍵,而且每個字段原子性不可再分。
第二範式:在第一範式的基礎上,全部非主鍵字段徹底依賴主鍵,不能產生部分依賴。
多對多?三張表,關係表裏有兩個外鍵。
t_student學生表
第三範式:創建在第二範式基礎之上,全部非主鍵字段直接依賴主鍵,不能產生傳遞依賴。
班級t_class
學生t_student
一對多?兩張表,多的表加外鍵。
注意:實際開發中以知足客戶的需求爲主,有的時候拿冗餘換執行速度。
3.一對一怎麼設計?
一對一設計及有兩種方案:
1.主鍵共享(主鍵加外鍵)
2.外鍵惟一(某字段外鍵加+unique)
用戶登陸表。
用戶詳細信息表。