我有一个表t
,其中包含列a int, b int, c int
;复合 索引 i (b, c)
。我使用以下查询获取一些数据:
select * from t where c = 1 and b = 2;
所以问题是:MySQL 和 Postgres 会使用索引 i
吗?而且,更一般地说:查询复合 where 子句顺序是否会影响索引使用的可能性?
最佳答案
您需要做的是在两者中使用 explain 函数,看看发生了什么。如果它说它正在使用索引,那么它就是。需要注意的是,在数据最少的小表中,postgresql(也可能是 mysql)很可能会忽略索引并支持扫描。要获得真实结果,请插入相当多的虚拟数据(至少 20 行,我总是做大约 500 行)并确保分析表格。此外,请注意,如果搜索条件将返回大部分表结果,它也可能不会使用索引(因为扫描速度会更快)。
- 创建表
- 生成数据(可能使用 generate_series)
- 运行
explain select * from t where c=1 and b=2
- 创建索引`在 t(b,c) 上创建索引
- 分析表
分析t
- 运行
explain select * from t where c=1 and b=2
并与第一次运行比较
希望这将有助于回答这个问题,以及您将来可能遇到的有关索引何时运行的其他问题。不过,要回答您最初的问题,是的,如果优化器确定这是获得结果的最佳方式,那么 postgresql 通常会使用索引,而不管顺序如何。记住要分析你的表,这样优化器就会知道你的表中有什么信息,并在任何时候在你的表中添加或删除大量数据时对其进行分析。根据您的 PG 版本和设置,其中一些可能会自动为您完成,但手动分析也无妨,尤其是在测试此类事情时。
编辑:索引顺序可能(特别是如果您不在查询中使用排序依据而优化器使用索引)影响查询结果的顺序——返回的行可能按相同顺序排序索引的顺序。
关于mysql - 复合 where 子句的顺序(MySQL、Postgres),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20187584/