查询除了一列意外_想让你的查询语句变快吗?
蔣蔣~大家吼啊 相信大家都遇到過查詢語句龜速的情況,那心情,那酸爽
大家別怕,我們有索引這個東西
索引:索引提供指向存儲在表的指定列中的數據值的指針,然后根據您指定的排序順序對這些指針排序。數據庫使用索引以找到特定值,然后順指針找到包含該值的行。這樣可以使對應于表的SQL語句執行得更快,可快速訪問數據庫表中的特定信息。
而索引也有很多種類的
索引分類
邏輯:單行索引、多行索引、唯一索引、非唯一索引、函數索引
物理:分區索引、非分區索引、B-tree索引、bitmap索引
B-tree索引
它的存儲結構類似于書的目錄索引結構,有分支節點和葉子節點,分支節點相當于書的大目錄,葉子節點相當于具體到頁的索引。
優點:適合高基數的列(唯一值多),適合與大量的增、刪、改(OLTP)。
缺點:不適合鍵值重復率較高的字段上使用。
Bitmap索引
是由一串位所組成的。如果某一位置位(為1),就表示該位所對應的行包含索引的鍵值。如果該位沒有被置位(為0),就表示該位所對應的行不包含索引的鍵值。
優點:OLAP 例如報表類數據庫 重復率高的數據 特定類型的查詢例如count、or、and等邏輯操作因為只需要進行位運算即可得到我們需要的結果。
缺點:不適合重復率低的字段,還有經常DML操作(insert,update,delete),因為位圖索引的鎖代價極高,修改一個位圖索引段影響整個位圖段,所以對于OLTP 系統位圖索引基本上是不適用的。
索引掃描的種類
根據索引的類型與where限制條件的不同分類
(1) 索引唯一掃描(index unique scan)通過unique或primary key約束來保證只返回一條數據,那么優化器就會選擇索引唯一掃描。
(2) 索引范圍掃描(index range scan)使用一個索引存取多行數據或者索引鍵非唯一,即使返一行記錄也走范圍掃描。
(3) 索引跳躍掃描(index skip scan)當表有一個復合索引,而在查詢中有除了索引中第一列的其他列作為條件,這時候查詢計劃就有可能使用到。
(3) 索引全掃描(index full scan)和索引快速掃描(index fast full scan)如果想搜索的列都包含在索引里面,那么index full scan 和 index fast full scan 都可以被采用代替full table scan。
index full scan首先要找到索引的根,然后通過枝節點找到第一個葉節點,然后再順著葉節點鏈掃描整個索引,只能使用單塊讀,會發現大量的db file sequential read等待。
index fast full scan對索引的掃描可以根據該索引的extent來進行,采用多塊讀的方式進行。因此在這類操作中,我們可以看到會話會大量的出現db file scattered read等待。
索引的適用場合
B*Tree索引
常規索引,多用于oltp系統,快速定位行,應建立于存在很少相同值的列。
反向索引
B*Tree的衍生產物,應用于特殊場合,在并發環境序列增加的列上建立,不適合做范圍掃描。
降序索引
B*Tree的衍生產物,應用于有降序排列的搜索語句中,索引中儲存了降序排列的索引碼,提供了快速的降序搜索。
函數索引
B*Tree的衍生產物,應用于查詢語句條件列上包含函數的情況,索引中儲存了經過函數計算的索引碼值。可以在不修改應用程序的基礎上能提高查詢效率。
位圖索引
位圖方式管理的索引,適用于OLAP(在線分析)和DSS(決策處理)系統,適合集中讀取,不適合插入和修改,提供比B*Tree索引更節省的空間。
常見幾種不走索引的場景
(1)隱式類型轉換
(2)索引失效
(3)like '%***'
(4)is null 或者is not null
(5)使用<> 或者!=
(6)在索引列上使用函數
(7)在索引列上運算
點點關注不迷路~點點轉發真威武~每日更新最新動態~謝謝各位老爺ヾ(?゚▽゚)
總結
以上是生活随笔為你收集整理的查询除了一列意外_想让你的查询语句变快吗?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: api php usdt 以太坊_以太坊
- 下一篇: 新建文件注释_PDF汇总注释原来如此简单