1

こんにちは、データベースを最適化する方法について、1 年もかからないように助けてもらいたいと思っていました。高速化するにはインデックスを追加する必要があることはわかっていますが、何に追加すればよいか正確にはわかりません。

私のデータベースの3つのテーブルは次のとおりです。

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;

テーブル tourPattern2 には約 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からの列に参照journeyPattern2を追加journeyPatternTimingLink2
  2. serviceIdからの列に参照serviceを追加journeyPattern2
  3. serviceIdからの列に参照serviceを追加line

fromテーブルの列にインデックスを追加しjourneyPatternTimingLink2ます。

于 2012-11-05T11:48:07.953 に答える
1

最も重要なインデックスは onjourneyPatternTimingLink2.fromである必要があります。これは where 句にあり、他のすべてのテーブルを合わせたよりも 2 桁多くの行があるためです。

すべてのテーブルに InnoDB を使用することも検討してください。最適化の概要から:

ノート

MySQL 5.5 以降では、InnoDB が新しいテーブルのデフォルトのストレージ エンジンです。実際には、InnoDB の高度なパフォーマンス機能により、特にビジー状態のデータベースでは、InnoDB テーブルが単純な MyISAM テーブルよりもパフォーマンスが優れていることがよくあります。

于 2012-11-05T11:30:11.327 に答える
1

これらのフィールドにいくつかのインデックスを追加する必要があります -

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

これらは、JOIN-ON 句と WHERE 条件で使用されるインデックスです。

于 2012-11-05T11:06:20.657 に答える