MySQL索引與事務

MySQL索引

索引基本描述

索引是用來提高數據庫的性能的一種機制。不用加內存,不用改程序,不用調sql,只要執行正確的create index ,查詢速度就可能提高成百上千倍。但是天下沒有免費的午餐,查詢速度的提高是以插入、更新、刪除的速度爲代價的,這些寫操作,增加了大量的IO。所以它的價值,在於提高一個海量數據的檢索速度。

索引分類

  • 主鍵索引(primary key)
  • 唯一索引(unique)
  • 普通索引(index)
  • 全文索引(fulltext)–解決中子文索引問題。

索引的創建

主鍵索引與唯一索引就是創建好主鍵之後,它就是一個索引。故此我們只需要來看看普通索引的建立。

方式一
create table user8(id int primary key,
	name varchar(20),
	addr varchar(30),
	index(name) --在表的定義最後,指定某列爲索引
);
方式二
create table stu(id int primary key, name varchar(20), addr varchar(30));
alter table stu add index(name); --創建完表以後指定某列爲普通索引
方式三
create table stu(id int primary key, name varchar(20), addr varchar(30));
-- 創建一個索引名爲 idx_name 的索引
create index idx_name on stu(name);

全文索引的創建
當對文章字段或有大量文字的字段進行檢索時,會使用到全文索引。MySQL提供全文索引機制,但是有要求,要求表的存儲引擎必須是MyISAM,而且默認的全文索引支持英文,不支持中文,例如:

CREATE TABLE articles (
	id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
	title VARCHAR(128),
	body TEXT,
	FULLTEXT (title,body)
)engine=MyISAM;

索引查詢

  1. 第一種方法: show keys from 表名
  2. 第二種方法: show index from 表名
  3. 第三種方法: desc 表名;

刪除索引

  1. 第一種方法-刪除主鍵索引: alter table 表名 drop primary key;
  2. 第二種方法-其他索引的刪除: alter table 表名 drop index 索引名;
  3. 第三種方法方法: drop index 索引名 on 表名

索引的使用注意事項

  • 比較頻繁作爲查詢條件的字段應該創建索引
  • 唯一性太差的字段不適合單獨創建索引,即使頻繁作爲查詢條件
  • 更新非常頻繁的字段不適合作創建索引
  • 不會出現在where子句中的字段不該創建索引

MySQL事務

事物的基本描述

事務就是一組DML語句組成,這些語句在邏輯上存在相關性,這一組DML語句要麼全部成功,要麼全部失敗,是一個整體。MySQL提供一種機制,保證我們達到這樣的效果。事務還規定不同的客戶端看到的數據是不相同的。

事物的基本操作

  • 創建一個簡單的測試表關於銀行轉賬的例子
    在這裏插入圖片描述

  • 開始一個事務 start transaction;
    在這裏插入圖片描述

  • 創建一個保存點 savepoint 保存點名;
    在這裏插入圖片描述

  • 添加數據
    在這裏插入圖片描述
    在這裏插入圖片描述在這裏插入圖片描述

  • 查看記錄
    在這裏插入圖片描述

  • 回到保存點,並再次查看記錄(根據具體情況) rollback to 保存點名;
    在這裏插入圖片描述

事務的注意事項

  • 如果沒有設置保存點,也可以回滾,只能回滾到事務的開始。直接使用 rollback(前提是事務還沒有提交)
  • 如果一個事務被提交了(commit),則不可以回退(rollback)可以選擇回退到哪個保存點
  • InnoDB支持事務,MyISAM不支持事務

讀取數據的概念

  • 1.髒讀(Dirty Reads):所謂髒讀就是對髒數據的讀取,而髒數據所指的就是未提交的數據。一個事務正在對一條記錄做修改,在這個事務完成並提交之前,這條數據是處於待定狀態的(可能提交也可能回滾),這時,第二個事務來讀取這條沒有提交的數據,並據此做進一步的處理,就會產生未提交的數據依賴關係。這種現象被稱爲髒讀。

  • 2.不可重複讀(Non-Repeatable Reads):一個事務先後讀取同一條記錄,但兩次讀取的數據不同,我們稱之爲不可重複讀。也就是說,這個事務在兩次讀取之間該數據被其它事務所修改。
  • 3.幻讀(Phantom Reads):一個 事務按相同的查詢條件重新讀取以前檢索過的數據,卻發現其他事務插入了滿足其查詢條件的新數據,這種現象就稱爲幻讀

事務的隔離級別

當MySQL表被多個線程或者客戶端開啓各自事務操作數據庫中的數據時,MySQL提供了一種機制,可以讓不同的事務在操作數據時,具有隔離性。從而保證數據的一致性。

在這裏插入圖片描述
mysql默認的隔離級別是可重複讀,一般情況下不要修改

事務的ACID特性

  • 1、原子性(Atomicity):事務開始後所有操作,要麼全部做完,要麼全部不做,不可能停滯在中間環節。事務執行過程中出錯,會回滾到事務開始前的狀態,所有的操作就像沒有發生一樣。也就是說事務是一個不可分割的整體,就像化學中學過的原子,是物質構成的基本單位。

  • 2、一致性(Consistency):事務開始前和結束後,數據庫的完整性約束沒有被破壞 。比如A向B轉賬,不可能A扣了錢,B卻沒收到。

  • 3、隔離性(Isolation):同一時間,只允許一個事務請求同一數據,不同的事務之間彼此沒有任何干擾。比如A正在從一張銀行卡中取錢,在A取錢的過程結束前,B不能向這張卡轉賬。

  • 4、持久性(Durability):事務完成後,事務對數據庫的所有更新將被保存到數據庫,不能回滾。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章