#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
Когда вы включаете кэш запросов, он возвращает тот же результат (если данные не изменились), не выполняя поиск снова и снова.