事務
概述
什么是事務
事務就是將一組SQL語句放在同一批次內去執行
如果一個SQL語句出錯,則該批次內的所有SQL都將被取消執行
MySQL事務處理只支持InnoDB和BDB數據表類型
事務的ACID原則
原子性(Atomic)
整個事務中的所有操作,要么全部完成,要么全部不完成,不可能停滯在中間某個環節。事務在執行過程中發生錯誤,會被回滾(ROLLBACK)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。
一致性(Consist)
一個事務可以封裝狀態改變(除非它是一個只讀的)。事務必須始終保持系統處于一致的狀態,不管在任何給定的時間并發事務有多少。也就是說:如果事務是并發多個,系統也必須如同串行事務一樣操作。其主要特征是保護性和不變性(Preserving an Invariant),以轉賬案例為例,假設有五個賬戶,每個賬戶余額是100元,那么五個賬戶總額是500元,如果在這個5個賬戶之間同時發生多個轉賬,無論并發多少個,比如在A與B賬戶之間轉賬5元,在C與D賬戶之間轉賬10元,在B與E之間轉賬15元,五個賬戶總額也應該還是500元,這就是保護性和不變性。
隔離性(Isolated)
隔離狀態執行事務,使它們好像是系統在給定時間內執行的唯一操作。如果有兩個事務,運行在相同的時間內,執行相同的功能,事務的隔離性將確保每一事務在系統中認為只有該事務在使用系統。這種屬性有時稱為串行化,為了防止事務操作間的混淆,必須串行化或序列化請求,使得在同一時間僅有一個請求用于同一數據。
持久性(Durable)
在事務完成以后,該事務對數據庫所作的更改便持久的保存在數據庫之中,并不會被回滾。
事務實現
基本語法
-- 使用set語句來改變自動提交模式SET autocommit = 0; ?/*關閉*/SET autocommit = 1; ?/*開啟*/-- 注意:-- 1.MySQL中默認是自動提交-- 2.使用事務時應先關閉自動提交-- 開始一個事務,標記事務的起始點START TRANSACTION -- 提交一個事務給數據庫COMMIT-- 將事務回滾,數據回到本次事務的初始狀態ROLLBACK-- 還原MySQL數據庫的自動提交SET autocommit =1;-- 保存點SAVEPOINT 保存點名稱 -- 設置一個事務保存點ROLLBACK TO SAVEPOINT 保存點名稱 -- 回滾到保存點RELEASE SAVEPOINT 保存點名稱 -- 刪除保存點
索引
索引分類
索引的作用
提高查詢速度
確保數據的唯一性
可以加速表和表之間的連接 , 實現表與表之間的參照完整性
使用分組和排序子句進行數據檢索時 , 可以顯著減少分組和排序的時間
全文檢索字段進行搜索優化.
分類
主鍵索引 (Primary Key)
唯一索引 (Unique)
常規索引 (Index)
全文索引 (FullText)
主鍵索引
主鍵 : 某一個屬性組能唯一標識一條記錄
特點 :
最常見的索引類型
確保數據記錄的唯一性
確定特定數據記錄在數據庫中的位置
唯一索引
作用 : 避免同一個表中某數據列中的值重復
與主鍵索引的區別
主鍵索引只能有一個
唯一索引可能有多個
CREATE TABLE `Grade`(?`GradeID` INT(11) AUTO_INCREMENT PRIMARYKEY,?`GradeName` VARCHAR(32) NOT NULL UNIQUE??-- 或 UNIQUE KEY `GradeID` (`GradeID`))
常規索引
作用 : 快速定位特定數據
注意 :
index 和 key 關鍵字都可以設置常規索引
應加在查詢找條件的字段
不宜添加太多常規索引,影響數據的插入,刪除和修改操作
CREATE TABLE `result`(??-- 省略一些代碼?INDEX/KEY `ind` (`studentNo`,`subjectNo`) -- 創建表時添加)-- 創建后添加ALTER TABLE `result` ADD INDEX `ind`(`studentNo`,`subjectNo`);
全文索引
作用 : 快速定位特定數據
注意 :
只能用于MyISAM類型的數據表
只能用于CHAR , VARCHAR , TEXT數據列類型
適合大型數據集
-- 方法一:創建表時CREATE TABLE 表名 (????字段名1 數據類型 [完整性約束條件…],????字段名2 數據類型 [完整性約束條件…],????[UNIQUE | FULLTEXT | SPATIAL ] ?INDEX | KEY????[索引名] (字段名[(長度)] [ASC |DESC]));
-- 方法二:CREATE在已存在的表上創建索引CREATE [UNIQUE | FULLTEXT | SPATIAL ] INDEX 索引名 ON 表名 (字段名[(長度)] [ASC |DESC]) ;
-- 方法三:ALTER TABLE在已存在的表上創建索引?ALTER TABLE 表名 ADD [UNIQUE | FULLTEXT | SPATIAL ] INDEX 索引名 (字段名[(長度)] [ASC |DESC]) ;
刪除索引:DROP INDEX 索引名 ON 表名字;
刪除主鍵索引: ALTER TABLE 表名 DROP PRIMARY KEY;
顯示索引信息: SHOW INDEX FROM student;
/*增加全文索引*/ALTER TABLE `school`.`student` ADD FULLTEXT INDEX `studentname` (`StudentName`);/*EXPLAIN : 分析SQL語句執行性能*/EXPLAIN SELECT * FROM student WHERE studentno='1000';/*使用全文索引*/-- 全文搜索通過 MATCH() 函數完成。-- 搜索字符串做為 against() 的參數被給定。搜索以忽略字母大小寫的方式執行。對于表中的每個記錄行,MATCH() 返回一個相關性值。即,在搜索字符串與記錄行在 MATCH() 列表中指定的列的文本之間的相似性尺度。EXPLAIN SELECT *FROM student WHERE MATCH(studentname) AGAINST('love');
注意:MySQL 5.6 以前的版本,只有 MyISAM 存儲引擎支持全文索引;MySQL 5.6 及以后的版本,MyISAM 和 InnoDB 存儲引擎均支持全文索引;只有字段的數據類型為 char、varchar、text 及其系列才可以建全文索引。測試或使用全文索引時,要先看一下自己的 MySQL 版本、存儲引擎和數據類型是否支持全文索引。
索引準則
索引不是越多越好
不要對經常變動的數據加索引
小數據量的表建議不要加索引
索引一般應加在查找條件的字段
索引的數據結構
hash類型的索引:查詢單條快,范圍查詢慢
btree類型的索引:b+樹,層數越多,數據量指數級增長(我們就用它,因為innodb默認支持它)
不同的存儲引擎支持的索引類型也不一樣
InnoDB支持事務,支持行級別鎖定,支持 B-tree、