Newsgroup: it.comp.www.php
Titolo: Limitare il count() in MySql

Ciao a tutti,
vi pongo un quesito interessante...
Situazione: ho un database con 1.000.000 di prodotti..
vorrei contare i campi che corrispondono ad una parola chiave, ma non
volerne più di 500 perchè comunque non mostrerò mai più di 500 record. Il
LIMIT è totalmente inutile al mio scopo!
Spiego meglio:
siccome la mia query utilizza un'espressione regolare, è abbastanza lenta
(qualche secondo, eh!) a leggersi tutti i record. Vorrei quindi fare in modo
che una volta trovati 500 record si fermi. Il LIMIT limita il numero di
risultati, ma con una query tipo "SELECT count(*) FROM table WHERE xx" il
risultato è uno solo!
Come posso fare?
Grazie a tutti
LAMASE

"LAMASE" <a@b.c> wrote in message
news:abofl9$bem$1...@fe2.cs.interbusiness.it...

Non e molto chiaro il problema:
Quanti prodotti ci sono ma fammi vedere solo 500 se ci sono piu di 500
(ritornerebbe un numero tra 0 e 500 compreso:
  SELECT LEAST(500,COUNT(*)) FROM prodotti WHERE Nome LIKE 'A%';
Quanti prodotti ci sono in totale:
  SELECT COUNT(*) FROM prodotti WHERE Nome LIKE 'A%';
500 righe con i primi 500 prodotti che centrano (non ordinato):
  SELECT * FROM prodotti WHERE Nome LIKE 'A%' LIMIT 500;
Voglio tutti:
  SELECT * FROM prodotti WHERE Nome LIKE 'A%';
Se intendi di fermare durante il conteggio non penso che ci sia un metodo
diretto per fermarlo prima. Al limite creando una tabella temporanea:
  CREATE TEMPORARY TABLE ttmp(pippo int);
  INSERT INTO ttmpSELECT IDX FROM prodotti WHERE Name LIKE 'A%' LIMIT 500;
  SELECT COUNT(*) FROM ttmp;

   SELECT COUNT(*) FROM ttmp;
Ma cosě perdo il tempo che avevo guadagnato e contando che si tratta di un
sito con molti accessi non posso fare una cosa del genere!
Grazie comunque per i suggerimenti, non conoscevo la funzione LEAST (anche
se non mi serve per ora...)
LAMASE

 sito con molti accessi non posso fare una cosa del genere!
Cmq. scommetto che sia sempre piu' veloce con la tabella temporanea e ti
convenga veramente.
Ho fatto un test veloce dal prompt di mysql con 80000 record di testo
pesante:
0.02 sec creazione tabella
0.28 sec insert into temporary
0.00 sec count(*) // logico, perche' un valore salvato
----
0.30 sec il tutto
query pura count(*):
  3.52 sec
usando una regex un po' pesante del tipo REGEXP 'a.*a.*a.*a.*'
la differenza con 1MB di record deve essere enorme...

 la differenza con 1MB di record deve essere enorme...
La mia regexp č ancora piů pesante, figurati! =)
Ci possono essere problemi se MySql crea due tabelle temporanee insieme? Ho
paura perchč verrebbe fatto tra le 14.000 e le 70.000 volte al giorno, piů o
meno... (ho visto solo i dati di ieri)
Sono tre server, ma c'č anche il sito francese sopra che ha piů o meno gli
stessi numeri...
LAMASE

"LAMASE" <a@b.c> wrote in message
news:abqgjd$9vv$1...@fe1.cs.interbusiness.it...

Essendo una tabella temporanea sparisce dopo la chiusura della connessione.
Se ti conviene o meno dipende molto di risultati possibili:
se hai 1.000.000 di record ed una espressione che ti darebbe 10000 valori un
limite messo a 1000 valori vorebbe dire di controllare 100000 record prima
di terminare la query.
piu valori matchano prima termina. Se il match invece genera solo 100 valori
e tu limit a 1000 devi controllare tutti record sul match (e questo sara'
pesante).
Chiaramente e difficile stimare se ci sono altre possibilita'. Perche' con
un database cosi bisogna indicizzare in modo furbo per non mettere in
ginocchio il server.