mysql - 复合 where 子句的顺序(MySQL、Postgres)

标签 mysql sql postgresql indexing

我有一个表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 行)并确保分析表格。此外,请注意,如果搜索条件将返回大部分表结果,它也可能不会使用索引(因为扫描速度会更快)。

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

希望这将有助于回答这个问题,以及您将来可能遇到的有关索引何时运行的其他问题。不过,要回答您最初的问题,是的,如果优化器确定这是获得结果的最佳方式,那么 postgresql 通常会使用索引,而不管顺序如何。记住要分析你的表,这样优化器就会知道你的表中有什么信息,并在任何时候在你的表中添加或删除大量数据时对其进行分析。根据您的 PG 版本和设置,其中一些可能会自动为您完成,但手动分析也无妨,尤其是在测试此类事情时。

编辑:索引顺序可能(特别是如果您不在查询中使用排序依据而优化器使用索引)影响查询结果的顺序——返回的行可能按相同顺序排序索引的顺序。

关于mysql - 复合 where 子句的顺序(MySQL、Postgres),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20187584/

相关文章:

sql - 在另一个子查询中使用子查询中的字段值,其中 PostgreSQL 中的generate_series

mysql - 合并设置变量为 0 并使用 MySQL 中的变量迭代表

php - 尝试输出存储在 MySql 中的记录时出现问题

MySQL:如何从 .SQL 脚本文件运行 shell 命令

html - 更改 PROC SQL SELECT 语句的 SAS ODS 内容项

javascript - CircleCi 有时无法在构建中连接到 Postgres

mysql - postgres 按错误分组

php - 如何从未输入某些日期的数据库表中创建 30 天的数据数组?

mysql - 计算每天按另一个字段分组的行数

sql - 使用 RMySQL 的临时表