Jump to content
Paulo de Tarso F. M.

MySQL: select * from...

Recommended Posts

Olá pessoal!

 

Uma dúvida, tenho uma base de registros com suas 10.000 linhas separadas em 50 e tra-lá-lás colunas. Qual é a melhor forma de montar uma query abaixo de uma forma mais otimizada? O host está enviando avisos de queries lentas, mas eu não sei como resolver...

SELECT * FROM tabela

As tabelas possuem PKs e evito usar o *, especifico todas as colunas que eu quero, mesmo que seja a tabela inteira em algumas situações, mas ainda assim costumo incluir todos os nomes, inclusive para poder usar um alias.

 

Diante disso, que outras boas práticas posso usar para amenizar esse problema? Reforço: preciso exportar a tabela inteira em alguns momentos, isso é fato, mas queria saber se existe alguma forma de melhorar esse processo.

 

Abraço!

Share this post


Link to post
Share on other sites

Obrigado Alaerte, vou ler os materiais indicados e qualquer coisa volto a escrever.

 

Obs.: Acho que o fórum mais adequado seria de MySQL, né? Não sei porque eu postei em PHP... rsrsrs... Apesar de eu montar os sistemas com PHP, nesse momento a minha dúvida se restringe apenas à questão do banco de dados.

Share this post


Link to post
Share on other sites

