Я размещаю restful API, созданный с использованием Silex (микроструктура PHP на основе Symfony). Следуя this tutorial, этот API возвращает объекты json в зависимости от параметров. Однако некоторые запросы настолько низки, что тайм-аут пинки OvH в в и я получаю следующее сообщение:Низкая производительность и тайм-аут с моим отдыхом API
SQLSTATE[HY000]: General error: 2013 Lost connection to MySQL server during query
Хотя некоторые из моих запросов SQL немного длинные (до 8-12 строк), они не являются, что комплекс и я не понимаю, почему производительность низкая.
Есть ли что-нибудь, что я могу сделать, чтобы ускорить его, и чтобы избежать времени от OVH? Я запрашиваю все элементы, используя только один запрос SQL (таким образом, иногда это длинный), и различные операторы (ГДЕ, несколько И/ИЛИ, В ...).
Вот пример запроса SQL, который принимает навсегда для того чтобы получить:
SELECT *
FROM staff
WHERE staff_id IN (
SELECT host_id
FROM class_host
WHERE class_id IN (
SELECT class_id
FROM class
WHERE classroom_id IN (
SELECT classroom_id
FROM classroom
WHERE classroom_gps_lat BETWEEN $ARRAY_VALEUR [0]
AND $ARRAY_VALEUR [2]
AND classroom_gps_lon BETWEEN $ARRAY_VALEUR [1]
AND $ARRAY_VALEUR [3]
)
)
)
OR staff_id IN (
SELECT teacher_id
FROM class_teacher
WHERE class_id IN (
SELECT class_id
FROM class
WHERE classroom_id IN (
SELECT classroom_id
FROM classroom
WHERE classroom_gps_lat BETWEEN $ARRAY_VALEUR [0]
AND $ARRAY_VALEUR [2]
AND classroom_gps_lon BETWEEN $ARRAY_VALEUR [1]
AND $ARRAY_VALEUR [3]
)
)
)
AND class_id IN (
SELECT class_id
FROM class_teacher
WHERE teacher_id IN (
SELECT staff_id
FROM staff
WHERE staff_name LIKE $QUOTEDARRAY
)
)
Тем не менее, имеющих проблемы с производительностью. Мой код пошел от этого:
SELECT Count(*) AS COUNT
FROM staff
WHERE staff_id IN (SELECT host_id
FROM class_host
WHERE (class_id IN (SELECT class_id
FROM class
WHERE classroom_id IN (SELECT
classroom_id
FROM
classroom
WHERE
region_id IN ('FR'))))
OR staff_id IN (SELECT teacher_id
FROM class_teacher
WHERE class_id IN (SELECT class_id
FROM class
WHERE
classroom_id IN (SELECT
classroom_id
FROM
classroom
WHERE
region_id IN (SELECT
region_id
FROM region
WHERE
region_country_code IN (
'FR'))))))
к этому:
SELECT Count(*) AS COUNT
FROM staff
JOIN class_host
ON staff.staff_id = class_host.host_id
JOIN class AS class1
ON class_host.class_id = class1.class_id
JOIN classroom AS classroom1
ON class1.classroom_id = classroom1.classroom_id
JOIN region AS region1
ON classroom1.region_id = region1.region_id
JOIN class_teacher
ON staff.staff_id = class_teacher.teacher_id
JOIN class AS class2
ON class_teacher.class_id = class2.class_id
JOIN classroom AS classroom2
ON class2.classroom_id = classroom2.classroom_id
JOIN region AS region2
ON classroom2.region_id = region2.region_id
WHERE region1.region_country_code IN ('FR')
AND region2.region_country_code IN ('FR')
Должен ли я использовать "быстрее" присоединяется? Как я могу оптимизировать эти запросы?
EDIT: EXPLAIN массив из MySQL:
Explain from MySQL database for the query above
Не связанный с вашей проблемой, но для любви к печенью, пожалуйста * отформатируйте свои запросы! * И для вашего собственного здравомыслия, и для нас. – Siyual
Прошу исследовать 'JOIN's. На самом деле нет необходимости в всех подзапросах, которые у вас есть в вашем запросе. – Siyual
Будет делать в будущем @Siyual! И ПРИСОЕДИНИТЕСЬ к этому, спасибо. Я изменю свои запросы и посмотрю, как это происходит. Не уверен, как принять ваш ответ, поскольку он фактически является комментарием, а не фактическим ответом. –