推薦學習:
Atomicity
)Consistency
)Isolation
)Durability
)SQL
標準定義了四種隔離性:(下面隔離性是由低到高,並行性由高到低)
select
獲取的資料都不能被修改,這樣就可以避免一個事務前後讀取不一致的情況。但是沒有辦法控制幻讀,因為這個時候其他事務不能更改所選的資料,但是可以增加資料;總結:四個級別逐漸增強,每個級別解決問題,事務級別越高,效能越差。
隔離級別 髒讀 不可重複讀 幻讀
未提交讀(read uncommitted) 可能 可能 可能
已提交讀(read committed) 不可能 可能 可能
可重複讀(repeatable read) 不可能 不可能 可能
可序列化(serializable) 不可能 不可能 不可能
總結:未提交讀會造成髒讀—>已提交讀解決髒讀,但會造成不可重複讀—>可重複讀解決讀取結果前後不一致的情況,但是造成幻讀(以前沒有,現在有)—>可序列化解決了幻讀,但是增加很多範圍鎖,可能會造成鎖超時;
(1)普通索引(它沒有任何限制。)
(2)唯一性索引(索引列的值必須唯一,但允許有空值。)
(3)主鍵索引(一種特殊的唯一索引,不允許有空值。一般是在建表的時候同時建立主鍵索引。)
(4)組合索引
(5)聚集索引 按照每張表的主鍵構造一顆B+樹,並且葉節點中存放著整張表的行記錄資料,因此也讓聚集索引的葉節點成為資料頁。
(6)非聚集索引(輔助索引)(頁節點不存放一整行記錄)。
(1)如果條件中有or,即使其中有條件帶索引,也不會使用(儘量少用or);
(2)Like查詢是以%開頭,例如SELECT * FROM mytable WHEREt Name like’%admin’;
(3)如果列型別是字串,那一定要在條件中使用引號引起來,否則不會使用索引;
MyISAM
,InnoDB
,Memonry
三個常用MySQL
引擎型別比較:
索引 MyISAM索引 InnoDB索引 Memonry索引
B-tree索引 支援 支援 支援
Hash索引 不支援 不支援 支援
R-Tree索引 支援 不支援 不支援
Full-text索引 不支援 暫不支援 不支援
因為在使用二元樹的時候,由於二元樹的深度過大而造成I/O讀寫過於頻繁,進而導致查詢效率低下。因此採用多路樹結構,B樹的各種操作能使B樹保持較低的高度。
B樹又叫平衡多路查詢樹,一棵m階的B樹特性如下:
即當sql中存在下面的關鍵字時,它們要保持這樣的順序:
select[distinct]、from、join(如left join)、on、where、group
by、having、union、order by、limit;
即在執行時sql按照下面的順序進行執行:
from、on、join、where、group by、having、select、distinct、union、order by
group by要和聚合函數一起使用,
例如:
select a.Customer,sum(a.OrderPrice) from orders a where a.Customer=’Bush’ or a.Customer = ‘Adams’ group by a.Customer;
實現多表查詢(內連線)
select u.uname,a.addr from lm_user u inner join lm_addr a on u.uid = a.uid;
使用select from where
同樣可以實現
select u.uname,a.addr from lm_user u, lm_addr a where u.uid = a.uid;
delimiter $$ create procedure procedure_bill() comment '查詢所有銷售情況' begin select billid, tx_time, amt from lm_bill; end $$ delimiter ;
呼叫儲存過程
call procedure_bill();
檢視儲存過程
show procedure status like 'procedure_bill';
在資料庫中,如果兩個表的之間的關係為多對多的關係,如:「學生表和課程表」,一個學生可以選多門課,一門課也可以被多個學生選;根據資料庫的設計原則,應當形成第三張關聯表。
步驟1:建立三張資料表Student ,Course,Stu_Cour
/**學生表*/ CREATE TABLE Student ( stu_id INT AUTO_INCREMENT, NAME VARCHAR(30), age INT , class VARCHAR(50), address VARCHAR(100), PRIMARY KEY(stu_id) ) /*學生課程表*/ CREATE TABLE Course( cour_id INT AUTO_INCREMENT, NAME VARCHAR(50), CODE VARCHAR(30), PRIMARY KEY(cour_id) ) /**學生課程關聯表*/ CREATE TABLE Stu_Cour( sc_id INT AUTO_INCREMENT, stu_id INT , cour_id INT, PRIMARY KEY(sc_id) )
第二步:為Stu_Cour關聯表新增外來鍵
/*新增外來鍵約束*/ ALTER TABLE Stu_Cour ADD CONSTRAINT stu_FK1 FOREIGN KEY(stu_id) REFERENCES Student(stu_id); ALTER TABLE Stu_Cour ADD CONSTRAINT cour_FK2 FOREIGN KEY(cour_id) REFERENCES Course(cour_id);
完成建立!
alter table 表名 add constraint FK_ID foreign key(你的外來鍵欄位名) REFERENCES 外表表名(對應的表的主鍵欄位名)
;例: alter table tb_active add constraint FK_ID foreign key(user_id) REFERENCES tb_user(id);
當你存取資料庫時,不管是手工存取,還是程式存取,都不是直接讀寫資料庫檔案,而是通過資料庫引擎去存取資料庫檔案。
以關係型資料庫為例,發SQL語句給資料庫引擎,資料庫引擎解釋SQL語句,提取出你需要的資料返回給你。因此,對存取者來說,資料庫引擎就是SQL語句的直譯器。
主要區別:
MYISAM
是非事務安全型的,而InnoDB
是事務安全型;NYISAM
鎖的粒度是表級鎖,而InnoDB
支援行級鎖;MYISAM
支援全文字索引,而InnoDB
不支援全文索引MYISAM
相對簡單,所以在效率上要優於InnoDB
,小型應用可以考慮使用MYISAM
;MYISAM
表是儲存成檔案的形式,在跨平臺的資料轉移中使用MYISAM
儲存會省去不少的麻煩;InnoDB
表比MYISAM
表更安全,可以在保證資料不丟失的情況下,切換非事務表到事務表;應用場景:
MYISAM
管理非事務表,它提供高速儲存和檢索,以及全文搜尋能力,如果應用中需要執行大量的select
查詢,那麼MYISAM
是更好的選擇。InnoDB
用於事務處理應用程式,具有眾多特性,包括ACID
事務支援。如果應用中需要執行大量的insert
或update
操作,則應該使用innodb
,這樣可以提高多使用者並行操作的效能。目前關聯式資料庫有6種正規化:第一規格化{1NF},第二正規化{2NF},第三正規化{3NF},巴斯—科德正規化{BCNF},第四規格化{4NF},第五正規化{5NF,又稱完美正規化}。滿足最低要求的正規化是第一規格化。在第一規格化的基礎上進一步滿足更多規範要求的稱為第二正規化{2NF},其餘正規化依次類推,一般來說,資料庫只需滿足第三正規化(3NF)就OK了。
正規化:
推薦學習:
以上就是MySQL資料庫基礎知識點儲備(整理總結)的詳細內容,更多請關注TW511.COM其它相關文章!