千萬級別資料表,單列索引和多列索引效能對比

2022-04-04 07:27:04 字數 4024 閱讀 6561

由於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' and escalated=0

229行

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' and status=3

6004 行

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)

(單列)索引比(多列)索引在查詢資料花費時間要短很多,主要表現在(單列)索引用的是索引查詢,(多列)索引用的是索引掃瞄

通過以上對比發現:

查詢結果行數不大的情況下: (單列)索引用索引查詢明顯比(多列)索引用的索引掃瞄有效率。

查詢結果行數大的情況下:都是用索引掃瞄,相差的資料就不是特別明顯。

摘自:踏雪無痕的blog

千萬級別資料表,單列索引和多列索引效能對比

由於contact表存在多個 單列 索引,造成delete update insert操作時需要花費大量的時間刪除索引和重建索引。通過把多個 單列 索引合併成乙個 多列 索引後,測試得出delete update insert操作時需要花費的時間大大縮短。由於多個 單列 索引合併成乙個 多列 索引,...

千萬級別資料表,單列索引和多列索引效能對比

由於 contact 表存在多個 單列 索引,造成 delete update insert 操作時需要花費大量的時間刪除索引和重建索引。通過把多個 單列 索引合併成乙個 多列 索引後,測試得出 delete update insert 操作時需要花費的時間大大縮短。由於多個 單列 索引合併成乙個 ...

MySQL單列索引和多列索引

在設計mysql表索引的時候,可能有個問題,就是多個單列索引好,還是設計為多列索引好 下面從不同角度分析下這個問題 1.多個單列索引 定義 即是在表中在需要索引的字段上為每個字段設計乙個索引 特點 簡單,索引個數多 2.多列索引 定義 即是在表中根據查詢需求在多個欄位上設計乙個索引 特點 稍微複雜,...