mysql下的索引使用原則

2021-06-16 10:44:08 字數 1673 閱讀 9222

為表建立索引,無疑是對資料庫比較好的優化方式之一。以下是自己對索引的總結。

1.即使乙個sql可以選擇多個索引,但是大多數情況下它都會選擇乙個索引,而放棄其它的索引。

1.索引的存是在where條件之後的。

2.在mysql中不同的儲存引擎對索引的對待也是有點不一樣的。

字首索引(又叫短索引)

對串列進行索引,如果可能應該指定乙個字首長度。例如,如果有乙個char(255)的 列,如果在前10 個或20 個字元內,多數值是惟一的,那麼就不要對整個列進行索引。短索引不僅可以提高查詢速度而且可以節省磁碟空間和i/o操作。

//建立短索引
create

index ix_test on t(col(200))

//適用的情況
select username,income from t where col like 'john%';

也就是說: 短索引的適用範圍主要是在like之後第乙個非』%』的例項。

組合索引

比如有一條語句是這樣的:select * from users where area=』beijing』 and age=22;

如果我們是在area和age上分別建立單個索引的話,由於mysql查詢每次只能使用乙個索引,所以雖然這樣已經相對不做索引時全表掃瞄提高了很多效率,但是如果在area、age兩列上建立復合索引的話將帶來更高的效率。如果我們建立了(area, age, salary)的復合索引,那麼其實相當於建立了(area,age,salary)、(area,age)、(area)三個索引,這被稱為最佳左字首特性。

對於組合索引,mysql資料庫所進行查詢的原理:

select * from users where area=』beijing』 and age=22;
select * from users where area=』beijing』;
如果area有索引,則以上的sql語句都會使用索引,因為組合索引有最佳左字首的特性,而select * from users where age=22; 則不會使用索引。

在一般的應用場景中,只要不是其中某個過濾欄位在大多數場景下能過濾90%以上的資料(這種可能性很小),而其他的過濾欄位會頻繁的更新,一般更傾向於建立組合索引,尤其是在併發量較高的場景下。因為當併發量較高的時候,即使只為每個query節省了很少的 io 消耗,但因為執行量非常大,所節省的資源總量仍然是非常可觀的。

當然,建立組合索引並不是說就須要將查詢條件中的所有欄位都放在乙個索引中,還應該盡量讓乙個索引被多個 query 語句利用,儘量減少同乙個表上的索參數量,減少因為資料更新帶來的索引更新成本,同時還可以減少因為索引所消耗的儲存空間。

如果有or,where後面就必須全面條件有索引,否則索引將不會起作用,所以一定要為or的全部字段建立索引

select * from test where last_name='widenius' or first_name='michael';

mysql查詢只使用乙個索引,因此如果where子句中已經使用了索引的話,那麼order by中的列是不會使用索引的。

因此資料庫預設排序可以符合要求的情況下不要使用排序操作;(排序功能由索引來完成)盡量不要包含多個列的排序,如果需要最好給這些列建立復合索引。

建立MySQL索引的原則及如何使用索引

選擇唯一性索引 唯一性索引的值是唯一的,可以更快速的通過該索引來確定某條記錄。例如,學生表中學號是具有唯一性的字段。為該字段建立唯一性索引可以很快的確定某個學生的資訊。如果使用姓名的話,可能存在同名現象,從而降低查詢速度。為經常需要排序 分組和聯合操作的字段建立索引 經常需要order by gro...

索引的使用原則

在where子句或者連線條件經常引用的列上建立索引,特別是大表的字段,應該建立索引。經常出現在關鍵字group by order by distinct後面的字段,最好建立索引。表的主鍵 外來鍵必須建立索引。建立了主鍵和唯一性約束後會自動建立唯一索引。如果單字段查詢很少甚至沒有,那麼可以建立復合索引...

簡述一下索引的匹配原則 mysql索引詳解

這是關於php高階到架構之mysql高階學習的第四篇文章 mysql索引詳解 第一篇 mysql共享鎖及排它鎖第二篇 mysql事務及隔離級別第三篇 mysql底層btree與b tree實現原理第四篇 mysql索引詳解 什麼是列的雜湊性呢?比如user 使用者表 中的username欄位,該列的...