Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Bruno Marim

processamento com muitos registros

Recommended Posts

Pessoal, alguem tem alguma sugestão para executar rotinas com uma grande quantidade de registros?? por exemplo: eu tenho uma tabela com exatos 21.443.501 registros e quando eu executo através do php o codigo abaixo:

 

$result = mysql_query("select * from PESSOA_SP WHERE HASH1 = 0");

$resposta = mysql_num_rows($result);

echo $resposta;

 

ele demora pra processar no brower até travar com erro de memoria... o maximo que consigo é chegar ao numero de 2.000.000 quando eu coloco um limit na query ("select * from PESSOA_SP WHERE HASH1 = 0 limit 0, 2000000")

 

 

alguem pode me ajudar nesta questão??

 

 

ficarei muito grato.

 

 

valeu.

 

Bruno Marim

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas porque você quer rodar tudo isso ?

Se for necessário trazer tudo isso mesmo, o melhor e mais aconselhado é fazer paginação de resultados.

 

Aqui no Fórum tem vários exemplos de paginação em PHP e ASP.

 

Obrigado por perguntar. Se possível gostaria da sua resposta em Verdana, Azul tamanho 12 e em italiano.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas porque você quer rodar tudo isso ?

Se for necessário trazer tudo isso mesmo, o melhor e mais aconselhado é fazer paginação de resultados.

Aqui no Fórum tem vários exemplos de paginação em PHP e ASP.

Obrigado por perguntar. Se possível gostaria da sua resposta em Verdana, Azul tamanho 12 e em italiano.

 

LIMIT não adianta para tabelas grandes e quando você não quer ler todos os registros...rs. Uma consulta sempre vai ler todos os registros e pegar o número informado no LIMIT. Paginação de resultados deve ser feita com WHERE e não com LIMIT, pois, LIMIT lâ tudo, mas WHERE trava.

 

Convido você a fazermos um teste.

 

Criemos uma tabela no banco de dados test, chamada t1:

 

mysql> CREATE TABLE t1 (id int, PRIMARY KEY(id)) ENGINE = MyISAM;
Query OK, 0 rows affected (0,03 sec)

Vamos inserir cinco linhas:

 

mysql> INSERT INTO t1 VALUES (1), (2), (3), (4), (5);
Query OK, 5 rows affected (0,02 sec)
Records: 5  Duplicates: 0  Warnings: 0

Agora, quantas linhas uma consulta com LIMIT 2 nos retornará e quantas linhas são lidas na verdade?

 

mysql> SELECT id FROM t1 LIMIT 2;
+----+
| id |
+----+
|  1 | 
|  2 | 
+----+
2 rows in set (0,00 sec)

mysql> EXPLAIN SELECT id FROM t1 LIMIT 2;
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
| id | select_type | table | type  | possible_keys | key     | key_len | ref  | rows | Extra       |
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
|  1 | SIMPLE      | t1    | index | NULL          | PRIMARY | 4       | NULL |    5 | Using index | 
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
1 row in set (0,00 sec)

Ahaaaaaaaaaaaaaaaaaaaa!! 2 linhas foram retornadas pela consultas mas, como disse anteriormente, são lidas todas as linhas da tabela!! Não se enganem com paginações com LIMIT, em todas as páginas que você exibir em seu sistema, todas as linhas da tabela são lidas, por isso paginação é com WHERE.

 

Uma consulta com WHERE id < 3 retornará quantas linhas e lerá quantas linhas de uma tabela?

 

mysql> SELECT id FROM t1 WHERE id < 3;
+----+
| id |
+----+
|  1 | 
|  2 | 
+----+
2 rows in set (0,00 sec)

mysql> EXPLAIN SELECT id FROM t1 WHERE id < 3;
+----+-------------+-------+-------+---------------+---------+---------+------+------+--------------------------+
| id | select_type | table | type  | possible_keys | key     | key_len | ref  | rows | Extra                    |
+----+-------------+-------+-------+---------------+---------+---------+------+------+--------------------------+
|  1 | SIMPLE      | t1    | range | PRIMARY       | PRIMARY | 4       | NULL |    3 | Using where; Using index | 
+----+-------------+-------+-------+---------------+---------+---------+------+------+--------------------------+
1 row in set (0,00 sec)

Matamos o problema?

 

Qualquer dúvida, continue o post.

 

Happy MySQL'ing! http://forum.imasters.com.br/public/style_emoticons/default/natal_wink.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

do alto da minha humildade e ignorancia eu pergunto... pra que alguem quer ver 2milhoes de resultados em sua tela? seu problema ai eh q isso gera uma pagina mto pesada pra ser exibida, nao tem nada a ver com o MySQL

Compartilhar este post


Link para o post
Compartilhar em outros sites

Realmente a parte que cabe ao mysql é insignificante em relação a que será gasta para exibir estes dados

Compartilhar este post


Link para o post
Compartilhar em outros sites

do alto da minha humildade e ignorancia eu pergunto... pra que alguem quer ver 2milhoes de resultados em sua tela? seu problema ai eh q isso gera uma pagina mto pesada pra ser exibida, nao tem nada a ver com o MySQL

 

Concordo plenamente, Giesta.

O problema aqui talvez não seja de MySQL e sim de regra de negócio.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.