全表掃描和全索引掃描繼續(PG-TiDB)

xuexiaogang發表於2023-02-20

   上週我做了Oracle和MySQL的。這兩個是一樣的結論,就是select count(*) from t不帶where條件都是全索引。今天看看PostgreSQL和TiDB的。我們只有一套PG庫,沒有TiDB,這些都是憑藉興趣學習的。所以這上面如果有錯的還請指出。

PG14中一個表,表結果如下:有10萬條資料。

全表掃描和全索引掃描繼續(PG-TiDB)

看執行計劃出現的都是 Seq Scan,並沒有看到使用到索引的樣子。這是全表查詢的姿勢。

全表掃描和全索引掃描繼續(PG-TiDB)

我只選擇主鍵列,想透過不用會表的方式看看。結果紅框的SQL也沒有達到預期效果。

全表掃描和全索引掃描繼續(PG-TiDB)


只有到了使用where條件以後的,select id,才出現了期望得到的僅使用索引的  index only scan的效果。(這裡我是和燦燦問了一下,確定了和我最初想法不一樣)這個是類似MySQL索引覆蓋的效果。

全表掃描和全索引掃描繼續(PG-TiDB)

如果是*的話,使用索引就不是索引覆蓋了。 Index Scan和上面的index only scan 是有區別。


PG的做完了,看看TiDB的(TiDB相容MySQL看看這個繼承了嗎?)


TiDB的表結構情況和資料情況

全表掃描和全索引掃描繼續(PG-TiDB)


實測結果,也沒有和MySQL一樣,無論是*還是主鍵。不帶where條件都是全表查。沒有用到全索引掃描。

全表掃描和全索引掃描繼續(PG-TiDB)


但是如果用到除了主鍵之外的索引列時候。就出現預期的 IndexFullScan效果了。

全表掃描和全索引掃描繼續(PG-TiDB)


今天小結一下:PG和TiDB在這個場景上都和Oracle MySQL不一樣。PG不用where條件是基本不行了。TiDB是需要指定一下列才行。Oracle和MySQL是count(*)就行。



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/637517/viewspace-2936058/,如需轉載,請註明出處,否則將追究法律責任。

相關文章