У нас есть простое веб-приложение, работающее на виртуальной машине, которое сохраняет свои данные в базе данных MySQL 5.5 с движком InnoDB. Все работало нормально около трех лет, но вдруг стало очень медленно.
Например, у меня есть очень простая таблица с адресами:
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
Эта таблица содержит около 800 записей, что на самом деле не так много. Но выполнение запроса
SELECT * FROM addresses
в тестовых целях, кажется, никогда не закончить. Я проверил это с помощью CLI mysql на самом сервере: он выводит некоторые строки таблицы, а затем очень долго ждет, пока не выведет следующие строки.
Так что, возможно, это проблема на этапе отправки данных, но я не уверен.
ВМ имеет 2 ГБ оперативной памяти и используется только 320 МБ. Процессор также работает на очень низком уровне от 1 до 2%. mytop не показывает никаких других запросов, которые блокируют сервер. ИТ-администратор сказал, что они ничего не изменили в аппаратной части.
Я уже пробовал что-то вроде перезапуска сервера базы данных, перезапуска виртуальной машины. Ничего не помогло
редактировать:
EXPLAIN SELECT * FROM addresses
дает мне этот результат:
+----+-------------+-----------+------+---------------+------+---------+------+------+-------+
| 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)
источник
mysql -u username -ppassword mydb -e 'SELECT * FROM addresses
выводится медленно, но, добавляя `> test.txt`, он работает очень быстро. Теперь это, наверное, другой вопрос !? Как я мог расследовать это?Ответы:
Если загрузка процессора низкая, это указывает на отсутствие проблем с отсутствующими индексами, если бы это было так, запросу просто потребовалось бы больше процессора и доступа к диску. Также вы сказали, что он работал в течение 3 лет.
Проверяли ли вы общую скорость доступа к диску (особенно в разделе, где расположена база данных)? Например, используя
dd
как здесь . То, что вы описываете, звучит как мертвый диск или полумертвый рейд. Надеюсь, у меня есть резервные копии?источник
Вы можете попробовать пару вещей,
Индексирование позволяет быстро находить записи без предварительного полного сканирования таблицы, значительно сокращая время выполнения.
Когда он используется перед запросом SELECT, он описывает, как MySQL намеревается выполнить запрос, и количество строк, которые ему необходимо обработать, прежде чем он завершится.
Существует множество оптимизаторов MySQL, которые могут вам помочь.
Помогите это поможет
источник
htop
показывает, что из 2050 МБ ОЗУ используется только 307 МБ.name
«firstname». Во-вторых, вы уверены, что правильно сделали индексацию? возможные_ключи: NULL, если столбец равен NULL, это означает, что не найдено соответствующих индексов.