成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

程序員你真的了解SQL索引嗎?

運維 數據庫運維 SQL Server
今天我們將通過對索引使用原則的討論,來讓大家更深入的了解SQL索引。大家可以思索,自己是否真的了解它。

這篇主要來分析下索引的優缼點,以及如何正確使用索引。

索引的優點:這個顯而易見,正確的索引會大大提高數據查詢,對結果進行排序、分組的操作效率。

索引的缺點:優點顯而易見,同樣缺點也是顯而易見:

1:創建索引需要額外的磁盤空間,索引最大一般為表大小的1.2倍左右。

2:在表數據修改時,例如增加,刪除,更新,都需要維護索引表,這是需要系統開銷的。

3:不合理的索引設計非但不能利于系統,反而會使系統性能下降。例如我們在一個創建有非聚集索引的列上做范圍查詢,此列的索引不會起到任何的優化效果,反而由于數據的修改而需要維護索引表,從而影響了對數據修改的性能。

實際例子:還是拿前兩篇文章的學生表來講吧,要查詢成績在50分以上的學生信息select * from student where score>50。學生表包含了100000行記錄,而且學分是隨機生成的,這樣從數據量以及數據分布上都有一定的保障。

第一種情況:學生表有索引

1:存在聚集索引,但聚集索引不在學分上,這里只分析學分不是聚集索引的情況。

(1):學分上沒有索引。此時SQL會通過聚集索引來查找數據,這點估計大家都會知道。

(2):學分上有索引。這種情況,SQL會使用上學分上的索引嗎?這個問題估計不是每個人都能回答正確的。既然學分上有索引,而where中又有此列,理應使用了索引,但實際情況并沒有使用索引。因為出現了范圍查找,如果一個索引一個索引的比較,在性能上比起直接按聚集索引查找全部數據后再過濾來的差。那學分上的索引什么時候  SQL會優先考慮呢?當score指定為一個具體值時,就能使用學分索引查找了。從下圖的SQL執行計劃可以得知。

     

2:不存在聚集索引。

 (1):在學分上沒有索引,其它字段有索引,這種情況就會出現表掃描。

 (2):在學分上有索引,是否會按照學分上的索引進行查找呢?由于上面的表數據量也不少,一般會認為SQL不會采用表掃描,因為會查找全部記錄,但實際情況表明SQL對于范圍查詢也行采用表掃描而不是按學生索引查詢。我們也可以強制SQL按學分查詢,于是有下面的SQL執行計劃比較,我們可以清楚的看出,強制使用學分做為索引查詢比表搜索的性能要差很多。

 

第二種情況:學生表沒有索引。這個情況沒有分析的價值。

什么字段不適合創建索引?

1:不經常使用的列,這種索引帶來缺點遠大于帶來的優點。

2:邏輯性的字段,例如性別字段等等,匹配的記錄太多,和表掃描比起來不相上下。

3:字段內容特別大的字段,例如text等,這會大大增大索引所占用的空間以及索引更新時的速度。
   

我們說SQL在維護索引時要消耗系統資源,那么SQL維護索引時究竟消耗了什么資源?會產生哪些問題?究竟怎樣才能優化字段的索引?

第一:當數據頁達到了8K(數據頁最大為8K) 容量,如此時發生插入或更新數據的操作,將導致頁的分裂。

1、聚集索引的情況下:聚集索引將被插入和更新的行指向特定的頁,該頁由聚集索引關鍵字決定;

2、只有堆的情況下:有空間就可以插入新的行,對行數據的更新需要更多的空間,如果大于了當前頁的可用空間,行就被移到新的頁中,且在原位置留下一個轉發指針,指向被移動的新行,如果具有轉發指針的行又被移動了,那么原來的指針將重新指向新的位置;

3、堆中有非聚集索引,盡管插入和更新操作,不會發生頁分裂,但非聚集索引上仍然產生頁分裂。

總結:無論有無索引,很多數據將保留在老頁面,其它將放入新頁面,并且新頁面可能被分配到任何可用的頁,頻繁頁分裂,表會產生大量數據碎片,直接造成I/O 效率下降。

引出問題:為什么數據庫對于varchar最大值設置為8000,而不是10000呢?

答:是由于數據頁大小最大為8K。

第二:針對上述索引可能造成的頁分頁的解決方案,填充因子。

