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

Opdater MySQL-tabellen i bidder

Jeg endte med proceduren nedenfor. Det virker, men jeg er ikke sikker på, om det er effektivt med alle forespørgsler til at identificere på hinanden følgende områder. Det kan kaldes med følgende argumenter (eksempel):

call chunkUpdate('SET var=0','someTable','theKey',500000);

Grundlæggende er det første argument opdateringskommandoen (f.eks. noget som "sæt x =..."), efterfulgt af mysql-tabelnavnet, efterfulgt af en numerisk (heltal) nøgle, der skal være unik, efterfulgt af størrelsen af bidder, der skal behandles. Nøglen skal have et indeks for rimelig ydeevne. Variablen "n" og "select"-sætningerne i koden nedenfor kan fjernes og er kun til fejlretning.

delimiter //
CREATE PROCEDURE chunkUpdate (IN cmd VARCHAR(255), IN tab VARCHAR(255), IN ky VARCHAR(255),IN sz INT)
BEGIN
  SET @sqlgetmin = CONCAT("SELECT MIN(",ky,")-1 INTO @minkey FROM ",tab); 
  SET @sqlgetmax = CONCAT("SELECT MAX(",ky,") INTO @maxkey FROM ( SELECT ",ky," FROM ",tab," WHERE ",ky,">@minkey ORDER BY ",ky," LIMIT ",sz,") AS TMP"); 
  SET @sqlstatement = CONCAT("UPDATE ",tab," ",cmd," WHERE ",ky,">@minkey AND ",ky,"<[email protected]");
  SET @n=1;

  PREPARE getmin from @sqlgetmin;
  PREPARE getmax from @sqlgetmax;
  PREPARE statement from @sqlstatement;

  EXECUTE getmin;

  REPEAT
    EXECUTE getmax; 
    SELECT cmd,@n AS step, @minkey AS min, @maxkey AS max;
    EXECUTE statement;
    set @[email protected];
    set @[email protected]+1;
  UNTIL @maxkey IS NULL
  END REPEAT; 
  select CONCAT(cmd, " EXECUTED IN ",@n," STEPS") AS MESSAGE;
END//



  1. Forespørgsel for at liste antallet af poster i hver tabel i en database

  2. VÆLG fast antal rækker ved jævnt at springe rækker over

  3. Postgres ORDER BY-værdier i IN-listen ved hjælp af Rails Active Record

  4. Database korruption