gpt4 book ai didi

sql - 加快缓慢的SQL查询

转载 作者:行者123 更新时间:2023-12-03 19:51:11 25 4
gpt4 key购买 nike

我正在使用MySQL world.sql数据库。确切地说,它无关紧要,但是要使用的重要架构如下所示:

CREATE TABLE city (
name char(35),
country_code char(3),
population int(11),
);
CREATE TABLE country (
code char(3),
name char(52),
population int(11)
);


该问题的英文查询是:“为每个国家/地区提供名称和人口,以及城市人口与国家人口比例最高的城市的名称和人口”。

目前,我有以下SQL:

SELECT t.name, t.population, c.name, c.population
FROM country c
JOIN city t
ON t.country_code = c.code
WHERE t.population / c.population = (
SELECT MAX(tt.population / c.population)
FROM city tt
WHERE t.country_code = tt.country_code
)


目前,该查询大约需要10分钟才能在我的SQLite数据库上运行。 world.sql数据库不大(4000-5000行?),所以我猜我在这里做错了。

我目前没有任何索引或任何内容:数据库是一个空数据库,已在其中输入了此数据集( https://dl.dropboxusercontent.com/u/7997532/world.sql)。任何人都可以针对我需要解决的问题提供任何指导,以使其在合理的时间内运行吗?

编辑:好吧,这是问题的另一个转折点:

耗时不到2秒

    SELECT t.name, t.population, c.name, c.population
FROM country c
JOIN city t
ON t.country_code = c.code
WHERE t.population * 1.0 / c.population = (
SELECT MAX(tt.population * 1.0 / c.population)
FROM city tt
WHERE tt.country_code = t.country_code
)


虽然这需要10分钟才能运行

    SELECT t.name, t.population, c.name, c.population
FROM country c
JOIN city t
ON t.country_code = c.code
AND t.population * 1.0 / c.population = (
SELECT MAX(tt.population * 1.0 / c.population)
FROM city tt
WHERE tt.country_code = t.country_code
)


那么当我执行JOIN时,解决方案是否只是将尽可能多的东西简单地塞入ON子句中?在这种情况下,如果这样做,我似乎可以不用索引了……

最佳答案

对于每个国家而言,人口与国家人口比例最高的城市就是人口最高的城市,因此请尝试以下操作:

SELECT t.name, t.population, c.name, c.population
FROM country c
JOIN city t
ON t.country_code = c.code
And population =
(Select Max(population) from city
Where country_code = c.Code)


但是,如果没有指标,这可能仍不能改善性能。您需要在 country.codecity.country_code上添加索引

关于sql - 加快缓慢的SQL查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16452702/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com