如何优化MySQL数据库/查询

时间:2012-11-05 10:54:42

标签: mysql sql optimization database-indexes

您好我希望能够获得有关如何优化数据库的帮助,因此不需要一年的时间。我知道要加快速度,我需要添加索引,但我不确定应该添加它们。

继承我数据库中的三个表:

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;

table journeyPattern2包含大约33000行,journeyPatternTimingLink2包含大约1300万行,line和service大约包含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的查询中上传了screenshot运行EXPLAIN的{{3}},但我不确定如何解释结果,所以任何帮助都会受到赞赏。

感谢您的帮助。

3 个答案:

答案 0 :(得分:5)

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

  1. jouurneyPatternId列上添加journeyPattern2journeyPatternTimingLink2
  2. 的引用
  3. serviceId列上添加servicejourneyPattern2
  4. 的引用
  5. serviceId列上添加serviceline
  6. 的引用

    from表中的journeyPatternTimingLink2列添加索引。

答案 1 :(得分:1)

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

  • journeyPatternTimingLink2.journeyPatternId
  • journeyPattern2.serviceId
  • line.serviceId
  • journeyPatternTimingLink2。from

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

答案 2 :(得分:1)

最重要的索引应该在journeyPatternTimingLink2.from上,因为这是在你的where子句中,并且比所有其他表组合的行多两个数量级。

您也可以考虑将InnoDB用于所有表格。来自Optimization Overview

  

注意

     

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