MySQL索引事務

小小小小小飛發表於2021-01-05

1. 索引

索引是一種特殊的檔案,包含著對資料表裡所有記錄的引用指標。
它的作用類似於書籍目錄,可用於快速定位、檢索資料。所以它可以極大的提高資料庫的效能。
要考慮對資料庫表的某列或某幾列建立索引,需要考慮以下幾點:

  • 資料量較大,且經常對這些列進行條件查詢。
  • 該資料庫表的插入操作,及這些列的修改操作頻率比較低。
  • 索引會佔用額外的磁碟空間。

1.1 使用

在建立主鍵約束(PRIMARY KEY)、唯一約束(UNIQUE)、外來鍵約束(FOREIGN KEY)時,會自動建立對應列的索引。

  • 檢視索引
    show index from 表名;
    例如:檢視學生表已有的索引
show index from student;
  • 建立索引
    對於非主鍵、非唯一約束、非外來鍵的欄位,可以建立普通索引。
    create index 索引名 on 表名(欄位名);
    例如:建立班級表中,name欄位的索引。
create index idx_classes_name on classes(name);
  • 刪除索引
    drop index 索引名 on 表名;
    例如:刪除班級表中name欄位的索引。
drop index idx_classes_name on classes;

索引儲存的資料結構主要為B+樹,及hash的方式。

2. 事務

什麼是事務?事務是邏輯上的一組操作,例如銀行轉賬操作,這組操作包括 從你的賬戶扣除轉賬金額和從對方的賬戶存入轉賬金額,要麼全部執行成功,要麼全部執行失敗。
事務的使用
(1)開啟事務:start transaction;
(2)執行多條SQL語句
(3)回滾或提交:rollback/commit;
rollback即是全部失敗,commit即是全部成功。
測試案例:
建立測試表:

drop table if exists accout;
create table accout(
 id int primary key auto_increment,
 name varchar(20) comment '賬戶名稱',
 money decimal(11,2) comment '金額'
);
insert into accout(name, money) values
('張三', 5000),
('李四', 1000);
start transaction;
-- 張三賬戶減少2000
update accout set money=money-2000 where name = '張三';
-- 李四賬戶增加2000
update accout set money=money+2000 where name = '李四';
commit;

假如我們在轉賬時當系統從張三這邊已經扣除了2000元,但是在執行李四賬戶增加2000元時由於網路波動或者其他一些原因導致這一語句執行失敗,導致張三這邊已經扣除了2000,但是李四這邊卻沒有收到轉賬金額,那麼這2000元就被系統黑吃了。
事務就是為了解決這一問題,當我們開啟事務直到事務結束,中間所執行的多條SQL語句,假如有一條語句執行失敗,那麼從事務開始到失敗之前的語句全部失效,然後我們重新提交,直到這些SQL語句全部執行成功,然後事務結束,資料庫將資料存入,那麼就可以避免這一類似的問題出現。

相關文章