Я только что установил стек AMP на VPS. Я вошел в консоль mysql и обнаружил, что запросы выполняются невероятно медленно. Для выполнения одного запроса на обновление, нацеленного на 1 строку в таблице с ~ 200 строками, потребовалось 0,5 секунды (выполнение того же запроса на моем ноутбуке с Windows занимает 0,001 секунды).
Я думал, что это связано с тем, что у VPS недостаточно ресурсов, но после некоторых тестов, а именно ввода-вывода:
1073741824 bytes (1.1 GB) copied, 14.207 s, 75.6 MB/s
avg-cpu: %user %nice %system %iowait %steal %idle
0.01 0.00 0.00 0.03 0.00 99.96
и скрипт бенчарка PHP, вроде нет проблем с ресурсами. Скрипт теста PHP завершился за 5 секунд, тогда как моему ноутбуку i7 с SSD потребовалось 17 секунд.
Есть идеи, что может быть не так?
Проблема не решена. Я сменил хостинг-провайдеров и получил ожидаемые результаты. Мне не удалось выяснить, что изначально было причиной проблемы.
Некоторые тесты и вопросы, слишком длинные для комментариев:
Какой движок вы используете для этой таблицы (SHOW CREATE TABLE tablename\G
, ищите ДВИГАТЕЛЬ внизу)?
Повышается ли производительность после нагрева кеша (то есть, если вы дважды выполняете запрос с немного разными данными обновления, будет ли второй запускаться быстрее)?
Можете ли вы перечислить содержимое вашего my.cnf?
Что вы получаете при беге strace -cp $(pidof mysqld)
при запуске UPDATE
? Для этого запустите strace, затем запустите запрос, затем нажмите CTRL-C на strace. Он выдаст несколько очень удобных значений.
Если бы мне дали только одно предположение, я бы предположил, что у вас нет пропуска имени-разрешения, и вы подключаетесь с адреса, который не отвечает ни на обратный, ни на пересылающий DNS (или ваш resolv.conf
неправильно настроен). Но это чисто выстрел в темноте без запрошенной выше информации. Простой тест: подключиться первый (то есть запустить mysql
CLI с соответствующими параметрами хоста и порта), затем запустить свой UPDATE
из этого интерактивного сеанса и посмотрите, выше ли общая скорость по сравнению с выполнением запроса в пакетном режиме с -e
.