Mysql-gegevens partitioneren en bijsnijden

Onze hoofdtabel, tblLink, heeft zijn primaire sleutel ook als vreemd in een paar andere tabellen en een van de tabellen zal tblMainData zijn die in de loop van de tijd miljoenen rijen zal bevatten.

We willen slechts 3 maanden gegevens behouden op basis van de invoegdatum in tblLink.

De rest willen we opschonen en geschiedenisrapporten blijven genereren. Wat is het beste mechanisme om in dit scenario aan te pakken? Hieronder ziet u hoe onze tafelstructuren eruit zien.

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

2 antwoord

U kunt partitionering van het datumbereik voor elke 3 maanden implementeren, zodat de prestaties worden verbeterd en de query's voor de gegevens over 3 maanden niet via de historische gegevens worden gescand.

0
toegevoegd
Ik ben een beetje verdwaald na het doorlopen van verschillende tutorials. Zo is het dat ik voor elke maand een partitionering van 3 maanden moet uitvoeren, toch? Elke verdere gids o hoe te handelen over thx.
toegevoegd de auteur user837306, de bron

Hier is een voorbeeld .,

==

MAAK TAFEL t2

(

dt DATE

)

PARTITION BY RANGE (TO_DAYS (dt))

(

PARTITION p01 WAARDEN MINDER DAN (TO_DAYS ('2007-01-01')),

PARTITION p02 WAARDEN MINDER DAN (TO_DAYS ('2007-04-01')),

PARTITION p03 WAARDEN MINDER DAN (TO_DAYS ('2009-07-01')),

PARTITION p04 WAARDEN MINDER DAN (MAXWAARDE)

);

==

0
toegevoegd
in mijn geval moet ik elke tabel apart partitioneren, is het. Laat ze dan vallen op basis van datum? Ik moet de tafels om de drie maanden herbouwen? Zou dit me een probleem bezorgen? Als een van de tabellen geen datetime-veld heeft, is dit ook een probleem denk ik?
toegevoegd de auteur user837306, de bron