sql >> Database teknologi >  >> RDS >> Mysql

Dynamisk MySQL-partitionering baseret på UnixTime

  1. Partitionering behøver ikke udelukkende at være baseret på en unik nøgle. Men hvis en unik nøgle er til stede, skal den inkluderes i kolonner, der bruges til at partitionere tabellen på. For at partitionere tabel på UNIXTIME-kolonnen skal du:

    ALTER TABLE MyTable
    PARTITION BY RANGE COLUMNS (UNIX_TIMESTAMP(datetime_column))
    (
      PARTITION p01 VALUES LESS THAN (2),
      PARTITION p02 VALUES LESS THAN (3),
      PARTITION p03 VALUES LESS THAN (4),
      PARTITION p04 VALUES LESS THAN (MAXVALUE));
    

    Eller du kan partitionere på datetime-kolonnen med det samme i MySQL 5.5+ :

    ALTER TABLE MyTable
    PARTITION BY RANGE COLUMNS (datetime_column)
    (
      PARTITION p01 VALUES LESS THAN ('2013-01-01'),
      PARTITION p02 VALUES LESS THAN ('2013-02-01'),
      PARTITION p03 VALUES LESS THAN ('2013-03-01'),
      PARTITION p04 VALUES LESS THAN (MAXVALUE));
    
  2. Fuldt automatiseret version (den vil opbevare hver måned i sin egen partition, 5 måneders data opbevaret):

    ALTER TABLE MyTable
    PARTITION BY RANGE COLUMNS (YEAR(datetime_column)*100 + MONTH(datetime_column))
    (
      PARTITION p201301 VALUES LESS THAN (201301),
      PARTITION p201302 VALUES LESS THAN (201302),
      PARTITION p201303 VALUES LESS THAN (201303),
      PARTITION p201304 VALUES LESS THAN (201304),
      PARTITION p201305 VALUES LESS THAN (201305),
      PARTITION p_MAXVALUE VALUES LESS THAN (MAXVALUE));
    
    
    
    DECLARE @Min_Part int
    DECLARE @Last_Part int
    DECLARE @SQL varchar (1000)
    
    If (select count (distinct MONTH(datetime_column)) from MyTable) > 5 THEN
        BEGIN
    
        select @Min_Part = (select min(year(datetime_column)*100 + month(datetime_column)) from MyTable),
        @Last_Part = (select max(year(datetime_column)*100 + month(datetime_column)) from MyTable)
    
        set @SQL = 'Alter table MyTable REORGANIZE PARTITION p_MAXVALUE (into partition p' +TO_CHAR (@Last_Part) + 'values less than (' + TO_CHAR (@Last_Part) + ')' 
    
        call common_schema.eval (@sql)
    
        set @SQL = 'Alter table MyTable DROP PARTITION p' + TO_CHAR (@Min_Part) 
    
        call common_schema.eval (@sql)
    
    
    END
    

P.S. Undskyld hvis SQL ikke er helt korrekt - kan ikke parse det lige nu.




  1. MySQL ATAN() Funktion – Returner buetangensen for en værdi (eller værdier)

  2. Alternativ til mysql_real_escape_string uden at oprette forbindelse til DB

  3. Kommaseparerede værdier til IN-funktion i oracle

  4. Java MYSQL Prepared Statement Fejl:Tjek syntaks for at bruge i nærheden af ​​'?' på linje 1