2012-06-24 62 views
0

我們的主表tblLink在其他幾個表中也有其主鍵作爲外鍵,其中一個表將是tblMainData,隨着時間的推移將會有數百萬行。Mysql數據分區和修整

我們希望僅保留tblLink中插入日期數據的3個月。

其餘我們想清除並保留以生成歷史報告。在這種情況下最好的機制是什麼?以下是我們的表結構的外觀。

CREATE TABLE IF NOT EXISTS `tblLink` (
    `linkID` int(5) NOT NULL, 
    `compID` int(5) NOT NULL, 
    `vehicleID` int(5) NOT NULL, 
    `deviceID` int(5) NOT NULL, 
    `locationFromID` int(5) NOT NULL, 
    `locationToID` int(5) NOT NULL, 
    `employeeIDInsert` int(5) NOT NULL, 
    `dateTimeInsert` datetime NOT NULL, 
    `dateTimeStartJourney` datetime NOT NULL, 
    `dateTimeEnd` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', 
    `dateTimeEndJourney` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', 
    `linkStatus` enum('a','d','e','m') NOT NULL, 
    PRIMARY KEY (`linkID`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 


CREATE TABLE IF NOT EXISTS `tblEmailLog` (
    `emailLogID` int(11) NOT NULL AUTO_INCREMENT, 
    `compID` smallint(6) NOT NULL, 
    `linkID` int(11) NOT NULL DEFAULT '0', 
    `userID` smallint(6) NOT NULL, 
    `alertCodeID` tinyint(4) NOT NULL, 
    `eventAlertID` int(11) NOT NULL, 
    `userEmail` varchar(100) NOT NULL, 
    `alertDateTime` datetime NOT NULL, 
    `alertInsertDateTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    PRIMARY KEY (`emailLogID`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; 


CREATE TABLE IF NOT EXISTS `tblEventAlert` (
    `eventAlertID` int(11) NOT NULL AUTO_INCREMENT, 
    `compID` int(5) NOT NULL, 
    `mainDataID` int(5) NOT NULL, 
    `vehicleID` int(5) NOT NULL, 
    `eventAlertSentEmail` varchar(50) DEFAULT NULL, 
    `eventAlertMessage` varchar(255) NOT NULL, 
    PRIMARY KEY (`eventAlertID`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; 



CREATE TABLE IF NOT EXISTS `tblMainData` (
    `mainDataID` int(11) NOT NULL AUTO_INCREMENT, 
    `linkID` int(5) NOT NULL, 
    `header` varchar(3) NOT NULL, 
    `deviceSerialNumber` varchar(20) NOT NULL, 
    `latitude` double NOT NULL, 
    `longitude` double NOT NULL, 
    `speed` float NOT NULL, 
    `course` int(3) NOT NULL, 
    `dateTimer` datetime NOT NULL, 
    `gpsDateTime` datetime NOT NULL, 
    `insertDateTime` datetime NOT NULL, 
    `odoMeter` float NOT NULL DEFAULT '0', 
    `driverID` int(5) NOT NULL, 
    `eventAlertID` int(11) NOT NULL DEFAULT '0', 
    `mainDataInsertDateTime` datetime NOT NULL, 
    `gpsString` varchar(450) NOT NULL, 
    PRIMARY KEY (`mainDataID`), 
    KEY `dateTime` (`dateTimer`), 
    KEY `linkID` (`linkID`), 
    KEY `eventAlertID` (`eventAlertID`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; 


CREATE TABLE IF NOT EXISTS `tblSubData` (
    `subDataID` int(11) NOT NULL AUTO_INCREMENT, 
    `mainDataID` int(11) NOT NULL, 
    `linkID` int(11) NOT NULL, 
    `eventAlertID` int(11) NOT NULL, 
    `deviceSerialNumber` varchar(20) NOT NULL, 
    `subdeviceSerialNumber` varchar(20) NOT NULL, 
    `dateTimer` datetime NOT NULL, 
    `eventType` varchar(2) NOT NULL 
    PRIMARY KEY (`subDataID`), 
    KEY `mainDataID` (`mainDataID`), 
    KEY `linkID` (`linkID`), 
    KEY `eventAlertID` (`eventAlertID`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; 

回答

0

您可以實施每3個月的日期範圍分區,以便提高性能並且3個月數據的查詢不會掃描歷史數據。

+0

我經歷了不同的教程後迷路了。那麼是不是每個月我都要跑3個月的分區呢?任何進一步的指導o如何去thx。 – user837306

0

下面是一個例子。,

==

CREATE TABLE T2

DT DATE

PARTITION BY RANGE(TO_DAYS(DT ))

PARTITION P01 VALUES小於(TO_DAYS( '2007-01-01')),

PARTITION P02值小於(TO_DAYS( '2007-04-01')),

PARTITION P03值小於(TO_DAYS( '2009-07-01')),

PARTITION P04值大於(MAXVALUE)

)少;

==

+0

在我的情況下,我必須分開分開每個表是它。然後根據日期放下它們?我必須每3個月重建一次桌子嗎?這會對我造成什麼問題嗎?如果其中一個表沒有日期時間字段,那麼這也將是一個問題,我猜? – user837306