上周我做了Oracle和MySQL的。这两个是一样的结论,就是select count(*) from t不带where条件都是全索引。今天看看PostgreSQL和TiDB的。我们只有一套PG库,没有TiDB,这些都是凭借兴趣学习的。所以这上面如果有错的还请指出。
PG14中一个表,表结果如下:有10万条数据。
看执行计划出现的都是 Seq Scan,并没有看到使用到索引的样子。这是全表查询的姿势。
我只选择主键列,想通过不用会表的方式看看。结果红框的SQL也没有达到预期效果。
只有到了使用where条件以后的,select id,才出现了期望得到的仅使用索引的 index only scan的效果。(这里我是和灿灿问了一下,确定了和我最初想法不一样)这个是类似MySQL索引覆盖的效果。
如果是*的话,使用索引就不是索引覆盖了。 Index Scan和上面的index only scan 是有区别。
PG的做完了,看看TiDB的(TiDB兼容MySQL看看这个继承了吗?)
TiDB的表结构情况和数据情况
实测结果,也没有和MySQL一样,无论是*还是主键。不带where条件都是全表查。没有用到全索引扫描。
但是如果用到除了主键之外的索引列时候。就出现预期的 IndexFullScan效果了。
今天小结一下:PG和TiDB在这个场景上都和Oracle MySQL不一样。PG不用where条件是基本不行了。TiDB是需要指定一下列才行。Oracle和MySQL是count(*)就行。
