【发布时间】:2018-10-29 18:35:35
【问题描述】:
需要在 where 条件中使用列别名进行选择。 找到了可能的解决方案here。
假设我们有一对一的关系(用户到角色),我们希望得到如下结果:
SELECT u.name AS u_name, r.name AS r_name
FROM users AS u
INNER JOIN roles AS r
ON u.role_id = r.role_id
WHERE u.name = 'John'
我们有user.name 的对应索引(仅作为示例)。
如果使用EXPLAIN 运行此查询,它将显示选择期间使用的所有索引(包括名称索引)。
现在,由于我们想在 WHERE 子句中使用别名,因此我们可以根据建议的解决方案重写查询:
SELECT * FROM (
SELECT u.name AS u_name, r.name AS r_name
FROM users AS u
INNER JOIN roles AS r
ON u.role_id = r.role_id
) AS temp
WHERE u_name = 'John'
如您所见,嵌套选择中没有WHERE 子句。使用EXPLAIN 运行此查询会得到相同的结果(只是承认,我不是分析“解释”结果的专家,但仍然):
- 相同的索引
- 同样的费用
- 类似的执行时间
我对这个结果有点困惑:确信至少不会使用用户名的索引。
Q1: postgres 是否以这种方式使用索引?
Q2:是否存在性能问题?
【问题讨论】:
-
优化器可以重写查询,从而找到解决问题的更好方法。通常它会做正确的事,您无需担心。
标签: sql postgresql select indexing