Olha eu voltando com o assunto de otimizações... Alaerte, a criação de índices já foi feita, mas o problema ainda não foi resolvido... :(

 

Eu continuo com o problema de exportar a base inteira via PHP + MySQL, quando se está navegando pelas páginas, ok, a gente consegue paginar os resultados com LIMIT, mas e na hora de exportar a base inteira? Não tem como paginar porque os dados são exportados para um XLS. Então, o que fazer?

 

Hoje essa exportação é feita do jeito "tradicional" mesmo, que seria a query com os campos porém sem o LIMIT, aí o servidor reclama de queries lentas... :huh:

SELECT [campos] FROM [tabela] ORDER BY [id]

É possível executar isso de outra forma menos prejudicial?

 

Abraços

Share this post


Link to post
Share on other sites

Olá lokaodomau, segue o resultado:

+----+-------------+------------------+------+---------------+-----+---------+-----+------+----------------+  
| id | select_type | table            | type | possible_keys | key | key_len | ref | rows | Extra          |  
+----+-------------+------------------+------+---------------+-----+---------+-----+------+----------------+  
| 1  | SIMPLE      | [nome da tabela] | ALL  |               |     |         |     | 9903 | Using filesort |  
+----+-------------+------------------+------+---------------+-----+---------+-----+------+----------------+  
Essa tabela tem apenas uma chave primária, e ela foi usada no ORDER BY:

EXPLAIN SELECT * FROM [nome da tabela] ORDER BY idregistro;

Share this post


Link to post
Share on other sites

Normalmente o * nao impacta tanto quanto as clausulas(where) e junções(join).

 

Poderia postar a consulta completa bem como o modelo er do banco?

Share this post


Link to post
Share on other sites

Olá giesta, então a consulta completa é essa mesma, porque nós temos um sistema padrão no qual a maioiria das queries de exportação são assim, pegando tudo da tabela e ordenando por uma coluna específica.

 

Um detalhe, nem sempre o ORDER BY é pela PK da tabela, pode ser que seja isso... Temos relatórios onde o ORDER BY da exportação é pelo nome, outro pelo e-mail, outro pelo nome da empresa... Todos esses campos precisariam ser indexados? :blink:

 

Peguei uma tabela como exemplo e ela está assim:

CREATE TABLE `2015_visitantes` (
  `idvisitante` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `idioma` varchar(20) DEFAULT '0',
  `categoria` varchar(50) DEFAULT NULL,
  `processo_seletivo` varchar(20) DEFAULT NULL,
  `nome` varchar(100) DEFAULT NULL,
  `cpf` varchar(15) DEFAULT NULL,
  `email` varchar(100) DEFAULT NULL,
  `sexo` varchar(20) DEFAULT NULL,
  `datanasc` date DEFAULT NULL,
  `cep` varchar(20) DEFAULT NULL,
  `endereco` varchar(50) CHARACTER SET latin1 COLLATE latin1_general_ci DEFAULT NULL,
  `numero` varchar(20) DEFAULT NULL,
  `complemento` varchar(50) DEFAULT NULL,
  `bairro` varchar(50) CHARACTER SET latin1 COLLATE latin1_general_ci DEFAULT NULL,
  `cidade` varchar(50) CHARACTER SET latin1 COLLATE latin1_general_ci DEFAULT NULL,
  `estado` varchar(50) DEFAULT NULL,
  `pais` varchar(50) DEFAULT NULL,
  `situacao_inscricao` varchar(30) DEFAULT NULL,
  `situacao_final` varchar(30) DEFAULT NULL,
  `promocode` varchar(15) DEFAULT NULL,
  `historico` text,
  `obs` text,
  `headers` text,
  `datainsc` datetime DEFAULT NULL,
  PRIMARY KEY (`idvisitante`),
  KEY `idx_1` (`cpf`,`processo_seletivo`),
  KEY `idx_2` (`email`,`processo_seletivo`)
) ENGINE=MyISAM AUTO_INCREMENT=20159 DEFAULT CHARSET=latin1;

Share this post


Link to post
Share on other sites

Uma duvida.

 

A performance da consulta sem Order By é mto superior a consulta com Order By? Para responder não execute uma atras da outra senao ele vai dar hit. De preferencia reset o banco ou a maquina , ou ainda desligue o hit.

 

E respondendo a sua pergunta. Sim. Um indice irá melhorar sensivelmente a performance desde que a ordenação seja pedida pelo mesmo campo do indice.

Fazer um indice para cada caso pode parecer exagerado, mas dependendo do caso pode ser util.

 

Vale lembrar que a presença de um ou mais indices/chaves impacta o tempo inserção de novas linhas.

Share this post


Link to post
Share on other sites

Fiz as duas consultas, seguem os resultados:

 

SELECT * FROM 2015_visitantes
Time: 8.398ms

 

SELECT * FROM 2015_visitantes ORDER BY idvisitante
Time: 8.571ms

:huh:

Share this post


Link to post
Share on other sites

Não tem nem 10.000... ¬¬

 

Nossas tabelas não costumar ser grandes não, para você entender, trabalhamos com credenciamento de eventos e cada evento possui uma base diferente. Estamos trabalhando em um evento agora no qual recebemos uma base prévia com mais de 400.000 registros, esse foi o maior que vi até hoje, mas é a exceção, a maioria dos eventos não passa de 10.000, 15.000 registros.

Share this post


Link to post
Share on other sites

todas as consultas estao lentas ou apenas essa?

 

Quantos campos tem nessa coluna? experimente trocar o * por apenas o q vc realmente precisa...

Share this post


Link to post
Share on other sites

São só essas queries onde temos que exportar a base inteira, de uma maneira geral isso não acontece sempre, é somente quando alguém está acessando a nossa área administrativa e precisa exportar tudo...

 

Bom, tentei executar a query com todas as colunas da tabela ao invés do * e olha só o que aconteceu:

 

Time: 44.682ms
:wacko:

 

Não sei se isso pode influenciar, mas a conexão com a internet aqui na empresa hoje está beeeeeeeem lenta...A mesma query anterior está demorando 34 segundos...

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By maruoppolo
      Olá, tenho 2 tabelas:
       
      tb_dados: ID - MUSICA
       
      tb_votos: ID - VOTO - RADIO - MUSICA
       
      Preciso fazer uma query que traga as musicas da tb_dados porém ordenando pelo número de votos que ela teve na tb_votos.
       
      Então assim, existem 2 tipos de voto 1 = like e 2 = dislike, cada ver que um usuário vota eu pego qual radio que ele esta ouvindo e salvo no campo radio, o id da musica na tb_dados e salvo no campo musica da tb_votos e coloco o número 1 para like e 2 para dislike no campo voto.
       
      A query precisa contar quantos likes teve na tv_votos filtrando por radio e mostrando os resultados em ordem decrescente as musicas com mais likes.
       
      A ideia é trazer as 10 musicas com mais like de cada radio
       
      Alguma ideia de como fazer?? Estou enroscado nisso a dias.
    • By Chester1
      oi, eu to tentando mexer com servidores agora no PHP e esta dando um erro muito estranho que quando eu procuro em um programa que acha erros de sintaxe ele me diz que o erro esta no </HTML>    se alguem puder me dizer qual foi o erro que eu cometi eu agradeceria
       

       
      <HTML> <HEAD><TITLE>incluindo no banco de dados</TITLE></HEAD> <body> <BODY bgcolor="#d0d0d0"> <center> <h3>Lanchonete coma bem (voltada para o internauta)</h3> <h1>24horas</h1> <?php $login_digitado=$_POST['login']; $senha=$_POST['senha']; $nome=$_POST['nome']; $email=$_POST['email']; $telefone=$_POST['telefone']; $celular=$_POST['celular']; $endereco=$_POST['endereco']; $complemento=$_POST['complemento']; if ($login_digitado == "" || $senha == "" || $nome =="" || $email == "" || $telefone == "" || $endereco == "" || $complemento == "") { echo "existem(m) campos(s) de preenchimento obrigatorio em branco,<BR> infelizmente tera que voltar para preenche-lo(s)."; echo "<BR><a href=\"cadastro.php\">clique aqui para tentar novamente</a>"; } else { { $link=mysql_connect("localhost", "root", "") or die ("<h1>nao foi possivel conectar !!!</h1> ".mysql_error());  
      obs :estou trabalhando com formularios e servidores
         
         
         
         
      ?>
      </BODY>
      </HTML>
    • By rainbowily
      Sou nova em sql e estou com duvida em como fazer uma consulta:
      Eu tenho uma tabela de produto(id, descricao), cor(id, nome) e produto_cor(id, id_produto, id_cor). Preciso descobrir se tem algum produto que tenhas as cores (1,2,3) respectivamente para não deixar cadastrar outro produto. Alguém poderia me ajudar? Obrigada



    • By DavidPin94
      Boa tarde, estou tentando criar uma validação para saber se o usuário já está cadastrado no meu banco de dados para meu sistema ficar mais organizado, porém quando realizo o teste cadastrando um usuário já cadastrado, o cadastro ocorre sendo que não era para ocorrer
      <?php require_once("conexao.php");?> <?php if (isset($_POST['usuario'])) { $nome = utf8_decode($_POST['usuario']); $senha = utf8_decode($_POST['senha']); $inserir = "INSERT INTO cadastro "; $inserir .= "(usuario, senha) "; $inserir .= "VALUES "; $inserir .= "('$nome', '$senha')"; $query = "SELECT usuario FROM cadastro WHERE usuario = '$usuario' LIMIT 1"; $consulta = mysqli_query($conecta, $query); $query = "SELECT usuario FROM clientes WHERE usuario = '$usuario' LIMIT 1"; $consulta = mysqli_query($conecta, $query); if (mysqli_num_rows($consulta) < 1) { $operacao_inserir = mysqli_query($conecta, $inserir); if (! $operacao_inserir) { die("Erro no banco"); }else header("location: login.php"); }else{ die("Usuário existente!"); } } ?> <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>Cadastrar novo usuário</title> <link rel="stylesheet" type="text/css" href="estilo.css"> </head> <body> <nav> <ul> <li><a href="inicial.php">PÁGINA INICIAL</a></li> <li><a href="quem_somos.php">QUEM SOMOS</a></li> </ul> </nav> <div id="cadastro"> <form method="post" action="cadastro.php"> <label>Digite seu nome de usuário</label> <input type="text" name="usuario" placeholder="Ex: Usuario123" required size="50" minlength="5" maxlength="20" autofocus><br> <label>Digite sua senha</label> <input type="password" name="senha" placeholder="Deve conter mais de 5 caracteres" required size="50" minlength="5" maxlength="20" autofocus><br> <input type="submit" value="Cadastrar" id="enviar" name="enviar"> </form> </div> </body> </html> ,  alguém poderia me ajudar?  Meu código:
    • By thunanchiu@hotmail,com
      Bom dia, gostaria dessa ajuda.
      Tenho uma tabela de "INSCRIÇÃO" onde a mesma possui 2 chaves estrangeiras (CAND_SQ e CANDPL_SQ). Ambas as chaves estrangeiras possuem um campo CPF.
      Gostaria de saber como eu trago os cpfs que são iguais dentro da inscrição.
      Ou seja, atualmente tenho uma INSCRIÇÃO onde pode ser feita de duas maneiras diferentes. Inscrição Regular e Inscrição Atraso. Quando eu for fazer a Inscrição Atraso, caso eu já tenha feito a Inscrição Regular não poderei fazer a Inscrição Atraso.
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.