SELECT SQL_NO_CACHE link.stop, stop.common_name, locality.name, stop.bearing, stop.latitude, stop.longitude
FROM service
JOIN pattern ON pattern.service = service.code
JOIN link ON link.section = pattern.section
JOIN naptan.stop ON stop.atco_code = link.stop
JOIN naptan.locality ON locality.code = stop.nptg_locality_ref
GROUP BY link.stop
上面的查询大约需要800毫秒-1000毫秒才能运行。
如果我追加一条group_concat
语句,查询将花费8到10秒:
SELECT SQL_NO_CACHE link.stop, link.stop, stop.common_name, locality.name, stop.bearing, stop.latitude, stop.longitude, group_concat(service.line) lines
我如何更改此查询,以使其在不到2秒的时间内运行该group_concat
语句?
SQL小提琴:http://sqlfiddle.com/#!9 / 414fe
EXPLAIN
这两个查询的声明:http : //i.imgur.com/qrURgzV.png
此查询需要多长时间?
SELECT p.section, GROUP_CONCAT(s.line)
FROM pattern p join
service s
ON p.service = s.code
GROUP BY p.section
我认为您可以group_concat()
在子查询中进行操作,因此外部查询不需要聚合。当子查询中有一个表时,这可以加快查询速度。就您而言,有两个。
最终结果将类似于:
link.section = pattern.section
SELECT SQL_NO_CACHE . . .,
(SELECT GROUP_CONCAT(s.line)
FROM pattern p join
service s
ON p.service = s.code
WHERE p.section = link.section
) as lines
FROM link JOIN
naptan.stop
ON stop.atco_code = link.stop JOIN
naptan.locality
ON locality.code = stop.nptg_locality_ref;
对于此查询,您需要以下附加索引:pattern(section, service)
和service(code, line)
。
我不知道这是否行得通,但是值得一试。
注意:这是假设您确实不需要group by
其余的列。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句