Как оптимизировать простой запрос MySQL с большим количеством ВНУТРЕННИХ СОЕДИНЕНИЙ - PullRequest
0 голосов
/ 06 марта 2011

Я нашел информацию о том, как оптимизировать запросы MySQL , но большинство советов, кажется, предлагают избегать вещей, для которых MySQL не построен (например, вычисления, проверка и т. Д.)другая рука очень прямолинейна, но объединяет множество столов.

Есть ли подход к ускорению простых запросов со многими INNER JOINS?Как бы я исправить мой запрос ниже?

SELECT t_one.id FROM table_one t_one 
INNER JOIN entr_to_state st 
INNER JOIN entr_to_country ct 
INNER JOIN entr_to_domain dm 
INNER JOIN entr_timing t 
INNER JOIN entr_to_weather a2w 
INNER JOIN entr_to_imp_num a2i 
INNER JOIN entr_collection c 
WHERE t_one.type='normal' 
AND t_one.campaign_id = c.id 
AND t_one.status='running' 
AND c.status='running' 
AND (c.opt_schedule = 'continuous' OR (c.opt_schedule = 'schedulebydate' 
AND (c.start_date <= '2011-03-06 14:25:52' AND c.end_date >= '2011-03-06 14:25:52'))) 
AND t.entr_id = t_one.id AND ct.entr_id = t_one.id 
AND st.entr_id = t_one.id AND a2w.entr_id = t_one.id 
AND (t_one.targeted_gender = 'male' OR t_one.targeted_gender = 'both') 
AND t_one.targeted_min_age <= 23.1 AND t_one.targeted_max_age > 23.1 
AND (ct.abbreviation = 'US' OR ct.abbreviation = 'any') 
AND (st.abbreviation = 'CO' OR st.abbreviation = 'any') 
AND t.sun = 1 AND t.hour_14 = 1 
AND (a2w.weather_category_id = 1 OR a2w.weather_category_id = 0) 
AND t_one.targeted_min_temp <= 46 
AND t_one.targeted_max_temp > 46 GROUP BY t_one.id

Ответы [ 2 ]

2 голосов
/ 06 марта 2011

Вам нужно будет ОБЪЯСНИТЬ ВЫБОР запроса, проверить, какие части запроса не используются в индексах, а затем попытаться их проиндексировать.Если возможно, разбейте запрос на более мелкие части.

Если вы действительно не можете каким-либо образом оптимизировать базовую БД или ваш запрос, вы можете прибегнуть к плоской таблице, содержащей данные, необходимые для быстрого доступа.,Затем просто подключите основной запрос, чтобы обновлять плоский стол так часто, как это необходимо.

2 голосов
/ 06 марта 2011

Индексируйте все соответствующие поля, конечно, которые, я уверен, у вас есть

Затем найдите, какие соединения являются самыми дорогостоящими, запустив EXPLAIN SELECT...

Рассмотрите возможность их разделения на отдельный запрос, т.е. сузьте записи, которые вы ищете, затем выполните объединения на этих записях, а не на всех записях

т.е.

SELECT c.*, ....
FROM (SELECT x, y, z .... ) AS c
...