一、不合理的索引
----例:表record有620000行,試看在不同的索引下,下面幾個
sql的運**況:
----1.在date上建有一非個群集索引
selectcount(*)fromrecordwheredate>
'19991201'anddate<'19991214'andamount>
2000(25秒)
selectdate,sum(amount)fromrecordgroupbydate
(55秒)
selectcount(*)fromrecordwheredate>
'19990901'andplacein('bj','sh')(27秒)
----分析:
----date上有大量的重複值,在非群集索引下,資料在物理上隨機存放在資料頁上,在
範圍查詢時,必須執行一次表掃瞄才能找到這一範圍內的全部行。
----2.在date上的乙個群集索引
selectcount(*)fromrecordwheredate>
'19991201'anddate<'19991214'andamount>
2000(14秒)
selectdate,sum(amount)fromrecordgroupbydate
(28秒)
selectcount(*)fromrecordwheredate>
'19990901'andplacein('bj','sh')(14秒)
----分析:
----在群集索引下,資料在物理上按順序在資料頁上,重複值也排列在一起,因而在範
圍查詢時,可以先找到這個範圍的起末點,且只在這個範圍內掃瞄資料頁,避免了大範
圍掃瞄,提高了查詢速度。
----3.在place,date,amount上的組合索引
selectcount(*)fromrecordwheredate>
'19991201'anddate<'19991214'andamount>
2000(26秒)
selectdate,sum(amount)fromrecordgroupbydate
(27秒)
selectcount(*)fromrecordwheredate>
'19990901'andplacein('bj','sh')(<1秒)
----分析:
----這是乙個不很合理的組合索引,因為它的前導列是place,第一和第二條
sql沒有引
用place,因此也沒有利用上索引;第三個
sql使用了place,且引用的所有列都包含在組
合索引中,形成了索引覆蓋,所以它的速度是非常快的。
----4.在date,place,amount上的組合索引
selectcount(*)fromrecordwheredate>
'19991201'anddate<'19991214'andamount>
2000(<1秒)
selectdate,sum(amount)fromrecordgroupbydate
(11秒)
selectcount(*)fromrecordwheredate>
'19990901'andplacein('bj','sh')(<1秒)
----分析:
----這是乙個合理的組合索引。它將date作為前導列,使每個
sql都可以利用索引,並
且在第一和第三個
sql中形成了索引覆蓋,因而效能達到了最優。
----5.總結:
----預設情況下建立的索引是非群集索引,但有時它並不是最佳的;合理的索引設計要
建立在對各種查詢的分析和**上。一般來說:
----①.有大量重複值、且經常有範圍查詢
(between,>,<,>=,<=)和orderby
、groupby發生的列,可考慮建立群集索引;
----②.經常同時訪問多列,且每列都含有重複值可考慮建立組合索引;
----③.組合索引要盡量使關鍵查詢形成索引覆蓋,其前導列一定是使用最頻繁的列。
二、不充份的連線條件:
----例:表card有7896行,在card_no上有乙個非聚集索引,表account有191122行,在
account_no上有乙個非聚集索引,試看在不同的表連線條件下,兩個
sql的執**況:
selectsum(a.amount)fromaccounta,
cardbwherea.card_no=b.card_no(20秒)
----將
sql改為:
selectsum(a.amount)fromaccounta,
cardbwherea.card_no=b.card_noanda.
account_no=b.account_no(<1秒)
----分析:
----在第乙個連線條件下,最佳查詢方案是將account作外層表,card作內層表,利用
card上的索引,其i/o次數可由以下公式估算為:
----外層表account上的22541頁+(外層表account的191122行*內層表card上對應外層
表第一行所要查詢的3頁)=595907次i/o
----在第二個連線條件下,最佳查詢方案是將card作外層表,account作內層表,利用1
如何讓你的SQL執行得更快
人們在使用 sql時往往會陷入乙個誤區,即太關注於所得的結果是否正確,而忽略了不同的實現方法之間可能存在的效能差異,這種效能差異在大型的或是複雜的資料庫環境中 如聯機事務處理 oltp 或決策支援系統 dss 中表現得尤為明顯。筆者在工作實踐中發現,不良的 sql往往來自於不恰當的索引設計 不充份的...
加入sql標籤,讓sql語句更快的執行
原本的sql語句執行 select from 表單 這種方式會獲取表中所有字段,專案大時會特別的慢 select from video where id 咱們在查詢之前插入sql標籤 sql標籤中的id務必與之後include中的refid一致 id,title 新增完sql標籤以後 標籤內部只有i...
如何讓win10系統執行更快
電腦執行的速度主要看硬體和軟體的配合使用,但是硬體從電腦買來的時候基本上是固定了的。除非對硬體進行公升級。在硬體不變的前提下如何讓電腦執行快一點的呢?下面以win10為例,教你們設定兩個地方,讓win10執行得更加快速點,跑起來更加溜。方法步驟 設定win10為最佳效能模式 設定win10電源模式為...