2

有没有办法指示 MySQL 即使索引可用也不使用它?同样,即使列可用也不使用?(例如,只需使用“列不存在”来错误查询。)在准备删除索引或字段时拥有此功能会很有用。

Postgres 怎么样?

4

2 回答 2

2

免责声明:仅 PostgreSQL……8 年多来没有使用 MySQL。

此外,您似乎没有针对查询,但我想我还是会提供它(也许对于任何有类似问题的人)。

这有点小技巧,但如果您考虑下表:

create table foo (
  id integer 
);

create index foo_ix1 on foo (id);

insert into foo generate_series (1, 1000000);

正如您所料,这将使用索引:

explain
select * from foo
where id between 5 and 10;

除非您有针对该特定函数的基于函数的索引,否则将 ANY 函数应用于列应该使规划器无法使用该索引。简单的例子:

explain
select * from foo
where id + 0 between 5 and 10;

我没有更改结果,但我强制进行了全面扫描。

例如,对于文本列,您可以只附加一个空字符串: text_field || ''

于 2021-03-12T20:46:14.070 回答
1

在 PostgreSQL 中,您可以关闭索引扫描:

set enable_indexscan to 'off';
set enable_indexonlyscan to 'off';
set enable_bitmapscan to 'off';

或者让它们变得非常昂贵:

set random_page_cost to 10000000;
于 2021-03-12T19:25:04.437 回答