創建索引時,可以為索引指定一個填充因子,在索引的每個葉級頁面上保留一定百分比的空間,將來數據可以進行擴充和減少頁分裂。值從0到100的百分比數值,100 時表示將數據頁填滿。不對數據進行更改時(例如只讀表中)才用此設置,實用價值不大。值越小則數據頁上的空閑空間越大,可以減少在索引增長過程中進行頁分裂,但需要占用更多的硬盤空間。填充因子也不能設置過小,過小會影響SQL的讀取性能,因為填充因子造成數據頁的增多。一般我們公司設置的填充因子是80。

索引是否是一塵不變的?

隨著業務的變化,數據的變化,會發生有些索引的用處可能發生變化,例如:

1:原來主要靠用戶名搜索記錄,現在業務更改為按用戶所在城市搜索等等,此時我們需要即時變更表索引以適應新業務的變化,即數據和使用模式發生了大幅度變化。

2:系統上線前不合理的索引,隨著數據的增加,缺點越來越明顯,此時需要調整索引。

3:隨著數據的增加,產生了越來越多的頁分裂,導致索引性能越來越低。

上面的幾種情況,我們就需要選擇重建索引來徹底解決問題。

總結索引使用原則

1:不要索引數據量不大的表,對于小表來講,表掃描的成本并不高。

2:不要設置過多的索引,在沒有聚集索引的表中,最大可以設置249個非聚集索引,過多的索引首先會帶來更大的磁盤空間,而且在數據發生修改時,對索引的維護是特別消耗性能的。

3:合理應用復合索引,有某些情況下可以考慮創建包含所有輸出列的覆蓋索引。

4:對經常使用范圍查詢的字段,可能考慮聚集索引。

5:避免對不常用的列,邏輯性列,大字段列創建索引。

原文鏈接:http://www.cnblogs.com/ASPNET2008/archive/2010/12/19/1910218.html

【編輯推薦】

  1. 數據庫索引,你該了解的幾件事
  2. 理解SQL Server 2008索引的存儲結構
  3. 詳細講解SQL Server索引的性能問題

 

責任編輯:彭凡 來源: 博客園
相關推薦

2009-05-21 15:58:12

程序員工作經驗職場

2021-01-15 07:44:21

SQL注入攻擊黑客

2019-12-04 12:33:48

程序員技術設計

2019-07-25 07:42:35

程序員編程語言Python

2012-06-08 03:32:26

程序員電子郵件

2022-07-26 00:00:22

HTAP系統數據庫

2014-04-17 16:42:03

DevOps

2019-07-29 11:51:18

程序員設計軟件

2021-11-09 09:48:13

Logging python模塊

2014-11-28 10:31:07

Hybrid APP

2023-03-16 10:49:55

2020-02-27 10:49:26

HTTPS網絡協議TCP

2019-09-16 08:40:42

2019-11-18 10:06:44

程序員CDN靜態資源

2021-04-16 10:50:28

程序員技能開發者

2018-10-10 15:52:48

程序員代碼編程

2012-05-31 09:56:54

云安全

2023-10-24 08:53:24

FutureTas并發編程

2019-11-06 09:52:01

JavaScript單線程非阻塞

2022-03-14 07:53:27

ELTETL大數據
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久草精品在线 | 欧美精品中文 | 视频1区2区 | 九九色九九| 中文字幕免费视频 | 欧美中文一区 | 久久91精品国产一区二区 | 国产精品久久久久久久白浊 | 国产精品一区二区三区在线 | 在线色网 | 日本国产高清 | 亚洲国产精品久久久久秋霞不卡 | 精品网站999www| 91高清视频在线观看 | www.99精品| 亚洲一二三区不卡 | 99久久久久国产精品免费 | 日本高清aⅴ毛片免费 | 射久久 | 日日操夜夜操天天操 | 91精品久久久久久久久中文字幕 | 成人午夜视频在线观看 | 国产欧美性成人精品午夜 | 亚洲自拍偷拍欧美 | 免费国产一区 | 成人午夜影院 | 欧美精品一二三区 | 99免费精品| 亚洲国产网站 | 中文字幕在线观看第一页 | 国产精品美女久久久久aⅴ国产馆 | 特级黄一级播放 | 午夜久久| 成人国产精品久久 | 一区二区三区四区国产 | 精品av| 欧美天堂在线观看 | 91精品国产一区二区三区 | 日韩精品在线看 | 免费在线播放黄色 | 免费观看的av |