Care este cel mai rapid? SELECTAȚI SQL\_CALC\_FOUND\_ROWS DIN `tabel`, sau SELECT COUNT(*)



Atunci când limita numărul de rânduri să fie returnate de o interogare SQL, utilizat de obicei în paginare, există două metode de a determina numărul total de înregistrări:


 Metoda 1


Include `SQL_CALC_FOUND_ROWS` opțiune în original "SELECTAȚI", și apoi a obține numărul total de rânduri de funcționare `SELECTAȚI FOUND_ROWS()`:



```
SELECT SQL_CALC_FOUND_ROWS * FROM table WHERE id > 100 LIMIT 10;
SELECT FOUND_ROWS();  
```

 Metoda 2


Rulați interogarea, în mod normal, și apoi a obține numărul total de rânduri de funcționare `SELECT COUNT(*)`



```
SELECT * FROM table WHERE id > 100 LIMIT 10;
SELECT COUNT(*) FROM table WHERE id > 100;  
```

**Care este metoda cel mai bun / cel mai rapid?**
Depinde. Vezi MySQL Performanță post pe Blog pe acest subiect: <http://www.mysqlperformanceblog.com/2007/08/28/to-sql_calc_found_rows-or-not-to-sql_calc_found_rows/>


Doar un scurt rezumat: Petru spune că aceasta depinde de indicii și de alți factori. Multe din comentariile la post par a spune că SQL\_CALC\_FOUND\_ROWS este aproape întotdeauna mai lent, uneori de până la 10 ori mai lent decât rularea a două interogări.
> 
> Se pare că prima dintre valori este interpretată ca o coloană,
> cum este asta?
> 
> 
> 


Deoarece ați primit-o la fel ca `SomeString` , în loc
de text *valoare* , cum ar fi `'SomeString'` .
Acesta este modul în care funcționează SQL - și cum funcționează și
codul normal, într-adevăr. Daca ai fi avut:



```
String foo = bar;

```

v-ați aștepta să încercați să copiați valoarea unei variabile
numite `bar` , nu-i așa? Dacă ați însemnat un șir de
trei caractere, b, a, r, ați folosi:



```
String foo = "bar";

```

Este același lucru în SQL.


Cu toate acestea, presupunând că acest SQL este construit din
valori reale, ar trebui să utilizați oricum un parametru
`PreparedStatement` cu parametri:



```
String sql = "INSERT INTO meta (title, hlcount, textcount, imgcount, linkcount)"
             + " VALUES (?, ?, ?, ?, ?)";
PreparedStatement pst = conn.prepareStatement(sql);
pst.setString(1, "SomeString");
pst.setInt(2, 6);
// etc

```

În acest fel, veți evita atacurile de injecție SQL și problemele
de conversie a șirului (de exemplu, pentru date). De asemenea, vă
păstrează curățarea SQL, separând codul de date. Aceasta este de fapt o întrebare complicată: atunci când utilizați un enum, este tradițional să aibă, de asemenea, un tabel de căutare în PB după cum sugerează Reed. Dar acest lucru ridică problema sincronizării definițiilor.


Ceea ce facem este genera tabelele de la definițiile ENUM, ca parte a construi / implementarea script-uri noastre pentru a se asigura că ambele reflectă același set de valori juridice.


Avem apoi funcții de comoditate care să ia un set de date întors dintr-o interogare DB, și ID hartă coloane în coloane (nou create), cu valori ENUM. Dar noi facem acest lucru imediat după rezultatele interogării sunt recuperate. Deci, sfatul meu ar fi să le hartă cât mai curând posibil, de preferință în DAL dumneavoastră. de la 1 la 9: 9 cifre  

  

de la 10 la 99 (fiecare număr e compus din 2 cifre): 180 cifre 



  

de la 100 la 999 (fiecare număr e compus din 3 cifre): 2700 cifre



  

de la 1000 la 1024 (fiecare număr e compus din 4 cifre): 100 cifre



  

  

**2989 cifre în total**. La fiecare dintre cei 3 pasi, fiecare numar este notat o data. In final, fiecare numar va aparea de 3 ori. Deci suma celor 3 numere obtinute de elevi este de 3 ori suma numerelor. Fie s aceasta suma:  

