интенсивная выгрузка запросов MySQL

#mysql #optimization #query-optimization

#mysql #оптимизация #оптимизация запросов

Вопрос:

допустим, у меня был интенсивный запрос, который будет выполняться много раз в секунду, например, загруженный сайт со сложной фильтрацией. Вот пример запроса:

 SELECT
SUM(t.qty_inv) / t.deck_cards completed,
t.deck_id
FROM (
  SELECT
  CASE WHEN m.qty_inv IS NULL THEN 0 WHEN m.qty_inv > dc.card_qty THEN dc.card_qty ELSE m.qty_inv END qty_inv,
  dc.deck_id,
  d.deck_cards
  FROM mtgb_test.decks d
  INNER JOIN mtgb_test.decks_cards dc ON (d.deck_id = dc.deck_id)
  LEFT OUTER JOIN (
    SELECT
    COUNT(*) qty_inv, item_print_id print_id
    FROM mtgb_test.inventories_items
    WHERE item_user_id = 1
    GROUP BY item_print_id
  ) m ON (m.print_id = dc.card_print_id)
) t
GROUP BY deck_id
ORDER BY completed DESC;
  

Это будет сделано примерно для 200 000 записей, что, я полагаю, будет интенсивным для БД, если выполняется одновременно (например, одновременный поиск нескольких пользователей). Есть ли какое-либо специализированное программное обеспечение или методология, которые я могу использовать, где so может разгрузить эту интенсивную обработку? Я слышал о sphinx search и все хорошие отзывы о нем, но я считаю, что это хорошо только для текстового поиска? Мой запрос больше касается объединения полей по идентификаторам и подсчета процентов.

Комментарии:

1. Рассмотрим что-то вроде memcached для кэширования результатов этих запросов. Это будет эффективно, если колоды не меняются особенно часто.

2. колоды не меняются часто, но списки людей, которые их ищут, меняются. и таблица decks будет часто меняться, я думаю, потому что люди добавляют их все время.

Ответ №1:

Это не должно быть интенсивным для сервера, если вы используете кэш запросов. Просто взгляните на эту документацию: http://dev.mysql.com/doc/refman/5.5/en/query-cache.html

Когда вы включаете кэш запросов, он возвращает тот же результат (если данные не изменились), не выполняя поиск снова и снова.