對於大資料量的**,尤其是百萬行以上的資料表,一定要對其建立索引,否則查詢速度極慢。(參考後面的測試結果)
建立索引時需注意:
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快速、大批量地匯入資料,請看
建立表:
createtable
`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列上建立索引
createindex 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列上建立索引
createindex 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 如果...