Методы для ускорения конкретного запроса

0

У меня есть существующий SQL-запрос, который работает хорошо, но требует того, что я считаю довольно небольшим количеством времени и ресурсов для такого небольшого набора результатов. Я пытаюсь выяснить, можно ли оптимизировать следующий запрос, чтобы я был незнакомым для повышения производительности.

Query

SELECT
    a.programname, count(b.id)
FROM
    groups a
LEFT JOIN
    selections b ON (a.id_selection = b.id AND a.min_age = 18 AND a.max_age = 24)
LEFT JOIN
    member_info c ON (b.memberid = c.memberid AND (c.status = 1 OR c.term_date > '2011-01-31'))
WHERE
    a.flag = 3
GROUP BY
    a.programname
ORDER BY
    a.programid asc;

Здесь три таблицы:

Группы - A

Группы содержат список возможных вариантов выбора, которые может внести член. Член может иметь множественный выбор во всей таблице, но может иметь только один выбор для каждого имени программы и только один возрастный кронштейн. Общая программа определяется флагом, который ограничивает 400+ программ только 100 возможными миксами. Названия программ, сгруппированные вместе:

только член, член плюс супруга, член плюс ребенок, семья

Результат должен возвращать счет всех активных членов, которые имеют этот конкретный выбор, даже если результат равен 0 (т.е. не может ограничить набор результатов 3 строками только потому, что у него есть нулевой подсчет).

Выбор

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

Member_info

содержит информацию о каждом конкретном члене, включая их статус (1 активен), и если дата их завершения передается в случае, если они неактивны.

Мой запрос занимает почти 3/4 полной секунды, что я считаю слишком большим для этого времени информации, но, возможно, я ошибаюсь со всеми необходимыми объединениями.

Любая помощь приветствуется. В случае необходимости я могу расширить свой вопрос.

Детали EXPLAIN

1   SIMPLE  a   ALL                 184 Using where; Using temporary; Using filesort
1   SIMPLE  b   index       memberid_id 7       3845    Using index
1   SIMPLE  c   ALL                 1551    

РЕДАКТИРОВАТЬ В ОТНОШЕНИИ ПРЕДЛОЖЕНИЯ ИНДЕКСА

Я много думал об использовании индексов в отношении этого запроса, но, как предполагают почти все источники, использование в подобном примере может на самом деле быть вредным. Лучшее резюме, которое я нашел, было:

Индексы - это нечто лишнее, что вы может включать в ваши таблицы MySQL увеличить производительность, cbut они действительно имеют некоторые недостатки. Когда вы создаете новый index MySQL строит отдельный блок информацию, которую необходимо обновить каждый раз, когда происходят изменения, внесенные в стол. Это означает, что если вы постоянно обновлять, вставлять и удаление записей в вашей таблице может оказать негативное влияние на производительность.

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

  • 1
    Что EXPLAIN говорит вам?
  • 1
    (a.min_age = 18 AND a.max_age = 24) и (c.status = 1 OR c.term_date> '2011-01-31') должны находиться в предложении where, а не в ограничениях соединения. Кроме того, у вас есть какие-либо индексы на любой из таблиц?
Показать ещё 2 комментария
Теги:

3 ответа

1
Лучший ответ

Есть ли у вас индексы на присоединяемых столбцах? Это было бы очевидным первым шагом.

  • 0
    @ JM4 - Это плохая идея, чтобы угадать результаты потенциальных оптимизаций. Мой опыт больше связан с SQL Server и Oracle, но потребуются некоторые доказательства того, что не следует использовать индексы для столбцов, участвующих в объединении.
1

Кажется, никаких проблем с этим запросом не возникает. Ваши варианты

  • с использованием индексов: если вы планируете читать больше, чем писать
  • с использованием параметризованных запросов, чтобы механизм db мог кэшировать план выполнения для повторного использования

Помимо этого, в системе должно быть какое-то серьезное узкое место или миллионы строк в таблицах, которые вызывают длительное выполнение.

Как вы выполняете запрос, если вы выполняете запрос 100 раз параллельно?

  • 0
    ты имеешь ввиду с точки зрения времени выполнить 100 раз? (примечание: изначально я только запускаю запрос в mysql / navicat, поэтому я не вставил код страницы и не уверен, что собираюсь это делать.
0

Если вы часто запускаете этот запрос, попробуйте использовать параметры привязки, а не просто конкатенировать sql. Таким образом, механизм db может кэшировать план выполнения.

  • 0
    Не уверен, что понимаю ваш ответ. Из моего понимания вашего значения параметры BIND будут работать в среде PHP / PDO. Я ищу, чтобы оптимизировать этот запрос, используя только MySQL.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню