0

メインテーブルであるtblLinkは、他のいくつかのテーブルでも主キーが外部であり、テーブルの1つはtblMainDataであり、時間の経過とともに数百万行になります。

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 ;
4

2 に答える 2

0

パフォーマンスが向上し、3 か月のデータのクエリが履歴データをスキャンしないように、3 か月ごとに日付範囲のパーティション分割を実装できます。

于 2012-06-24T08:31:34.237 に答える
0

ここに例があります。

==

テーブルの作成 t2

(

dt日付

)

PARTITION BY RANGE (TO_DAYS(dt))

(

パーティション p01 の値が (TO_DAYS('2007-01-01')) より小さい、

パーティション p02 の値が (TO_DAYS('2007-04-01')) 未満、

パーティション p03 の値が (TO_DAYS('2009-07-01')) 未満、

パーティション p04 値が (MAXVALUE) より小さい

);

==

于 2012-06-26T07:25:27.960 に答える