sql - 我怎样才能加快这个 SELECT CONCAT/GROUP BY 查询?

标签 sql mysql query-optimization

我正致力于从数据库中选择位置(城市、州)。问题是查询运行有点慢,我不确定如何加快速度。例如:

SELECT CONCAT_WS(', ', city, state) as location, AVG(latitude), AVG(longitude) 
FROM places
WHERE city='New York' AND state='NY'
GROUP BY location

不管怎样,位置上都会有一个 CONCAT,因为我希望数据库返回一个漂亮的位置串联版本(除非有理由在代码中执行此操作)。例如,“纽约州纽约市”。实际上,有时会加入第三列(邮政编码)。我在 MySQL 上运行。

优化此查询的最佳方法是什么?

此外,作为次要问题,添加“DISTINCT”会以任何方式减慢查询速度吗?例如:

SELECT DISTINCT CONCAT_WS(', ', city, state) as location, AVG(latitude), AVG(longitude) 
FROM places
WHERE city='New York' AND state='NY'
GROUP BY location

(我现在正在这样做,但在问这个问题的过程中,我意识到由于 GROUP BY 子句,DISTINCT 不是必需的;但是,由于它是不必要的,我想知道它是否有任何区别以及我是否应该为了加快查询而费心摇船。)

编辑:已经有关于城市、州和邮政编码的索引;加上它们的组合(城市、邮政编码;单独的州/邮政编码)。

最佳答案

(state, city) 上创建一个复合索引并将查询重写为:

SELECT  CONCAT_WS(', ', city, state) AS location, AVG(latitude), AVG(longitude) 
FROM    places
WHERE   state='NY'
        AND city='New York'
GROUP BY
        state, city

请注意,对于这个查询,您可以省略 GROUP BY 子句:

SELECT  'New York, NY' AS location, AVG(latitude), AVG(longitude) 
FROM    places
WHERE   state='NY'
        AND city='New York'

但是,这个查询仍然需要它:

SELECT  CONCAT_WS(', ', city, state) AS location, AVG(latitude), AVG(longitude) 
FROM    places
WHERE   state='NY'
GROUP BY
        state, city

关于sql - 我怎样才能加快这个 SELECT CONCAT/GROUP BY 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1212308/

相关文章:

sql - 提高非聚集索引查找的性能

ios - 获取 SQLite 上最后插入行的 ID 的最佳方法

c# - 应用程序上的并发用户导致 MySQL 数据库错误

mysql - golang MySQL "connection refused"

php - 如何提高这个mysql查询的速度

mysql - 如何获取表中在特定字段上共享值的所有行?

php - 如何从 mysql 数据库中的序列化字段进行搜索?

c++ - 有趣的代码行为

mysql - 需要对索引进行一些说明(WHERE、JOIN)

sql - Postgres Select ILIKE %text% 在大字符串行上很慢