一、索引
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...