1. 程式人生 > 其它 >MySQL6:事務和索引

MySQL6:事務和索引

事務和索引

事務

什麼是事務

要麼成功要麼失敗

  • 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執行的狀況

測試索引

索引在小資料量的時候,用處不大,但在大資料量的時候區別十分明顯

  • 索引不是越多越好
  • 不要對程序變動資料新增索引
  • 小資料量表不需要新增索引
  • 索引一般假在常用來查詢的欄位上