每个结果的多个子查询,如何更快?
Multiple sub queries for each result, how to make faster?
我正在做这样的查询:
cursor.execute(
'''
SELECT person.id, person.name
FROM person
JOIN vehicle ON vehicle.owner_id = person.id
WHERE person.age >= 18 AND vehicle.model = %s
''',
('Toyota Auris',)
)
people = [dict(row) for row in cursor.fetchall()]
然后我为每个人获取他们的车辆信息:
for person in people:
cursor.execute(
'''
SELECT vehicle.id AS id, vehicle.name AS name, vehicled.model AS model
FROM vehicle
JOIN person ON person.id = vehicle.owner_id
WHERE person.id = %s
''',
(person['id'],)
)
person['vehicles'] = [dict(row) for row in cursor.fetchall()]
但是这个取车速度极慢,因为我注册了100多万人,10万辆车。有什么方法可以使第二个查询更快?
所以我想要的是所有 person
拥有与特定型号匹配的车辆的对象,以及 所有 他们的车辆,而不管车辆的型号。
您可以尝试先获取拥有丰田 Auris 的人,然后对车辆进行双重连接。所有这些都适合一个查询。类似于
SELECT v1.id, person.id AS pid, v2.id AS vid v2.model AS model FROM vehicle AS v1 JOIN person ON v1.owner_id = person.id JOIN vehicle AS v2 ON v2.owner_id = person.id WHERE person.age >= 18 AND v1.model = 'Toyota Auris';
尝试:
cursor.execute(
'''
SELECT person.id, person.name
FROM person
WHERE person.age > 17
'''
)
people = [dict(row) for row in cursor.fetchall()]
和
for person in people:
cursor.execute(
'''
SELECT vehicle.id AS id, vehicle.name AS name, vehicled.model AS model
FROM vehicle
WHERE vehicle.owner_id= %s and vehicle.model = %s
''',
(person['id'],'Toyota Auris',)
)
person['vehicles'] = [dict(row) for row in cursor.fetchall()]
我正在做这样的查询:
cursor.execute(
'''
SELECT person.id, person.name
FROM person
JOIN vehicle ON vehicle.owner_id = person.id
WHERE person.age >= 18 AND vehicle.model = %s
''',
('Toyota Auris',)
)
people = [dict(row) for row in cursor.fetchall()]
然后我为每个人获取他们的车辆信息:
for person in people:
cursor.execute(
'''
SELECT vehicle.id AS id, vehicle.name AS name, vehicled.model AS model
FROM vehicle
JOIN person ON person.id = vehicle.owner_id
WHERE person.id = %s
''',
(person['id'],)
)
person['vehicles'] = [dict(row) for row in cursor.fetchall()]
但是这个取车速度极慢,因为我注册了100多万人,10万辆车。有什么方法可以使第二个查询更快?
所以我想要的是所有 person
拥有与特定型号匹配的车辆的对象,以及 所有 他们的车辆,而不管车辆的型号。
您可以尝试先获取拥有丰田 Auris 的人,然后对车辆进行双重连接。所有这些都适合一个查询。类似于
SELECT v1.id, person.id AS pid, v2.id AS vid v2.model AS model FROM vehicle AS v1 JOIN person ON v1.owner_id = person.id JOIN vehicle AS v2 ON v2.owner_id = person.id WHERE person.age >= 18 AND v1.model = 'Toyota Auris';
尝试:
cursor.execute(
'''
SELECT person.id, person.name
FROM person
WHERE person.age > 17
'''
)
people = [dict(row) for row in cursor.fetchall()]
和
for person in people:
cursor.execute(
'''
SELECT vehicle.id AS id, vehicle.name AS name, vehicled.model AS model
FROM vehicle
WHERE vehicle.owner_id= %s and vehicle.model = %s
''',
(person['id'],'Toyota Auris',)
)
person['vehicles'] = [dict(row) for row in cursor.fetchall()]