在進行查詢時,索引列不能是表示式的一部分,也不能是函式的引數,否則無法使用索引。
例如下面的查詢不能使用 actor_id 列的索引:
select actor_id from sakila.actor where actor_id + 1 = 5;
在需要使用多個列作為條件進行查詢時,使用多列索引比使用多個單列索引效能更好。例如下面的語句中,最好把 actor_id 和 film_id 設定為多列索引。
select film_id, actor_ id from sakila.film_actorwhere actor_id = 1 and film_id = 1;
讓選擇性最強的索引列放在前面。
索引的選擇性是指:索引的選擇性是指,不重複的索引值(也稱為基數,cardinality)和資料表的記錄總數(#t)的比值,範圍從1/#t到1之間,此時每個記錄都有唯一的索引與其對應。選擇性越高,查詢效率也越高。
例如下面顯示的結果中 customer_id 的選擇性比 staff_id 更高,因此最好把 customer_id 列放在多列索引的前面。
select count(distinct staff_id)/count(*) as staff_id_selectivity,count(distinct customer_id)/count(*) as customer_id_selectivity,
count(*)
from payment;
staff_id_selectivity: 0.0001customer_id_selectivity: 0.0373count(*): 16049
對於 blob、text 和 varchar 型別的列,必須使用字首索引,只索引開始的部分字元。一般情況下某個列字首的選擇性也是足夠高的,足以滿足查詢效能。
對於字首長度的選取需要根據索引選擇性來確定。
索引確實是一種查詢資料的高效方式,但是mysql也可以使用索引來直接獲取列的資料,這樣就不再需要讀取資料行。如果索引包含所有需要查詢的字段的值,我們就稱之為「覆蓋索引」。
具有以下優點:
mysql 高效能索引策略
三 合適的 聯合 索引列順序 四 覆蓋索引和索引覆蓋 五 冗餘和重複索引 索引列不能是表示式的一部分,也不能是函式的引數。對於blob text或很長的varchar型別的列,必須使用字首索引,因為mysql不允許索引這些列的完整長度。字首索引一般適用於 like 查詢,無法使用字首索引做order...
高效能的索引策略(上)
高效的選擇和使用索引有很多方式,其中有些事針對特殊案例的優化方法,有些則是針對特定行為的優化,使用哪個索引,以及如何評估選擇不同索引效能影響的技巧,則需要持續不斷的練習。接下來將介紹如何高效的使用索引。獨立的列 我們通常會看到一些查詢不當的使用索引,或者是的mysql無法使用已有的索引。如果查詢中的...
mysql高效能索引 mysql高效能索引( )
在開發中,我們知道大多數應用的瓶頸在於sql語句的執行時耗,在這裡並不討論sql語句的安全,僅僅討論高效能sql語句,而與高效能sql語句緊密相連的就是傳說中的 索引。索引 一種工作在儲存引擎端的用於快速找到記錄的一種資料結構。mysql使用索引的方式是 先找到索引的值,再根據索引的值找到資料行。索...