我有table t
列a int, b int, c int
;复合index i (b, c)
。我使用以下查询获取一些数据:
select * from t where c = 1 and b = 2;
所以问题是:MySQL和Postgres会使用索引i
吗?并且,更一般地说:查询复合where子句顺序是否影响索引使用的可能性?
答案 0 :(得分:1)
不是,订单无关紧要。
优化程序可以以最有效的方式执行大量智能操作。
答案 1 :(得分:1)
您需要做的是在两者中使用说明功能,看看发生了什么。如果它说它正在使用索引那么它就是。需要注意的是,在一个包含最少数据的小表中,postgresql(可能还有mysql)很可能会忽略索引并支持扫描。要获得真实的结果,请插入相当多的虚拟数据(至少20行,我总是做大约500行),并确保分析表格。此外,要意识到如果搜索条件将返回大部分表结果,它可能也不会使用索引(因为扫描会更快)。
explain select * from t where c=1 and b=2
analyze t
explain select * from t where c=1 and b=2
并与首次运行希望这有助于回答这个问题,以及将来关于何时运行索引的其他问题。要回答你原来的问题,是的,一般来说,如果优化器确定这是获得结果的最佳方式,postgresql将使用索引,无论顺序如何。请记住分析您的表格,以便优化程序了解表格中的信息,并在表格中添加或删除大量数据时进行分析。根据您的PG版本和设置,其中一些可能会自动为您完成,但手动分析并不会受到影响,尤其是在测试此类事物时。
编辑:索引顺序可能(特别是如果您不在查询中使用顺序并且优化程序使用索引)影响查询结果的顺序 - 返回的行可以在同一个顺序排序索引的顺序。