2013-04-06 5 views
0

Итак, у меня есть базовый запрос, который выбирает между диапазоном дат. Кажется, что я занимаюсь (относительно долгое время для обработки), мне было интересно, что я могу сделать, чтобы улучшить время обработки. Вот запрос.Ускорение запроса mysql

SELECT h.id as hid,h.created_on,u.id as uid,u.fname,u.lname,u.email 
FROM hud h 
LEFT JOIN user_hud uh on h.id = uh.hid 
LEFT JOIN users u on u.id = uh.uid 
WHERE 
    h.created_on 
    BETWEEN DATE_SUB(CURDATE() ,INTERVAL 12 MONTH) 
     AND DATE_SUB(CURDATE() ,INTERVAL 7 DAY) 
+0

Перерывы в запросах допускаются. – GolezTrol

+0

'EXPLAIN', кто-нибудь? – raina77ow

+1

У вас есть индексы на '' 'hud.id''',' '' user_hud.hid''', '' 'users.id''',' '' user_hud.uid'' и '' 'hud .created_on''' столбцы? Отправьте запрос '' 'EXPLAIN''' запроса (http://dev.mysql.com/doc/refman/5.5/en/explain.html). Сколько строк возвращается и каково время обработки? – dtech

ответ

1

Make индексы на столбцах hud.id, user_hud.hid, users.id, user_hud.uid и hud.created_on.

Без индексов вся таблица необходимо проверить на соединение. С помощью индексов вы можете использовать гораздо более эффективные методы (за счет уменьшения производительности и потери на диске)

0

Сначала вам нужны по крайней мере следующие индексы: (created_on) в hud, (hid) в user_hud. Тогда вы можете посмотреть на ваш запрос и понять, что ваше состояние находится на первом столе в вашем присоединиться, так что вы можете переместить это условие в подзапрос:

SELECT hids.*, u.id as uid, u.fname, 
      u.lname, u.email 
FROM (
    SELECT id as hid, created_on 
    FROM hud, 
     (SELECT DATE_SUB(CURDATE() ,INTERVAL 12 MONTH) as year_ago, 
        DATE_SUB(CURDATE() ,INTERVAL 7 DAY) as week_ago) d 
    WHERE created_on BETWEEN year_ago AND week_ago 
    ) as hids 
LEFT JOIN user_hud uh USING(hid) 
LEFT JOIN users u on u.id = uh.uid; 
+0

условие находится на '' 'hud''', поэтому оптимизатор должен просто получить записи из hud, которые соответствуют условию, поэтому я считаю, что это не нужно. Но EXPLAIN - единственный способ узнать наверняка. Также: не существует ли сейчас 2 таблицы в '' 'FROM'''? Я думаю, вы хотели выбрать только из подзапроса. – dtech

+0

@ dtech, к сожалению оптимизатор не достаточно для samrt, но вы правы, объясните, может ли пролить свет. В подзапросе есть две таблицы, но с этим не должно быть никаких проблем, вторая выполняется только один раз. – newtover

Смежные вопросы