MySQL6:事務和索引
阿新 • • 發佈:2021-09-17
事務和索引
事務
什麼是事務
要麼成功要麼失敗
- SQL執行A給B轉賬
- SQL執行B收到A轉賬
- 兩條語句要麼都成功,要麼都失敗
事務原則
事務原則:ACID原則,原子性、一致性、隔離性、永續性、(髒讀、幻讀……)
原子性(atomicity)
- 要麼成功,要麼失敗
一致性(consistency)
- 事務前後得資料完整性要保持一致
永續性(durability)
- 事務一但提交則不可逆,比持久化到資料庫中
隔離性(isolation)
- 事務得隔離性是多個使用者併發訪問資料庫時,資料庫為每一個使用者開啟的事務,不能被其他事務資料所幹預,事務之間要相互隔離
- 隔離所導致的一些問題
- 髒讀:指一個事務提取了另一個事務未提交的資料
- 虛讀(幻讀):是指在一個事務內讀取到了別的事務插入的資料,導致前後讀取數量總量不一致。
執行事務
-- ============事務============= SET autocommit = 0 -- 關閉 SET autocommit = 1 -- 開啟(預設的) -- 手動處理事務 -- 先關閉自動提交 SET autocommit = 0 -- 事務開啟 START TRANSACTION -- 標記一個事務的開始,從這個之後的sql 都在同一個事務內 INSERT xx INSERT xx -- 要麼同時成功,要麼同時失敗 -- 提交:成功了就持久化到資料庫 COMMIT -- 回滾:失敗了就回到初始樣子 ROLLBACK -- 事務結束 SET autocommit = 1 -- 開啟自動提交 SAVEPOINT -- 設定一個事務的儲存點(存檔) ROLLBACK TO SAVEPOINT -- 回滾到儲存點(讀檔) RELEASE SAVEPOINT -- 撤銷儲存點(刪檔)
模擬場景
-- ========模擬轉賬========== -- 建立一個shop資料庫 CREATE DATABASE `shop` CHARACTER SET utf8 COLLATE utf8_general_ci -- 使用資料庫 USE `shop` -- 建立一張account表 CREATE TABLE `account`( `id` INT(3) NOT NULL AUTO_INCREMENT COMMENT '賬戶id', `name` VARCHAR(10) NOT NULL COMMENT '賬戶名字', `money` DECIMAL(10,2) NOT NULL COMMENT '賬戶餘額', PRIMARY KEY(`id`) )ENGINE=INNODB DEFAULT CHARSET=utf8 -- 插入資料 INSERT INTO `account`(`name`,`money`) VALUES('A','2000.00'),('B','10000.00') -- 模擬轉賬:事務 -- 關閉事務自動提交 SET autocommit = 0; -- 開啟一個事務 START TRANSACTION UPDATE `account` SET `money`=`money`-500 WHERE `name`='A' -- A-500 UPDATE `account` SET `money`=`money`+500 WHERE `name`='B' -- B+500 COMMIT; -- 提交事務,成功持久化到資料庫 ROLLBACK; -- 回滾,回到原始的樣子 -- 開啟預設的自動提交 SET autocommit=1;
索引
MySQL官方對索引的定義為:索引(index)是幫助MySQL搞笑的獲取資料的資料結構提取句子主幹,就可以得到索引的本質:索引是資料結構
索引的分類
在一個表中,逐漸索引只能有一個,唯一索引可以有多個
- 主鍵索引(PRIMARY KEY)
- 唯一標識,主鍵不可重複,只能由一個列作為主鍵
- 唯一索引(UNIQUEKEY)
- 避免重複列出現,唯一索引可以重複,多個列都可以標識唯一索引
- 常規索引(KEY/INDEX)
- 預設的index/key關鍵字來設定
- 全文索引(FullText)
- 在特定的資料庫引擎下才有
- 快速定位資料
-- 索引的使用
-- 1.在建立表的時候給欄位增加索引
-- 2.建立完畢後,增加索引
-- 顯示所有的索引資訊
SHOW INDEX FROM 表名
-- 新增索引
CREATE INDEX[需要新增的索引型別] 索引名 ON 表名(欄位)
-- 增加一個全文索引
ALTER TABLE 表名 ADD INDEX[需要新增的索引型別] 索引名(列名)
-- 刪除索引
DROP INDEX 索引名 ON 表名
-- 刪除主鍵索引
ALTER TABLE 表名 DROP primary key
-- explain 分資訊sql執行的狀況
測試索引
索引在小資料量的時候,用處不大,但在大資料量的時候區別十分明顯
- 索引不是越多越好
- 不要對程序變動資料新增索引
- 小資料量表不需要新增索引
- 索引一般假在常用來查詢的欄位上