Я создаю php-сайт для компании, которая отображает информацию о базе данных на MYSQL, но иногда для загрузки этой информации требуется около 20 секунд, и это просто происходит случайным образом. При правильной работе это занимает около 0,005 секунд.
База данных находится на локальном виртуальном сервере во внутренней сети компании, но я получаю к ней доступ через dyndns.info:port. В случае медленной загрузки, если вы многократно перезагружаетесь, веб-сайт работает медленно, а внезапно, когда он быстро загружается, сохраняет быструю перезагрузку и т.д.
try {
$conection= new PDO("mysql:host=domain.dyndns.info; port=0000; dbname= db", user, pass);
return $conection;
} catch (PDOException $e) {
}
Код медленный в операторе execute:
$statement = $conexion->prepare("SELECT table1.col1, table2.col2, table2.col3, table2.col4, table2.col5 FROM table1 LEFT JOIN table2 ON table1.col6 = table2.col6 LEFT JOIN table 3 ON table1.col1 = table3.col1 LIMIT 10 ");
$start_timer = microtime(true);
$statement->execute();
$piezas = $statement->fetchAll();
$end_timer = microtime(true);
В запросе есть три левых соединения, в table1 - 50000 строк, в table2 - 20 000, а в table3 - 80 000, поэтому я думаю, что это может быть возможной проблемой, но это не объясняет, почему иногда веб-сайт загружается быстро.
Другой возможной проблемой может быть виртуальный сервер, но я не уверен, объясняет ли это случайную медлительность запроса.
Есть идеи, что может быть актуальной проблемой? или какие-либо инструменты тестирования, которые могут мне помочь?
У вас медленный запрос?
Запустите EXPLAIN для запроса и проанализируйте его.
Проблема заключалась в запросе, поэтому я загрузил представление в базу данных и использовал его в своем запросе вместо длинного запроса.
$statement = $conexion->prepare("SELECT * FROM view LIMIT 10");
Это. Спасибо вам, ребята, за все ваши ответы.
Если он загружается быстро иногда, я бы сказал, что из-за кеширования таблица с тонной строк и кучей соединений будет выполняться медленно, я предлагаю реализовать что-то вроде memcached или redis и кэшировать большие запросы, подобные этому. Это поможет вашему сайту быстрее загружаться, и вы сможете контролировать кеш, сколько вам нужно.
query-cache
запросов в большинстве случаев делает медленный запрос быстрым, но для этого не нужно кэшировать правильный индексированный запрос с таким небольшим количеством данных.
убедитесь, что у вас есть правильные индексы на
table1 col1, col6
table2 col6
table3 col1
в конце концов с избыточностью
table2 co6, col2,col3,col4,col5