索引和事務

2021-10-21 10:33:14 字數 3872 閱讀 2027

一、索引

1、索引簡介

什麼是索引?

一般的應用系統,讀寫比例在 10:1 左右,而且插入操作和一般的更新操作很少出現效能問題,在生產環境

中,我們遇到最多的,也是最容易出問題的,還是一些複雜的查詢操作,因此對查詢語句的優化顯然是重中之重。

說起加速查詢,就不得不提到索引了。

為什麼要有索引?

索引在 mysql 中也叫做「鍵」,是儲存引擎用於快速找到記錄的一種資料結構。索引對於良好的效能非常關

鍵,尤其是當表中的資料量越來越大時,索引對於效能的影響愈發重要。

索引優化應該是對查詢效能優化最有效的手段了。善用索引能夠輕易將查詢效能提高好幾個數量級。

索引相當於字典的音序表,如果要查某個字,如果不使用音序表,則需要從幾百頁中逐頁去查。

索引的優劣勢:

索引的優勢:可以快速檢索,減少 i/o 次數,加快檢索速度;根據索引分組和排序,可以加快分組和排序。

索引的劣勢:索引本身也是表,因此會占用儲存空間,一般來說,索引表占用的空間是資料表的 1.5 倍;索

引表的維護和建立需要時間成本,這個成本隨著資料量增大而增大;構建索引會降低資料表的修改操作(刪除,

新增,修改)的效率,因為在修改資料表的同時還需要修改索引表。

2、mysql 中索引的使用

建立索引

索引可以在建立表時建立,也可以在建立表之後新增。

任務 1-1:在建立表時建立索引,**如下所示:

create table mytable(

id int not null, username varchar(16) not null, index myindex (username(16))

);語法解析:**中的 index 表示索引,myindex 表示定義的索引名稱。

注意:如果是 char,varchar 型別,length 可以小於字段實際長度;如果是 blob 和 text 型別,必須

指定 length。

任務 1-2:在建立表之後建立索引,**如下所示:

create index myindex on mytable(username(16));

或者alter table mytable add index myindex(username)

檢視索引

建立索引後可以使用下面語句檢視索引。4

任務 1-3:檢視表中的索引,**如下所示:

show index from mytable

刪除索引

刪除索引可以使用 drop 或者 alter 命令來完成。

任務 1-4:刪除表中索引,**如下所示:

drop index myindex on mytable;

或者alter table mytable drop index myindex;

語法分析:**中的 myindex 是建立索引時定義的索引名稱。

通過 explain 分析 sql 是否使用到索引

任務 1-5:通過 explain 命令檢視索引使用情況,**如下所示:

explain select * from mytable where username = 『jack』 執行結果如下:

注意:如果 key 值為索引名稱,則該查詢使用了索引,如果 key 值為 null,則表示沒有使用索引。

3、索引的使用規則

索引分類

常見的索引型別有:主鍵索引、唯一索引、普通索引、全文索引、組合索引。

 主鍵索引:即主索引,根據主鍵 pk_clolum(length)建立索引,不允許重複,不允許空值;

 唯一索引:用來建立索引的列的值必須是唯一的,允許空值;

 普通索引:用表中的普通列構建的索引,沒有任何限制;

 全文索引:用大文字物件的列構建的索引;

 組合索引:用多個列組合構建的索引,這多個列中的值不允許有空值。

適合建立索引的情況

 主鍵自動建立唯一索引;

 經常作為查詢條件在 where 或者 order by 語句**現的列要建立索引;

 作為排序的列要建立索引;

 查詢中與其他表關聯的字段,外來鍵關係建立索引;

 高併發條件下傾向組合索引;

 用於聚合函式的列可以建立索引,例如使用了 max(column_1)或者 count(column_1)時的 column_1 就需

要建立索引。

不適合建立索引的情況5

 經常增刪改的列不要建立索引;

 有大量重複的列不建立索引;

 表記錄太少不要建立索引。只有當資料庫裡已經有了足夠多的測試資料時,它的效能測試結果才有實際

參考價值。如果在測試資料庫裡只有幾百條資料記錄,它們往往在執行完第一條查詢命令之後就被全部

