由於
contact
表存在多個(單列)索引,造成
delete
,update
,insert
操作時需要花費大量的時間刪除索引和重建索引。
通過把多個(單列)索引合併成乙個(多列)索引後,測試得出
delete
,update
,insert
操作時需要花費的時間大大縮短。
由於多個(單列)索引合併成乙個(多列)索引,可能會對之前單列索引欄位的查詢效能有影響,做了對比測試。結果如下
測試sql
語句查詢結果行數
多個(單列)索引執行時間
單個(多列)索引執行時間
結論刪除一天資料
declare
@mincreateddate datetime
;set
@mincreateddate=
convert
(datetime
,'2010-4-25 00:00:00'
,120)
;delete
from
u_ch_contact where
createddate between
@mincreateddate and
dateadd
(day,1,
@mincreateddate);
40822
行sql server execution times:
cpu time = 17031 ms, elapsed time = 633199 ms.(00
:10:34
)sql server execution times:
cpu time = 10405 ms, elapsed time = 39571 ms.(00
:00:39
)單個(多列)索引
明顯比多個(單列)索引
在del
資料時花費的時間要短很多。
customerid
(單列)索引和(多列)索引下查詢效能對比
select
* from
u_ch_contact where
customerid=
'f9f268c1-a234-4716-9fc8-00022b2de8e4'42行
sql server execution times:
cpu time = 0 ms, elapsed time = 1345 ms.(00
:00:01
)sql server execution times:
cpu time = 31049 ms, elapsed time = 21414 ms.(00
:00:21
)(單列)索引比(多列)索引在查詢資料花費時間要短很多,主要表現在(單列)索引用的是
索引查詢
,(多列)索引用的是
索引掃瞄
createdby
(單列)索引和(多列)索引下查詢效能對比
select
* from
u_ch_contact where
createdby=
'b8056067-5dba-41a0-b6cb-01cdfbac517e'
19099
行sql server execution times:
cpu time = 422 ms, elapsed time = 37038 ms.(00
:00:37
)sql server execution times:
cpu time = 35842 ms, elapsed time = 19708 ms.(00
:00:19
)奇怪!(多列)索引比(單列)索引花費時間要短
,但(單列)索引第二次執行
sql語句時間縮短為
(cpu time = 218 ms, elapsed time = 733 ms.
),而(多列)索引第二次執行
sql語句時間縮短接近一半
(cpu time = 35734 ms, elapsed time = 10806 ms.
)。同樣表現為(單列)索引用的是
索引查詢
,(多列)索引用的是
索引掃瞄
contacttime
(單列)索引和(多列)索引下查詢效能對比
select
* from
u_ch_contact where
contacttime between
'2010-03-01'
and'2010-03-30'
886469
行sql server execution times:
cpu time = 8047 ms, elapsed time = 120984 ms.(00
:02;01
)sql server execution times:
cpu time = 7579 ms, elapsed time = 143798 ms.(00
:02:24
)(單列)索引比(多列)索引在查詢資料花費時間要短些,但差距不是大很多。檢視執行計畫發現(單列)索引和(多列)索引用的都是
索引掃瞄
contacttelno
(單列)索引和(多列)索引下查詢效能對比
select
* from
u_ch_contact where
contacttelno=
'15121007351'36行
sql server execution times:
cpu time = 0 ms, elapsed time = 972 ms.(00
:00:01
)sql server execution times:
cpu time = 47282 ms, elapsed time = 17972 ms.(00
:00:41
)(單列)索引比(多列)索引在查詢資料花費時間要短很多,主要表現在(單列)索引用的是
索引查詢
,(多列)索引用的是
索引掃瞄
createdate
(單列)索引和(多列)索引下查詢效能對比
select
* from
dbo.
u_ch_contact where
createddate between
'2010-03-01'
and'2010-03-30'
886461
行sql server execution times:
cpu time = 7078 ms, elapsed time = 125751 ms.(00
:02:05
)sql server execution times:
cpu time = 7750 ms, elapsed time = 129782 ms.(00
:02:10
)(單列)索引比(多列)索引在查詢資料花費時間要短些,但非常細微的差距。檢視執行計畫發現(單列)索引和(多列)索引用的都是
索引掃瞄
escalatedto,escalated(2
列)索引和(多列)索引下查詢效能對比
select
* from
dbo.
u_ch_contact where
escalatedto=
'bdd4de94-a75e-4f00-9fd8-06917b856cc1'
andescalated=
0229
行sql server execution times:
cpu time = 15 ms, elapsed time = 311 ms.(00
:00:00
)sql server execution times:
cpu time = 35204 ms, elapsed time = 11806 ms.(00
:00:11
)(單列)索引比(多列)索引在查詢資料花費時間要短很多,主要表現在(單列)索引用的是
索引查詢
,(多列)索引用的是
索引掃瞄
escalatedto,status(2
列)索引和(多列)索引下查詢效能對比
select
* from
dbo.
u_ch_contact where
escalatedto=
'bdd4de94-a75e-4f00-9fd8-06917b856cc1'
andstatus=
36004
行sql server execution times:
cpu time = 328 ms, elapsed time = 7449 ms.
(00:00:07)
sql server execution times:
cpu time = 34811 ms, elapsed time = 13253 ms.(00
:00:13
)(單列)索引比(多列)索引在查詢資料花費時間要短很多,主要表現在(單列)索引用的是
索引查詢
,(多列)索引用的是
索引掃瞄
通過以上對比發現:
查詢結果行數不大的情況下
: (單列)索引用
索引查詢明顯比
(多列)索引用的
索引掃瞄有效率。
查詢結果行數大的情況下:都是用索引掃瞄,相差的資料就不是特別明顯。
千萬級別資料表,單列索引和多列索引效能對比
由於contact表存在多個 單列 索引,造成delete update insert操作時需要花費大量的時間刪除索引和重建索引。通過把多個 單列 索引合併成乙個 多列 索引後,測試得出delete update insert操作時需要花費的時間大大縮短。由於多個 單列 索引合併成乙個 多列 索引,...
千萬級別資料表,單列索引和多列索引效能對比
由於contact表存在多個 單列 索引,造成delete update insert操作時需要花費大量的時間刪除索引和重建索引。通過把多個 單列 索引合併成乙個 多列 索引後,測試得出delete update insert操作時需要花費的時間大大縮短。由於多個 單列 索引合併成乙個 多列 索引,...
MySQL單列索引和多列索引
在設計mysql表索引的時候,可能有個問題,就是多個單列索引好,還是設計為多列索引好 下面從不同角度分析下這個問題 1.多個單列索引 定義 即是在表中在需要索引的字段上為每個字段設計乙個索引 特點 簡單,索引個數多 2.多列索引 定義 即是在表中根據查詢需求在多個欄位上設計乙個索引 特點 稍微複雜,...