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:
- ellenőrizze a sor jelenlétét a táblázatban (SELECT)
- 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