【发布时间】:2012-11-05 10:54:41
【问题描述】:
您好,我希望我能在如何优化我的数据库方面获得一些帮助,这样我就不需要一年的时间了。我知道要加快速度,我需要添加索引,但我不确定应该添加索引。
这是我数据库中的三个表:
CREATE TABLE IF NOT EXISTS `journeyPattern2` (
`journeyPatternId` int(11) NOT NULL AUTO_INCREMENT,
`serviceId` int(11) NOT NULL,
`direction` enum('inbound','outbound') NOT NULL,
PRIMARY KEY (`journeyPatternId`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
CREATE TABLE IF NOT EXISTS `journeyPatternTimingLink2` (
`journeyPatternTimingLinkId` int(11) NOT NULL AUTO_INCREMENT,
`journeyPatternId` int(11) NOT NULL,
`from` varchar(15) NOT NULL,
`to` varchar(15) NOT NULL,
`direction` enum('inbound','outbound') NOT NULL,
`runTime` varchar(15) NOT NULL,
PRIMARY KEY (`journeyPatternTimingLinkId`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
CREATE TABLE IF NOT EXISTS `line` (
`lineId` int(11) NOT NULL AUTO_INCREMENT,
`serviceId` int(11) NOT NULL,
`lineName` tinytext NOT NULL,
PRIMARY KEY (`lineId`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
CREATE TABLE IF NOT EXISTS `service` (
`serviceId` int(11) NOT NULL AUTO_INCREMENT,
`serviceCode` varchar(50) NOT NULL,
`registeredOperatorRef` varchar(50) NOT NULL,
`origin` tinytext NOT NULL,
`destination` tinytext NOT NULL,
PRIMARY KEY (`serviceId`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
表 JourneyPattern2 包含约 33000 行,journeyPatternTimingLink2 包含约 1300 万行,线路和服务约 70000。
我要优化的查询如下
SELECT DISTINCT lineName,line.serviceId FROM `journeyPatternTimingLink2`
INNER JOIN journeyPattern2
ON journeyPattern2.journeyPatternId=journeyPatternTimingLink2.journeyPatternId
INNER JOIN line
ON journeyPattern2.serviceId = line.serviceId
WHERE `from` = '13006785E'
我以前从未真正使用过这种大小的表格,所以我不确定我是否一开始就正确加入。我还上传了一个 screenshot 我在 phpmyadmin 的查询上运行 EXPLAIN,但我不确定如何解释结果,因此不胜感激。
感谢您的帮助。
【问题讨论】:
-
首先,您的查询真的很慢还是要提前优化?
-
是的,它非常慢,运行我上面发布的内容需要 50 秒。
-
你的解释说在journeyPattern2中有330141行,上面你说的是33000行,这是正确的吗?
-
是的,我只是在估计行数。我遵循了以下建议,相同的查询从 50 秒缩短到 0.04 秒。
标签: mysql sql optimization database-indexes