3s=13+15+23  

3s=51  

s=17


Numerele dintre 1 si 9 cu suma 17 sunt (1, 7, 9), (2, 6, 9), (2, 7, 8), (3, 5, 9), (3, 6, 8), (4, 5, 8), (4, 6, 7).


Ultima solutie nu poate fi corecta deoarece suma maxima care poate fi obtinuta este 7+7+7=21.


Pentru (4, 5, 8), suma maxima este 8+8+8=24, care este prea mare. A 2-a suma este 8+8+5=21, care e prea mica. Deci nu putem obtine suma 23.


Din aceleasi rationamente, (3, 6, 8) nu este valida.


Solutia (3, 5, 9) este corecta, deoarece avem 9+9+5=23, 5+5+3=13 si 9+3+3=15.  

Prin verificare directa se observa ca celelalte 3 solutii nu sunt valide. my 2 cents:

când implementezi un api nu mi se pare logic să “ghicești” ce fel de date primești pe baza inputului primit. de obicei modul de encodare a datelor îl determini folosind una din metodele de mai jos:

trimițând un http header când faci requestul (clientul api-ului) - considerat best prac… eu cand trebuie sa invat ceva pe derost impart textul in propozitii si le repet de 5 ori cu voce tare
dupa ce o memorez trec la a doua... dupa ce o memorez pe a doua le mai repet o data de la inceput dupa ce o memorez pe a treia le repet iar de la inceput, ca sa se lege textul
dar de cele mai multe ori incerc sa invat logic si sa imi pun intrebari, dar avand in vedere ca e istorie, poti incerca metoda mea, sau metoda cu scrisul, si ea ajuta foarte mult, mai ales daca copiezi in varianta ta, cumva un rezumat al textului
sper ca am ajutat
spor la invatat Nu poți face acest lucru prin programare (într-un mod sigur, care este), fără a crea un nou tabel. 


Ce Enterprise Manager face atunci când comite o reordonare este de a crea un tabel nou, muta datele și apoi ștergeți tabelul vechi și a redenumi nou tabel numele existent. 


Dacă doriți coloanele într-o anumită ordine / grupare, fără a modifica ordinea lor fizică, puteți crea o imagine care poate fi orice doriți. Pe o coloană aşez n cercuri tangente între ele, pe următoarea coloană pun n-1 cercuri tangente între ele şi fiecare dintre aceste cercuri este tangent la două cercuri din coloana din stînga. Lungimea pe orizontală a acestei structuri este 1 + sqrt(3)/2 (teorema lui Pitagora), deci se cîştigă (faţă de 2) 1 - sqrt(3)/2 ≈ 0.13. După acest tipar, punem în continuare şi în mod alternativ coloane de n şi n-1 cercuri pînă cînd cîştigul în lungime se apropie de 1. Remarcăm 7*0.13=0.91 şi ne oprim.  Pe verticală facem n=8. Avem 8 coloane (4 cu 8 cercuri şi 4 cu 7 cercuri), 8 linii şi 7 cîştiguri în lungime. Lungimea totală a acestei structuri este 8 - 0.91= 7.09. Înscriind acest model într-un pătrat de 8*8 vom avea 8*4 +7*4 = 60 de cercuri, mai puţin cu 4 decît numărul maxim 64, dar spaţiul ocupat este de 8*7.09, deci se poate insera o coloană de 8 cercuri deoarece avem nevoie doar de sqrt(3)/2 ≈ 0.87 ( din cauza tangenţierii ) şi nu de 1, ba chiar rămîne loc şi de respirat. Vom obţine un număr maxim de 68 de pătrate > 64.  
**Răspunsul este n = 8**.  
Precizarea făcută de autor cu privire la "dimensiuni mari" mă intrigă: ori am greşit eu, ori vorbim de probleme diferite, ori a fost o diversiune din partea lui. 5 minute. Fiecarei masini ii trebuie 5 minute. Iar celor 100 de masini, la fel,  considerand ca lucreaza concomitent. bună ziua. aveți nevoie de un număr de românia cel mai probabil. încercați să introduceți numărul unei cunoștințe.