2012-11-05 225 views
1

嗨我希望我可以得到一些關於如何優化我的數據庫,所以它不需要一年的幫助。我知道要加快速度,我需要添加索引,但我不確定我應該添加哪些內容。如何優化MySQL數據庫/查詢

繼承人在我的數據庫中的三個表:

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包含約13萬,而線和服務,我身邊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' 

我從來沒有真正與這個大小的表之前,所以我不知道如果我加入c正確地擺在首位。我也上傳了一個運行EXPLAIN的screenshot來自phpmyadmin的查詢,但我不確定如何解釋結果,所以任何幫助將不勝感激。

感謝您的幫助。

+0

首先,你的查詢是否真的很慢,或者你想提前優化? –

+0

是的,它非常緩慢,50秒運行我上面發佈的內容。 – Jack

+0

你的解釋是關於在journeyPattern2中330141行的解釋,在你說的33000行之上,這是正確的嗎? –

回答

1

你應該有些指標添加到這些領域 -

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

這些是用於在JOIN-ON子句和WHERE條件索引。

1

最重要的索引應該在journeyPatternTimingLink2.from,因爲這是在你的where子句中,並且比所有其他表的總和多兩個數量級。

您也可以考慮對所有表使用InnoDB。從Optimization Overview

注意

在MySQL 5.5及更高版本,InnoDB的是新 表的默認存儲引擎。在實踐中,InnoDB的高級性能特徵意味着 InnoDB表格通常優於簡單的MyISAM表格 ,特別是對於繁忙的數據庫。

5

您必須添加一些外鍵指標下面提及的列:

  1. journeyPattern2jouurneyPatternId列添加參考journeyPatternTimingLink2
  2. serviceserviceId列添加引用journeyPattern2
  3. 在上添加引用從列line

from列添加索引journeyPatternTimingLink2表。

+0

在使用myisam引擎的表上不能添加外鍵。 –

+0

在該列上添加索引也可以提高性能 –