MySQL中的SELECT DISTINCT语句需要10分钟

Car*_*s P 7 mysql performance

我是MySQL的新手,我试图使用这个语句选择一组不同的行:

SELECT DISTINCT sp.atcoCode, sp.name, sp.longitude, sp.latitude
FROM `transportdata`.stoppoints as sp
INNER JOIN `vehicledata`.gtfsstop_times as st ON sp.atcoCode = st.fk_atco_code
INNER JOIN `vehicledata`.gtfstrips as trip ON st.trip_id = trip.trip_id
INNER JOIN `vehicledata`.gtfsroutes as route ON trip.route_id = route.route_id
INNER JOIN `vehicledata`.gtfsagencys as agency ON route.agency_id = agency.agency_id
WHERE agency.agency_id IN (1,2,3,4);
Run Code Online (Sandbox Code Playgroud)

然而,选择声明大约需要10分钟,因此有些事情正在发生.

一个重要因素是表格gtfsstop_times很大.(约2.5亿条记录)

索引似乎设置得当; 所有上述连接都使用索引列.表格大小大致如下:

gtfsagencys - 4 rows
gtfsroutes - 56,000 rows
gtfstrips - 5,500,000 rows
gtfsstop_times - 250,000,000 rows
`transportdata`.stoppoints - 400,000 rows
Run Code Online (Sandbox Code Playgroud)

服务器有22Gb的内存,我将InnoDB缓冲池设置为8G,我使用的是MySQL 5.6.

任何人都能看到让这种运行更快的方法吗?或者确实,甚至!

停止点表位于不同的模式中是否重要?

编辑:EXPLAIN SELECT ...返回:

在此输入图像描述

O. *_*nes 6

您似乎正在尝试根据特定条件查找停止点集合.并且,您正在使用SELECT DISTINCT避免重复停止点.是对的吗?

看起来atcoCode是您的停止点表的唯一键.是对的吗?

如果是这样,试试这个:

SELECT sp.name, sp.longitude, sp.latitude, sp.atcoCode
  FROM `transportdata`.stoppoints` AS sp
  JOIN ( 
     SELECT DISTINCT st.fk_atco_code AS atcoCode
       FROM `vehicledata`.gtfsroutes AS route
       JOIN `vehicledata`.gtfstrips AS trip ON trip.route_id = route.route_id
       JOIN `vehicledata`.gtfsstop_times AS st  ON trip.trip_id = st.trip_id
       WHERE route.agency_id BETWEEN 1 AND 4
  ) ids ON sp.atcoCode = ids.atcoCode
Run Code Online (Sandbox Code Playgroud)

这做了一些事情:它消除了你似乎不需要的表(代理).它会将agency_id上的搜索更改IN(a,b,c)为范围搜索,这可能会有所帮助,也可能没有帮助.最后,它将DISTINCT处理从必须处理大量数据的情况重新定位到子查询情况,在该情况下它只需要处理ID值.

(JOIN并且INNER JOIN是相同的.我曾经JOIN使查询更容易阅读.)

这应该会加快你的速度.但是,不得不说,四分之一的gigarow表是一张大桌子.