1. 程式人生 > >利用索引優化查詢,提高效率

利用索引優化查詢,提高效率

1、索引使用原則

1、在經常進行連線,但是沒有指定為外來鍵的列上建立索引,而不經常連線的欄位則由優化器自動生成索引。

2、在頻繁進行排序或分組(即進行group by或order by操作)的列上建立索引。

3、在條件表示式中經常用到的不同值較多的列上建立檢索,在不同值少的列上不要建立索引。比如在僱員表的“性別”列上只有“男”與“女”兩個不同值,因此就無必要建立索引。如果建立索引不但不會提高查詢效率,反而會嚴重降低更新速度。

4、如果待排序的列有多個,可以在這些列上建立複合索引(compound index)。

2、例項講解

(1)在下面兩條select語句中:

SELECT
* FROM table1 WHERE field1<=10000 AND field1>=0;
SELECT * FROM table1 WHERE field1>=0 AND field1<=10000;

如果資料表中的資料field1都>=0,則第一條select語句要比第二條select語句效率高的多,因為第二條select語句的第一個條件耗費了大量的系統資源。

第一個原則:在where子句中應把最具限制性的條件放在最前面。!!!!

(2)在下面的select語句中:

SELECT * FROM tab WHERE a=… AND b=… AND c=…;

若有索引index(a,b,c),則where子句中欄位的順序應和索引中欄位順序一致。

第二個原則:where子句中欄位的順序應和索引中欄位順序一致。!!!!

(3)如果對多列進行索引(組合索引),列的順序非常重要,MySQL僅能對索引最左邊的字首進行有效查詢。例如:存在組合索引it1c1c2(c1,c2)。
查詢語句select * from t1 where c1=1 and c2=2能夠使用該索引。
查詢語句select * from t1 where c1=1也能夠使用該索引。
但是,查詢語句select * from t1 where c2=2不能夠使用該索引,因為沒有組合索引的引導列,即,要想使用c2列進行查詢,必需出現c1等於某值。

(4)當order by 中的欄位出現在where條件中時,才會利用索引而不排序

,更準確的說,order by 中的欄位在執行計劃中利用了索引時,不用排序操作。

這個結論不僅對order by有效,對其他需要排序的操作也有效。比如group by 、union 、distinct等。

3、Mysql索引會失效的幾種情況

1.如果條件中有or,即使其中有條件帶索引也不會使用(這也是為什麼儘量少用or的原因)。

注意:要想使用or,又想讓索引生效,只能將or條件中的每個列都加上索引。

2.對於多列索引,不是使用的第一部分,則不會使用索引。

3.like查詢是以%開頭。(以%結尾,索引可以使用)

4.如果列型別是字串,那一定要在條件中將資料使用引號引用起來,否則不使用索引。

4、例題:

假設MySQL資料庫表:

create table T{
k int unsigned not null auto_increment,
a date,
b varchar(24),
c int,d varchar(24),
primary key(k),unique key a_index (a DESC,b DESC),
key k1(b),key k2(c),key k3(d));

如下哪些sql語句查詢能較好的利用索引?()
正確答案: A D

A、select b from WHERE b like 'aaa%';
B、select a,b from T WHERE a='2015-10-25' ORDER BY b ASC,c ASC;
C、select a,b,c from T WHERE a='2015-10-25' ORDER BY b ASC;
D、select a,b,c from T WHERE a='2015-10-25' ORDER BY a,b;

由unique key a_index (a DESC,b DESC)可知,該表按a 降序,b降序建立了唯一索引。

當order by 欄位出現在where條件中時,才會利用索引而無需排序操作。!!!!!!