如果你的系統需要在一張很大的表上建立一個索引,你會考慮哪些因素?
如果你的系統需要在一張很大的表上建立一個索引,你會考慮哪些因素?
1)關於大表建立索引,如果從綜合考慮多個維度來看,我會考慮:
1. 為什麼需要建立索引,即索引建立的之後的效能是否能夠提升
2. 建立什麼樣的索引,即索引的型別
3. 建立索引的影響,此時需要了解索引的建立過程,以及如果最佳化索引的建立效率以減少對業務的影響
4. 什麼時候建立索引
5. 有沒有其他方式來替代這個過程
2)以下關於幾種考慮因素的分析過程:
1.為什麼需要建立索引
A. 結合應用查詢場景,比如是否存在相應關鍵業務的SQL需要使用到索引相關欄位的條件,其SQL執行頻繁是否較大;該部分業務SQL根據索引所返回的結果集大小,比如一個表有一個億,每次根據相應條件返回了幾千萬的結果集,那建立該索引是否真正有效
B. 結合表資料分佈情況,第一個是列資料選擇性問題,如果選擇性不高,有時索引回表的cost比全表掃描大,最佳化器選擇執行計劃路徑是可能不選擇索引。第二個列資料較為無序,導致建立索引後叢集因子較高,增加索引回表成本等。
C. 結合表資料變化情況,,增加一個索引便需要多維護一個索引,對一張資料變化頻率較高的表,索引太多會增加dml操作特別是insert時的索引維護成本,影響執行效率
2.建立什麼樣的索引
A.如果使用多個條件便可以建立複合索引
B.如果業務sql條件存在函式,那就要考慮函式索引
C.如果一個列基數較低,那是否考慮選擇點陣圖索引,前提是其列資料很少更新
D.分割槽表是否建立本地索引
3.建立索引的影響
我們都知道建立索引會與dml操作相互影響以及還有大量的IO操作等。
首先,是瞭解建立索引的過程,才能解決建立索引帶來的問題,我做了個建立索引的實驗,並透過10046追蹤,建立索引的主要過程如下:
A. 開始讀取資料字典如統計資訊,物件資訊等
B. 使用share mode nowait將表鎖住,此時其他會話只可讀該表但無法修改該表。
C. 讀取一些資訊等判斷後在obj$初始化索引物件資訊
D.開始抓取表資料等一系列大量IO操作,該過程時間相對較長:
E.往seg$,icol$,ind$等資訊表中插入相應資訊
完成整個索引排序建立索引,掃描表
從以上索引的建立過程,我們可以考慮的問題點總結是:
A.此過程會加共享鎖以至於阻塞dml操作,因此建立索引儘量選擇業務空閒期進行,同時也可以考慮online方式建立。
B.此過程需要大量讀取表資料並排序操作,以及insert update操作,此時需要考慮儲存IO效能
C.此過程會產生大量redo,可以考慮nologing模式
D.同時需要考慮索引的空間大小,關注表空間和臨時表空間
E.同時可以使用並行加快操作,這也是我們常做的。
4. 什麼時候建立索引
不用考慮,業務空閒期
5. 有沒有其他方式來替代這個過程
可以考慮資料遷移方式,建立一張新表新增索引,線上遷入資料後 rename表
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29863023/viewspace-2673707/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 最佳化你的系統--索引(一) 正確使用索引索引
- 2.2 資料庫建立之前需考慮的事資料庫
- 建立一個成功的App前要考慮的5個要點APP
- 索引組織表上建立BITMAP索引(一)索引
- 某系統上一口氣建立了20多個索引索引
- 建立你的第一個JavaScript庫JavaScript
- MySQL如何建立一個好索引?建立索引的5條建議【宇哥帶你玩轉MySQL 索引篇(三)】MySql索引
- 在 Linux 上為你的任務建立一個自定義的系統托盤指示器Linux
- 如果讓你設計一個高併發的訊息中介軟體,你會怎麼做?
- 如果Java是你唯一的愛Java
- 搭建Prometheus平臺,你必須考慮的6個因素Prometheus
- JVM筆記--如果你寫JVM,最需要考慮的重要結構是什麼?JVM筆記
- 一個文章表的 MySQL 索引怎麼建立合理MySql索引
- 如果你也用Chrome,你會發現這樣一條警告!!!Chrome
- 【譯】13 個你應該選擇/考慮使用 Flutter 的理由Flutter
- 調教屬於你的“賈維斯”(給自己挖了一個很大的坑)
- Java面試題:如果你這樣做,你會後悔的,兩次啟動同一個執行緒~~~Java面試題執行緒
- 為你的論壇系統新增一個『提及』功能
- 一個強化系統看出你的策劃段位!
- 【Oracle】-【建立索引】-建立索引的操作原理與一些體會Oracle索引
- 【TUNE_ORACLE】你建立的索引為什麼不工作了?(一)Oracle索引
- 選型招聘系統需要考慮的幾個要點
- 從0系統學Android--1.3建立你的第一個 Android 專案Android
- 如果做一個全新的toB端的一複雜系統,在人員時間充裕的情況下,你會做那些準備工作和安排確保專案準時上線
- 想去學習Python,這些問題你一定要考慮!Python
- 什麼樣的IT公司你應該考慮辭職?
- 建立一個自己的 Linux系統Linux
- 在Linux上使用Python和Flask建立你的第一個應用LinuxPythonFlask
- 你可能會用到的一個路由介面卡路由
- 我需要在Web上完成一個圖片上傳的功能Web
- 快速建立你的第一個Spring Boot專案Spring Boot
- Git 系列(三):建立你的第一個 Git 倉庫Git
- 手把手教你建立你的第一個 NPM 包NPM
- 如果讓你手寫個棧和佇列,你還會寫嗎?佇列
- 你一定也上傳過的11張社交網路圖片
- 十個你需要在 PHP 7 中避免的坑PHP
- (一)你的第一個Socket程式
- oracle建立一張與其他表相同表結構的空表Oracle