MySQL extremamente lento em consultas SELECT muito simples

10

Temos um aplicativo da Web simples executado em uma máquina virtual que salva seus dados em um banco de dados MySQL 5.5 com o mecanismo InnoDB. Tudo funcionou bem por cerca de três anos, mas de repente se tornou extremamente lento.

Por exemplo, tenho uma tabela muito simples contendo endereços:

CREATE TABLE 'addresses' (
  'address_id' int(11) NOT NULL AUTO_INCREMENT,
  'name' varchar(64) CHARACTER SET latin1 NOT NULL,
  'firstname' varchar(64) CHARACTER SET latin1 NOT NULL,
  'street' varchar(64) CHARACTER SET latin1 NOT NULL,
  'housenumber' varchar(16) CHARACTER SET latin1 NOT NULL,
  'zip' varchar(5) CHARACTER SET latin1 NOT NULL,
  'city' varchar(64) CHARACTER SET latin1 NOT NULL,
  'email' varchar(64) CHARACTER SET latin1 NOT NULL,
  'phone' varchar(16) CHARACTER SET latin1 NOT NULL,
  'birthdate' date NOT NULL,
  PRIMARY KEY ('address_id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin

Esta tabela contém cerca de 800 entradas, o que não é muito. Mas executando a consulta

SELECT * FROM addresses

para fins de teste, parece que nunca termina. Eu verifiquei isso com o mysql CLI no próprio servidor: Ele gera algumas linhas da tabela e, em seguida, aguarda muito tempo até que ele produza as próximas linhas.

Então, talvez seja um problema na fase de envio de dados, mas não tenho certeza.

A VM tem 2 GB de RAM e apenas 320 MB são usados. A CPU também funciona com 1 a 2% muito baixo. mytop não mostra outras consultas que estão bloqueando o servidor. O administrador de TI disse que eles não mudaram nada do lado do hardware.

Eu já tentei algo como reiniciar o servidor de banco de dados, reiniciar a máquina virtual. Nada ajudou.

edit:

EXPLAIN SELECT * FROM addresses

me dá esse resultado:

+----+-------------+-----------+------+---------------+------+---------+------+------+-------+
| id | select_type | table     | type | possible_keys | key  | key_len | ref  | rows | Extra |
+----+-------------+-----------+------+---------------+------+---------+------+------+-------+
|  1 | SIMPLE      | addresses | ALL  | NULL          | NULL | NULL    | NULL |  793 |       |
+----+-------------+-----------+------+---------------+------+---------+------+------+-------+
1 row in set (0.00 sec)
    
por tabb 10.11.2016 / 19:53

2 respostas

13

Se o carregamento da CPU estiver baixo, isso indica que não há problemas com a falta de índices, se esse for o caso, a consulta só precisaria de mais acesso à cpu e ao disco. Também disse que funcionou bem durante 3 anos.

Você verificou a velocidade geral de acesso ao disco (especificamente na partição onde o banco de dados está localizado)? Por exemplo. usando dd como aqui . O que você está descrevendo soa como um disco morto ou um ataque meio morto. Tenho backups, espero?

    
por 10.11.2016 / 21:45
10

Você pode tentar algumas coisas,

  1. Você tem configuração de índices?

A indexação possibilita a rápida localização de registros sem antes fazer uma varredura completa na tabela, reduz drasticamente os tempos de execução.

CREATE INDEX idx_name ON addresses(name);
  1. Antes de executar a consulta, use a palavra-chave EXPLAIN primeiro,

Quando usado na frente de uma consulta SELECT, ele descreverá como o MySQL pretende executar a consulta e o número de linhas que precisará processar antes de terminar.

  1. Faça algumas alterações no seu mysql.ini, se for uma VM, aumente a RAM e configure o seu mysql.ini para ver se o desempenho aumenta.

Existem muitos otimizadores do MySQL por aí que podem orientá-lo.

Ajude isso a ajudar

    
por 10.11.2016 / 20:10