Mysql tömeges frissítés és írási adatbázis - verem túlcsordulás orosz nyelven

A feladat előtt két változó van

a számok mindig hat számjegyűek és tetszőlegesek lehetnek, de a kezdet mindig kevesebb, mint az adatbázisban a táblában található két oszlop azonosítója és száma

  • id id az autoincrement attribútummal
  • a szám tárolja a hatjegyű számokat

A feladat az, hogy beírja a számot az indulás és a befejezés között az adatbázisba. de úgy, hogy ha az adatbázis már tartalmaz egy azonosítószámú karakterláncot, akkor nem regisztrálták.

Én biztosan szabhatja vaskos szerkezet egy for ciklus, amelyben a SELECT mintát először elvégezni, és ellenőrizze a néhány kiválasztott oszlopok, és ha NUM_ROWS értéke 0, akkor ne INSERT de mint tudjuk, ez csak egy szuper erőforrás-akarat és nehézkes - esetleg valamilyen egyszerűsítése funkció olyan mint a DISTINCT mint a mintában, ami mindent egyszerűbbé tenné.

Az opciók nem nagyon helyesek

Hat számjegyű számok, ami legfeljebb 1 millió rekordot jelent - ez nem igazán túl sok. Az asztalról kiválaszthatja az összeset, ahol a szám kezdete és: egy egyszerű tömb száma => true. a legrosszabb esetben egy megabájt memóriába kerül. Ezt követően, a isset ellenőrizni, hogy egy számot a listán, ha nem -, akkor felhalmozódnak egy külön tömb, és minden, hogy így, a dömping 1000 elem egy lekérdezést az adatbázisnak. Nem túl helyes a gondolat, de lehetséges.

Akkor nem pontosan ugyanaz, de nem olvasni mindent, és megtörve az eredeti tartomány több blokkok, például 50 ezer szám - az oda-vissza elvárt 20 lekérdezések az adatbázis olvasására.

Vagy mind ugyanazt a folyamatot, de egy másik lehetőség, amely lehetővé teszi, hogy figyelemmel kísérje és a memória fogyasztás a legrosszabb esetben, és a minimális kérések száma a legjobb: olvasd el a tömb, ahol a szám> =: menesztés darabszámban limit 10000. Ha vissza kevesebb, mint a határ rekordok - jogszabály az első forgatókönyvben kivont minden használt számot, a többit az elejétől a végéig fel kell venni az adatbázisba. Ha pontosan a limitben megadott rekordok száma van visszaadva, akkor talán több adata van a táblázatban. Akkor emlékszel az utolsó szám az eredmény, és amikor a számára jött ez a szám -, hogy még többet adatbázis-lekérdezés helyettesítette a közelmúltban találkozott a szám ahol> =: LAST_NUMBER sorrendben száma határa 10.000, és újra létrehozza a tömb elérhető id az adatbázisban. Ez jól működik, ha rendszerint néhány bejegyzés van a táblázatban, és gyakran előfordulnak kihagyások.

Ismét lehetőségeket

Furcsa, de produktívabb. Ha többé-kevésbé gyakran szeretné elvégezni ezt a feladatot, hozzon létre egy táblát, például:

Ez minden. Komolyan.

Természetesen az összes változatban a tablename.number alapján egy indexet kell létrehozni.

A változat egy sorozatot generál egy hatalmas john erõin keresztül - sajnos csak kis területeken mûködik. A kérdéstartományban megadva fél másodpercet számoltam - ez csak egy tartomány.

Ha van mellette egy nagy asztal (feltétlenül bármi, ha csak benne lenne elég vonal), akkor a szekvenciákat egy egyedi változó segítségével generálhatja:

Jól szórakoztat, de szüksége van valamilyen jelre. Az utolsó körben, ami meglehetősen kicsi, csak 1 millió vonal - könnyebb előállítani egy asztalt előre számokkal.

A jelenetek mögött, úgy tűnik, csak a tárolt eljárással volt lehetőség. Akkor írhatsz a boltba, ami pontosan a naiv a hurok számára. de az adatok közelsége miatt hatékonyabban, mint az alkalmazásnál. De egy speciális lekérdezés hatékonyabb lesz, és a tárolt logika a mysql-ben nem a legproblematikusabb dolog. Nagyon kellemetlen például egy csendes automatikus tranzakció, amikor az üzletet hívja.

A legrosszabb esetben egymillió sor sorozatban van. Szükséges ilyen mennyiségű vonal létrehozása.

Bölcsen fogjuk őket generálni. Először számoljuk ki, hogy valóban szükségünk lesz sorokra. Ezután sorba fogjuk sorolni a 10 sorból álló táblázatot, amíg meg nem kapjuk a megfelelő összeget.

Úgy néz ki, mint ez:

Ügyeljen arra, hogy a feltételeket a forma CNT> = 1000. Ez működni fog (van egy másik szorzás jele 0..9), csak ha a szám nagyobb vagy egyenlő, mint 1000. Ez azt jelenti, ha szükséges, például 5000 sor. Ez a lekérdezés 10000-at generál és kiszűri az extra 5000-et, nem pedig a milliót! Ez egy nagyon fontos pont, ami nagymértékben javítja a termelékenységet.

Tehát egy sorozatot kaptunk a szükséges számú elemtől kezdve a $ kezdettől a $ befejezésig. Ennek során gyorsan fog működni kis területeken. Ie az optimalizálás szempontjából mindent az elmében végzik.

Ezután be kell illeszteni a hiányzó értékeket a táblába. Így fog kinézni:

A hiányzó értékek beillesztése ízléssel kapcsolatos. Az EXISTS példában nem lehet IN vagy LEFT JOIN. Megmondtam, hogyan lehet gyorsan létrehozni egy ismert ismeretlen méretű sorozatot egy lekérdezéssel a MySQL-ben.

Gyakran azzal a kiegészítéssel, egy asztal, amelynek egy egyedi index vagy elsődleges kulcsot, egy új vonal nagyon hasznos INSERT IGNORE szintaxist. Az ezzel a szintaxis kényelmes baleset esetén párhuzamos, amikor behelyezi a kulcsot, hogy van, behelyezése maga nem tette, nem folyamat megszakad. A szokásos algoritmus:

  1. ellenőrizze a sor jelenlétét a táblázatban (SELECT)
  2. illesszen be egy sort, ha nincs többszörös kulcs (INSERT)

Most csak egy kérést írunk be INSERT IGNORE php nélkül