banco de dados MySQL realmente lento com uma tabela muito grande [fechada]

1

Eu tenho uma tabela MySQL com 150 milhões de linhas. Abaixo está sua estrutura de dados.

Abaixoestãoalgunsdeseusdados.

Agora, usando o PHP My Admin, eu executei o comando abaixo.

SELECT 'iwords' FROM 'wordstable' WHERE 'iwebs' = "a1" 

Diz que demorou menos de um segundo para executar a consulta. Abaixo está a prova.

Mas,naverdade,issolevoucercade1minutoparaexibirosdados!!

EntãoeucorriumcódigoJavaparaverahora.Estáabaixo.

publicvoidselect(Stringstr){try{longstartTime=System.currentTimeMillis();Statements=con.createStatement();ResultSetexecuteQuery=s.executeQuery("SELECT 'iwords' FROM 'wordstable' WHERE 'iwebs' = \"a1\" ");
        int r=0;
        long endTime = System.currentTimeMillis();
        System.out.println("Time took by Database: "+(endTime-startTime));

        while(executeQuery.next())
        {
            r++;
        }


        System.out.println("Number of rows: "+String.valueOf(r));

    } catch (SQLException ex) {
       ex.printStackTrace();
    }

}

Este código imprimiu o tempo como 88779 milissegundos que é 88.779 segundos!

Este é um problema muito grande, eu tenho uma matriz de palavras para pesquisar, e se forem necessários 88 segundos para pesquisar uma palavra "única", isso seria inútil!

Abaixo estão alguns detalhes da minha tabela de alto nível.

Abaixoestãoosdetalhessobreamáquinadoservidor

Então, minha pergunta é: o MySQL pode realmente fazer esse trabalho? De acordo com o MySQL, demorou menos para operar a consulta, mas por que ela está levando tanto tempo na realidade? Meu futuro banco de dados será maior do que isso, bilhões de registros. Eu preciso completar esta operação dentro de 2-3 segundos pelo menos!

atualização

Conforme solicitado por um membro de SO, executei o comando abaixo e estou postando seus resultados.

> Entrada     EXPLAIN SELECT iwords de wordstable WHERE iwebs = 'a1';

Resultado

Entrada

SETprofiling=1;SELECTiwordsFROMwordstableWHEREiwebs='a1';SHOWprofile;

Saída

Finalmente, estou acessando este servidor usando a Área de Trabalho Remota, mas todo o código e tudo funcionou dentro do servidor.

    
por PeakGen 24.04.2014 / 13:12

2 respostas

4

Você tem algum índice nessa tabela?

Por favor, poste a saída de:

EXPLAIN SELECT iwords FROM wordstable WHERE iwebs = 'a1';

Em seguida, publique a saída do seguinte conjunto de comandos:

SET profiling=1;
SELECT iwords FROM wordstable WHERE iwebs = 'a1';
SHOW profile;

Isto lhe dirá onde o MySQL trava e então você pelo menos saberá por onde começar.

ATUALIZAÇÃO:

Depois de assistir sua pergunta atualizada, eu não sei porque o MySQL não consegue encontrar uma chave adequada para executar sua consulta. Quão vasto é o conjunto de valores que os "iwebs" podem conter? Suas durações são claramente tiradas do cache. Você deve redefinir o cache de consulta do MySQL via

RESET QUERY CACHE;

se você tiver direitos de recarga, caso contrário, use

FLUSH QUERY CACHE;

Se você não puder fazer este comando também, terá que reiniciar sua instância do servidor MySQL.

Volte a executar seus comandos com o sinalizador SQL_NO_CACHE, como disse Nebu, só para ter certeza de que isso não atrapalha.

Então:

EXPLAIN SELECT SQL_NO_CACHE iwords FROM wordstable WHERE iwebs = 'a1';
SET profiling=1;
SELECT SQL_NO_CACHE iwords FROM wordstable WHERE iwebs = 'a1';
SHOW profile;
    
por 24.04.2014 / 13:21
1

Pense que a consulta está em cache. Experimente

SELECT SQL_NO_CACHE iwords FROM wordstable WHERE iwebs = 'a1';

Isso dará uma indicação melhor de quanto tempo leva para executar a consulta. Verifique também se o iwebs está indexado. E por último para realmente acelerar suas consultas, armazene a tabela na memória:

CREATE TABLE ii_table (....) MOTOR = MEMORY PADRÃO CHARSET = utf8

Armazenar a tabela na memória tem algumas implicações. Por exemplo, toda vez que o servidor mysql é parado, a informação da tabela desaparece. Pessoalmente para esses tipos de situações eu crio duas tabelas. Uma tabela de memória na qual as consultas são realizadas e uma tabela de disco. Quando o mysql inicia, ele carrega a tabela de discos na memória.

    
por 24.04.2014 / 13:27

Tags