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;
索引查詢
- 第一種方法: show keys from 表名
- 第二種方法: show index from 表名
- 第三種方法: desc 表名;
刪除索引
- 第一種方法-刪除主鍵索引: alter table 表名 drop primary key;
- 第二種方法-其他索引的刪除: alter table 表名 drop index 索引名;
- 第三種方法方法: 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):事務完成後,事務對數據庫的所有更新將被保存到數據庫,不能回滾。