全表掃描和全索引掃描
有人向我提問: oracle 的select count(*) from table 不走索引,mysql(版本>=5.7) select count(*) from table是自動走索引的,是這樣嗎?因為提問題的人查過MySQL的count(*)是做過最佳化的。
要回答這個問題,還是用實驗來說明。在Oracle 19C中,我們建立一個表,並且寫入100萬資料。如圖1
圖1
使用Oracle的執行跟蹤 set autotrace on; 從實際執行的情況看資料庫具體的執行消耗,這樣的執行計劃更加準備。如圖2
圖2
我們看到了 INDEX FAST FULL SCAN。
如果我們查一個不帶索引的列,那麼比如發生的是全表掃描。如圖3
圖3
那麼我們來看MySQL的。只用5條就可以說明問題了。xxg表有一個主鍵。(必須有主鍵,沒有主鍵就不是這個效果了)。注意看下圖有extra中有一個using index。這個在MySQL中叫做索引覆蓋。如圖4
圖4
索引覆蓋的意思是僅僅用到了索引,其他沒用到。type這裡顯示的是 index 比如一個表有50列,該表有50G,如果每列長度大致相當,那麼其中一列大約有1/50的大小,即1G左右。索引覆蓋就是查1G的索引就行,而不是掃描50G。這個就和Oracle中的INDEX FAST FULL SCAN有點相似了。
如果說MySQL對count(*)做了最佳化,那麼也可以說Oracle對count(*)也做了最佳化。其實我設想,可能就是這樣設計的。Oracle和MySQL在這個場景上是一致的。所以不存在一個全表,一個使用索引的區別。(我個人其實覺得全索引掃描、全索引覆蓋掃描是用到了索引,但是和我們通常說的用到索引返回少量資料還是有一點區別的)
當然如果沒有用到索引,type這裡顯示的就是ALL了。請看下圖5。那麼和Oracle的 TABLE ACCESS FULL也是一樣的。
圖5
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/637517/viewspace-2935660/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 全表掃描和全索引掃描繼續(PG-TiDB)索引TiDB
- MySQL中的全表掃描和索引樹掃描MySql索引
- [20210220]全索引掃描快速索引掃描的邏輯讀.txt索引
- [20190815]索引快速全掃描的成本.txt索引
- oracle是如何進行全表掃描的Oracle
- 24_Oracle資料庫全表掃描詳解(四)_全表掃描生產最佳化案例三則Oracle資料庫
- 索引掃描可能不如全表掃描的場景的理解__純粹資料量而言,不涉及CLUSTERING_FACTOR索引
- [20210219]全表掃描邏輯讀問題.txt
- 【Oracle】 索引的掃描方式Oracle索引
- 關係型資料庫全表掃描分片詳解資料庫
- 23_Oracle資料庫全表掃描詳解(三)Oracle資料庫
- 22_Oracle資料庫全表掃描詳解(二)Oracle資料庫
- 21_Oracle資料庫全表掃描詳解(一)Oracle資料庫
- AWVS掃描器掃描web漏洞操作Web
- 技術分享 | 為什麼 SELECT 查詢選擇全表掃描,而不走索引?索引
- PostgreSQL DBA(55) - MVCC#8(對全表掃描的影響)SQLMVCC#
- 掃描器的存在、奧普 掃描器
- win10系統掃描器提示掃描不到掃描器如何解決Win10
- 掃描器
- 掃描王 for Mac專業圖片掃描工具Mac
- 智慧高速公路建設標準和指南全掃描(上)
- 怎麼解決因全表掃描帶來的 Buffer Pool 汙染
- PostgreSQL技術內幕(七)索引掃描SQL索引
- 什麼是漏洞掃描?漏洞掃描功能有哪些?
- 目錄掃描
- 埠掃描器
- python掃描埠Python
- DAST 黑盒漏洞掃描器 第四篇:掃描效能AST
- 電腦掃描檔案怎麼掃描 win10電腦掃描檔案方法介紹Win10
- 全棧工程師之路-React Native之掃描二維碼全棧工程師React Native
- AppBoxFuture: 二級索引及索引掃描查詢資料APP索引
- 京東掃描平臺EOS—JS掃描落地與實踐JS
- 掃描行為分析
- 綜合掃描工具
- 淺談掃描線
- P2032 掃描
- Nydus 映象掃描加速
- sonar(二)掃描配置