În fața acestei sarcini, există două variabile
numerele sunt întotdeauna șase cifre și pot fi arbitrare, dar începerea este întotdeauna mai mică decât terminarea în baza de date în tabel există două coloane id și numărul
- id id cu atributul autoincrement
- numărul stochează cifre de șase cifre
Sarcina este să introduceți intervalul numeric între început și terminare în baza de date. dar astfel încât, dacă baza de date are deja un șir cu un număr de potrivire, acesta nu a fost reînregistrat.
Eu cu siguranță pot personaliza structura voluminoase de o buclă în care proba SELECT va fi mai întâi efectuată și verifica numărul de coloane selectate, iar dacă num_rows returnează 0 apoi introduceți dar după cum știi că e doar un super resursă-voință și greu de mânuit - ar putea avea un fel de funcție de simplificare un fel de DISTINCT în eșantion care ar face totul mai simplu.
Opțiunile nu sunt foarte corecte
Numere de șase cifre, ceea ce înseamnă un maxim de 1 milion de înregistrări - nu este prea mult. Puteți scăpa din tabel toate cu numerele între: începe și: se termină într-un număr simplu de matrice => true. va dura până la un megabyte de memorie în cel mai rău caz. Apoi, pentru utilizarea isset pentru a verifica dacă este sau nu un număr în listă, dacă nu - apoi se acumulează într-o matrice separată, și fiecare, în acest fel, dumping 1000 elemente într-o singură interogare la baza de date. Nu este prea corect un gând, dar este posibil.
Puteți face exact la fel, dar nu citesc totul, și de rupere gama originală în mai multe blocuri, de exemplu, 50 de mii de numere - pentru tur-retur necesare 20 de interogări la baza de date pentru citire.
Sau toate același proces, dar o altă opțiune care vă permite să monitorizeze și consumul de memorie, în cel mai rău caz, și numărul minim de cereri la cele mai bune: citește matrice în cazul în care numărul> =: începe comanda limita numărul 10000. Dacă înapoi mai mică decât limita de înregistrări - act în primul scenariu, ați scos toate numerele utilizate, toate restul de la început până la sfârșit trebuie să adăugați la baza de date. Dacă exact numărul de înregistrări specificate în limită este returnat, atunci probabil că aveți mai multe date în tabel. Apoi, vă amintiți ultimul număr din rezultat, și când dvs. a ajuns la acest număr - face mai mult de interogare a bazei de date prin substituirea dvs. întâlnit recent un număr în cazul în care numărul> =: ordine LAST_NUMBER de limita numărul de 10.000, și re-creează matrice cu id-ul disponibile în baza de date. Acest lucru va funcționa bine dacă în mod normal aveți câteva intrări în tabelul dvs. și apar deseori omisiuni.
Opțiuni din nou
Strămoasă, dar mai productivă. Dacă doriți să efectuați această sarcină mai mult sau mai puțin frecvent, creați un tabel, de exemplu:
Asta e tot. Serios.
Desigur, în toate variantele de tablename.number trebuie să fie construit un index.
Varianta cu generarea unei secvențe în zbor de către forțele unui imens john - din păcate funcționează adecvat numai pe intervale mici. Specificat în intervalul de întrebări, am numărat o jumătate de secundă - este doar un interval.
Dacă există o masă mare lângă (absolut orice, dacă există doar suficiente linii în ea), atunci puteți genera secvențele utilizând o variabilă personalizată:
Va fi mai distractiv, dar aveți nevoie de un semn. Pentru gama finală, care este destul de mică în plus, doar 1 milion de linii - este mai ușor să creați un tabel cu numere în avans.
În spatele scenei, se pare că era doar opțiunea cu procedura stocată. Puteți scrie la magazin, care va face exact bacul naiv. dar din cauza apropierii de date pentru a face acest lucru mai eficient decât cu aplicația. Dar o interogare specializată va fi mai eficientă, iar logica stocată în mysql nu este cel mai problematic lucru. Foarte neplăcută, de exemplu, este o tranzacție automată silențioasă când se apelează la magazin.
În cel mai rău caz, aveți 1.000.000 de rânduri în ordine. Este necesar să se genereze o astfel de cantitate de linii.
Le vom genera cu înțelepciune. Mai întâi, calculăm cât de mult avem nevoie de rânduri. Apoi vom multiplica masa de 10 rânduri până când vom obține suma corespunzătoare.
Arata cam asa:
Fiti atenti la conditiile formularului cnt> = 1000. Va functiona (va incepe multiplicarea urmatoare cu placa 0..9) numai daca numarul nostru este mai mare sau egal cu 1000. Asta este. dacă avem nevoie, de exemplu 5000 de rânduri. Această interogare va genera 10000 și va filtra extra 5000, nu milioane! Acesta este un aspect foarte important, care îmbunătățește considerabil productivitatea.
Deci, avem o secvență cu numărul necesar de elemente de la $ start to $ finalizat. În acest mod, va funcționa rapid pentru gamele mici. Ie din punctul de vedere al optimizării totul se face în minte.
Apoi, trebuie să inserați valorile lipsă în tabel. Acesta va arata astfel:
Cum se face introducerea valorilor lipsă este o chestiune de gust. În exemplul EXISTS, este posibil să existe NOT IN sau LEFT JOIN. I-am spus cum să generez rapid o secvență de dimensiune cunoscută necunoscută cu o singură interogare în MySQL.
De multe ori cu adăugarea unui tabel care are un index unic sau cheie primară, o nouă linie este foarte util INSERT IGNORE sintaxă. Utilizarea acestui sintaxă este convenabil în cazul dublării accidentale când introduceți cheia, care este, inserarea în sine nu este făcută, nu proces va fi reziliat. Algoritmul obișnuit:
- verificați prezența unui rând în tabel cu ajutorul tastei (SELECT)
- introduceți o linie dacă nu există nici o cheie dublă (INSERT)
Acum vom scrie o singură cerere INSERT IGNORE fără php