2012-09-15 2 views
0

У меня этот сложный запрос, и мне нужно его оптимизировать. Без индексов требуется 20 мс, я добавил некоторые индексы, лучше, теперь у меня 4 мс. Но у меня нет опыта. Можете ли вы помочь мне сделать это еще быстрее?Как оптимизировать sql-запрос с индексами

SELECT COUNT(*) FROM(
    SELECT user_id FROM times 
     INNER JOIN tags ON times.user_id = tags.tag_id 
     INNER JOIN users ON tags.user_nr = users.nr 
     WHERE (times.time < 1597313) 
     AND (times.run_id="118") 
     AND (times.user_id != 109330258) 
     AND (times.user_id != 0) 
     AND (times.time != 0) 
     AND (times.cell != 1) 
     AND (users.category_id="4") 
     GROUP BY user_id HAVING count(*) == 1 
    UNION 
    SELECT user_id FROM times 
    INNER JOIN tags ON times.user_id = tags.tag_id 
    INNER JOIN users ON tags.user_nr = users.nr 
    WHERE (times.run_id="118") 
    AND (times.user_id != 109330258) 
    AND (times.user_id != 0) 
    AND (times.time != 0) AND (times.cell != 1) 
    AND (users.category_id="4") 
    GROUP BY user_id HAVING count(*) > 1 
    ) 

Я добавил 3 указателя.

  • таблица тегов - TagID
  • таблица раз - user_id
  • стол пользователя - Nr
+1

Это MySQL или SQLite? Вы отметили как – pickypg

+0

«его лучше, теперь мне нужно 4 мс». Сколько это сейчас? Сколько у вас данных в этих таблицах? Как вы определили, какие индексы добавить? Как выглядит запрос (объяснение)? – Oded

+0

его sqlite (тег удален), теперь у меня есть 4 мс (отредактировано) – Meloun

ответ

0

Вы должны также попытаться индексации tags.user_nr, но это невозможно дать однозначный ответ, не видя план запроса.

0

Если вы говорите о MySQL here in Stack Exchange on the database administrator site, у вас есть аналогичный вопрос, а не то же самое, но OP пытается оптимизировать производительность по большому запросу, подобному вашему. Обратите внимание на второй ответ, он дает полезные советы по горячей настройке ваших запросов.

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