載入到記憶體裡,這將使後續的查詢命令都執行得非常快–不管有沒有使用索引。只有當資料庫裡的記錄

超過了 1000 條、資料總量也超過了 mysql 伺服器上的記憶體總量時,資料庫的效能測試結果才有意義。

索引失效的情況

 在組合索引中不能有列的值為 null,如果有,那麼這一列對組合索引就是無效的;

 在乙個 select 語句中,索引只能使用一次,如果在 where 中使用了,那麼在 order by 中就不要用了;

 like 操作中,』%aaa%'不會使用索引,也就是索引會失效,但是『aaa%』可以使用索引;

 在索引的列上使用表示式或者函式會使索引失效;

 在查詢條件中使用不等於,包括《符號、>符號和!=會導致索引失效;

 在查詢條件中使用 is null 或者 is not null 會導致索引失效;

 字串不加單引號會導致索引失效;

 在查詢條件中使用 or 連線多個條件會導致索引失效,除非 or 鏈結的每個條件都加上索引;

 如果排序的字段使用了索引,那麼 select 的字段也要是索引字段,否則索引失效;

 盡量不要包括多列排序,如果一定要,最好為這佇列構建組合索引。

具體檢視索引是否有效,可以使用 explain 命令查詢。 二、事務

1、事務簡介

什麼是事務?

事務(transaction):乙個最小的不可再分的工作單元;通常乙個事務對應乙個完整的業務(例如銀行賬戶轉

賬業務,該業務就是乙個最小的工作單元)。

事務只和 dml 語句有關,或者說 dml 語句才有事務。

轉賬操作理解事務

以下是銀行賬戶表 t_act(賬號、餘額),進行轉賬操作。

actno balance

1 500

2 100

任務 2-1:使用 update 語句實現轉賬操作,實現賬號 1 向賬號 2 轉賬 100 元。

分析:轉賬操作,需要賬號 1 餘額減少 100 元,同時需要賬號 2 餘額增加 100 元。**如下所示:

update t_act set balance=balance-100 where actno=1;

update t_act set balance=balance+100 where actno=2;

在乙個轉賬業務中,以上兩條 dml 語句必須同時成功或者同時失敗。最小單元不可再分,當第一條 dml6

語句執行成功後,並不能將底層資料庫中的第乙個賬戶的資料修改,只是將操作記錄了一下;這個記錄是在記憶體

中完成的;當第二條 dml 語句執行成功後,和底層資料庫檔案中的資料完成同步。若第二條 dml 語句執行失敗,

則清空所有的歷史操作記錄,要完成以上的功能必須借助事務。

2、mysql 中事務的使用

在 mysql 中,事務的常規操作包括:開啟事務、提交事務與回滾事務。

開啟事務

開啟事務的語法如下所示:

start transaction;

或者begin transaction;

提交事務

提交事務的語法如下所示:

commit;

mysql索引和事務 MySql索引和事務

mysqlde 索引 目的 是為了加快查詢的速度,避免順序查詢,但是拖慢了插入和刪除的速度.應用在在經常查詢,很少少出插入的場景中.結構 b 樹,n叉搜尋樹,使用鏈式的結構把每一層的節點連線在一起,葉子節點中儲存資料,非葉子節點輔助查詢.主鍵索引和其他索引的不一樣 主鍵索引葉子節點儲存一條一條的資料...

索引和事務

索引 避免進行遍歷,優化查詢速度 相當於一本書的目錄,幫助我們快速找到想要的記錄,如果沒有索引的話,此時查詢方式就是順序遍歷,資料結構中,啥樣的資料結構查詢的速度快呢?雜湊表 二叉搜尋樹 索引讓我們避免出現順序遍歷的情況,但是用雜湊作為索引,是不太可行的,像where id 10,用hash是完全可...

索引和事務

mysql資料庫有三個非常重要的概念,分別是索引 事務 鎖。這些也都是面試中的熱點問題,在此做以總結,也方便面試前的回顧。簡單來說,索引是一種排好序的資料結構。這裡面包含兩個資訊,乙個是索引是排好序的,另乙個是索引本質上是一種資料結構。innodb和mysiam兩種儲存引擎索引的儲存方式是不同的,i...