复合where子句的顺序(MySQL,Postgres)

时间:2013-11-25 08:15:45

标签: mysql sql postgresql indexing

我有table ta int, b int, c int;复合index i (b, c)。我使用以下查询获取一些数据:

select * from t where c = 1 and b = 2;

所以问题是:MySQL和Postgres会使用索引i吗?并且,更一般地说:查询复合where子句顺序是否影响索引使用的可能性?

2 个答案:

答案 0 :(得分:1)

不是,订单无关紧要。

优化程序可以以最有效的方式执行大量智能操作。

答案 1 :(得分:1)

您需要做的是在两者中使用说明功能,看看发生了什么。如果它说它正在使用索引那么它就是。需要注意的是,在一个包含最少数据的小表中,postgresql(可能还有mysql)很可能会忽略索引并支持扫描。要获得真实的结果,请插入相当多的虚拟数据(至少20行,我总是做大约500行),并确保分析表格。此外,要意识到如果搜索条件将返回大部分表结果,它可能也不会使用索引(因为扫描会更快)。

  1. 创建表格
  2. 生成数据(可能使用generate_series)
  3. 运行explain select * from t where c=1 and b=2
  4. 在t(b,c)上创建索引`创建索引
  5. 分析表analyze t
  6. 运行explain select * from t where c=1 and b=2并与首次运行
  7. 进行比较

    希望这有助于回答这个问题,以及将来关于何时运行索引的其他问题。要回答你原来的问题,是的,一般来说,如果优化器确定这是获得结果的最佳方式,postgresql将使用索引,无论顺序如何。请记住分析您的表格,以便优化程序了解表格中的信息,并在表格中添加或删除大量数据时进行分析。根据您的PG版本和设置,其中一些可能会自动为您完成,但手动分析并不会受到影响,尤其是在测试此类事物时。

    编辑:索引顺序可能(特别是如果您不在查询中使用顺序并且优化程序使用索引)影响查询结果的顺序 - 返回的行可以在同一个顺序排序索引的顺序。