MySQL建立索引的注意事項

2022-06-18 19:18:11 字數 3742 閱讀 5164

對於大資料量的**,尤其是百萬行以上的資料表,一定要對其建立索引,否則查詢速度極慢。(參考後面的測試結果)

建立索引時需注意:

mysql的索引有兩種:單列索引(即在某一列上建索引)、多列組合索引(即在多個列上建立同乙個索引),不像sql server分聚集索引,非聚集索引。

如何建立單列索引:

格式:create index 索引名 on 表名(列名)

例如:create

index idx_geoinfo_tiny_cabid on geoinfo_tiny (cabid)#建立乙個名為idx_geoinfo_tiny_cabid的索引,該索引建立在geoinfo_tiny表上的cabid列上面

如何建立多列組合索引:

格式:create index 索引名 on 表名(列名1,列名2,列名3,...)

例如: #建立乙個名為idx_geoinfo_tiny_objectid_occupancy_time_cabid的索引,該索引建立在geoinfo_tiny表上的

objectid,occupancy,occur_time,cabid等四個

列上面create

index idx_geoinfo_tiny_objectid_occupancy_time_cabid on geoinfo_tiny (objectid,occupancy,occur_time,cabid)

應該在哪個列上建立索引?建組合索引還是單列索引?

先說第一問,應該在哪個列上建立索引?

答:得根據自己的查詢需求來,哪一列需要經常查詢就在哪一列上建索引,一般是sql語句中where子句中的列,例如對於sql語句

select objectid,occur_time,latitude,longitude,cabid from geoinfo_tiny where cabid=

'afmorc

'and time(occur_time)>time('

07:00:00

') and time(occur_time)12:00:00')

order

by occur_time asc

where子句中作為判斷依據的cabid列和time列,這兩個列上應該建立索引。

至於該建立組合索引還是單列索引,如不能確定,可以都試試,看哪個效果好。

我本機上有乙個表,名為geoinfo_tiny,6個字段,從.txt檔案匯入了2,867,457行資料(如何使用python快速、大批量地匯入資料,請看

建立表:

create

table

`geoinfo_tiny` (

`objectid`

int(11) not

null

auto_increment ,

`latitude`

double

notnull

,`longitude`

double

notnull

,`occupancy`

bit(1) not

null

,`occur_time`

datetime

notnull

,`cabid`

varchar(16)

待測試的查詢語句:

select objectid,occur_time,latitude,longitude,cabid from geoinfo_tiny where cabid=

'afmorc

'and time(occur_time)>time('

07:00:00

') and time(occur_time)12:00:00')

order

by occur_time asc

測試1:不建立任何索引,直接查詢

結果:

[

sql]

select objectid,occur_time,cabid from geoinfo_tiny where cabid=

'eckecky

'and time(occur_time)>time('

07:00:00

') and time(occur_time)12:00:00')

order

by occur_time asc

受影響的行:

04.254s

測試2:只在cabid列上建立索引

create

index idx_geoinfo_tiny_cabid on geoinfo_tiny (cabid)

結果:

[

sql]

select objectid,occur_time,cabid

from geoinfo_tiny

where cabid

='amwibs' and time(occur_time)

>time('07:00:00') and time(occur_time)

order by

occur_time asc

受影響的行: 

00.147s

測試3:只在occur_time列上建立索引

create

index idx_geoinfo_tiny_time on geoinfo_tiny (occur_time)

結果:

[

sql]

select objectid,occur_time,cabid from geoinfo_tiny where cabid=

'ancorjo

'and time(occur_time)>time('

07:00:00

') and time(occur_time)12:00:00')

order

by occur_time asc

受影響的行:

04.668s

測試4:在cabid、occur_time列上分別建立單列索引(此時該錶上有2個單列索引)

結果:

[sql] select objectid,occur_time,cabid from geoinfo_tiny where cabid='atfrim' and time(occur_time)

>time('07:00:00') and time(occur_time)

order by occur_time asc受影響的行: 0

測試5:在cabid、occur_time列上建立組合索引(此時該錶上只有乙個組合索引,沒有單列索引)

結果:最少0.038s,最多0.305s

測試6:在cabid,occur_time,objectid,occupancy四個列上建立組合索引

結果:4.249s-4.703s

測試結果分析:

對比測試1、測試2可知,建立索引之後查詢速度大大提公升。

對比測試2、測試3可知,建立單列索引時,最好選擇在int、float型等基本型別的列上建索引,若在複雜資料型別如datetime等列上,效果較差,和沒建一樣。

對比測試2、測試4可知,增加單列索引並不一定能提高查詢速度。

對比測試2、4、5可知,組合索引比分別建兩個單列索引似乎更有效。

對比測試1、2、4、6可知,建組合索引時,並不是列越多越好,若與where子句無關的列參與進來會使得索引失去效果,甚至更糟。

Mysql 建立聯合索引注意事項

當乙個表有多條索引可走時,mysql 根據查詢語句的成本來選擇走哪條索引,聯合索引的話,它往往計算的是第乙個字段 最左邊那個 這樣往往會走錯索引.如 索引index 1 create time,category id index 2 category id 如果每天的資料都特別多,而且有很多cate...

mysql索引注意事項

在查詢條件中必須有復合索引還中最左側的列 在建立多列索引時,要根據業務需求,where子句中使用最頻繁的一列放在最左邊 假設你在表的state city和zip資料列上建立了復合索引。索引中的資料行按照state city zip次序排列,因此它們也會自動地按照state city和state次序排...

mysql索引注意事項

1.模糊查詢前導不會走索引 select id,user name,price code from user activity info where user name like zhang 如果非要使用前導索引的話可以借助apache的lucence索引工具 2.欄位預設值不要設定成null 如果...