1

嗨,我希望我能在如何优化我的数据库方面得到一些帮助,这样不需要一年。我知道要加快速度,我需要添加索引,但我不确定我应该在什么上添加它们。

这是我数据库中的三个表:

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'

我以前从未真正使用过这种大小的桌子,所以我不确定我是否一开始就正确加入。我还上传了我在 phpmyadmin 的查询上运行 EXPLAIN 的屏幕截图,但我不确定如何解释结果,因此将不胜感激。

谢谢你的帮助。

4

3 回答 3

5

您必须在下面提到的列上添加一些外键索引:

  1. jouurneyPatternId在列上添加引用from journeyPattern2tojourneyPatternTimingLink2
  2. serviceId在列上添加引用from servicetojourneyPattern2
  3. serviceId在列上添加引用from servicetoline

from在表中的列上添加索引journeyPatternTimingLink2

于 2012-11-05T11:48:07.953 回答
1

您应该为这些字段添加一些索引 -

  • JourneyPatternTimingLink2.journeyPatternId
  • JourneyPattern2.serviceId
  • line.serviceId
  • JourneyPatternTimingLink2.from

这些是在 JOIN-ON 子句和 WHERE 条件中使用的索引。

于 2012-11-05T11:06:20.657 回答
1

最重要的索引应该是 on journeyPatternTimingLink2.from,因为它在您的 where 子句中,并且比所有其他表的总和多两个数量级。

您也可以考虑对所有表使用 InnoDB。从优化概述

笔记

在 MySQL 5.5 及更高版本中,InnoDB 是新表的默认存储引擎。在实践中,高级 InnoDB 性能特性意味着 InnoDB 表通常优于简单的 MyISAM 表,尤其是对于繁忙的数据库。

于 2012-11-05T11:30:11.327 回答