MYSQL 索引優化

2021-09-02 10:23:38 字數 2617 閱讀 4485

沒必要給所有的列加上索引.

索引是把雙刃劍,有好有壞.給給資料,你參考一下:

1.合理使用索引

索引是資料庫中重要的資料結構,它的根本目的就是為了提高查詢效率。現在大多數的資料庫產品都採用ibm最先提出的isam索引結構。索引的使用要恰到好處,其使用原則如下:

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

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

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

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

●使用系統工具。如informix資料庫有乙個tbcheck工具,可以在可疑的索引上進行檢查。在一些資料庫伺服器上,索引可能失效或者因為頻繁操作而使得讀取效率降低,如果乙個使用索引的查詢不明不白地慢下來,可以試著用tbcheck工具檢查索引的完整性,必要時進行修復。另外,當資料庫表更新大量資料後,刪除並重建索引可以提高查詢速度。

(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子句中字段的順序應和索引中欄位順序一致。

以下假設在field1上有唯一索引i1,在field2上有非唯一索引i2。

(3) select field3,field4 from tb where field1='sdf' 快

select * from tb where field1='sdf' 慢,

因為後者在索引掃瞄後要多一步rowid表訪問。

(4) select field3,field4 from tb where field1>='sdf' 快

select field3,field4 from tb where field1>'sdf' 慢

因為前者可以迅速定位索引。

(5) select field3,field4 from tb where field2 like 'r%' 快

select field3,field4 from tb where field2 like '%r' 慢,

因為後者不使用索引。

(6) 使用函式如:

select field3,field4 from tb where upper(field2)='rmn'不使用索引。

如果乙個表有兩萬條記錄,建議不使用函式;如果乙個表有五萬條以上記錄,嚴格禁止使用函式!兩萬條記錄以下沒有限制。

(7) 空值不在索引中儲存,所以

select field3,field4 from tb where field2 is[not] null不使用索引。

(8) 不等式如

select field3,field4 from tb where field2!='tom'不使用索引。

相似地,

select field3,field4 from tb where field2 not in('m','p')不使用索引。

(9) 多列索引,只有當查詢中索引首列被用於條件時,索引才能被使用。

(10) max,min等函式,如

select max(field2) from tb使用索引。所以,如果需要對字段取max,min,sum等,應該加索引。

一次只使用乙個聚集函式,如:

select 「min」=min(field1), 「max」=max(field1) from tb

不如:select 「min」=(select min(field1) from tb) , 「max」=(select max(field1) from tb)

(11) 重複值過多的索引不會被查詢優化器使用。而且因為建了索引,修改該字段值時還要修改索引,所以更新該字段的操作比沒有索引更慢。

(12) 索引值過大(如在乙個char(40)的字段上建索引),會造成大量的i/o開銷(甚至會超過表掃瞄的i/o開銷)。因此,盡量使用整數索引。 sp_estspace可以計算表和索引的開銷。

(13) 對於多列索引,order by的順序必須和索引的字段順序一致。

(14) 在sybase中,如果order by的字段組成乙個簇索引,那麼無須做order by。記錄的排列順序是與簇索引一致的。

mysql 優化 聚集索引 mysql 索引優化

一.聚集索引 clustered index innodb預設依據主鍵列聚集,myisam不使用 特點 b樹每個葉子包含實際資料行,資料按照索引順序地儲存在物理頁上。優點 1.範圍查詢,獲取指定id的全部資料只需從磁碟讀取少量資料頁 如果不使用聚集索引,每條資料可能引起一次磁碟io。2.由於索引和資...

mysql索引優化原則 MySQL 索引優化原則

索引優化原則 1 最左字首匹配原則,聯合索引,mysql會從做向右匹配直到遇到範圍查詢 3 and d 4 如果建立 a,b,c,d 順序的索引,d是用不到索引的,如果建立 a,b,d,c 的索引則都可以用到,a,b,d的順序可以任意調整。2 和in可以亂序,比如a 1 and b 2 and c ...

mysql索引優化原則 MySQL索引優化

mysql官方對索引的定義 索引是幫助mysql高效獲取資料的資料結構。索引是在儲存引擎中實現的,所以每種儲存引擎中的索引都不一樣。如myisam和innodb儲存引擎只支援btree索引 memory和heap儲存引擎可以支援hash和btree索引。這裡僅針對常用的innodb儲存引擎所支援的b...