Intereting Posts
Есть ли способ получить разные результаты для одного и того же SQL-запроса, если данные остаются неизменными? Поддерживает ли sqlite3 триггер для автоматического обновления поля «дата_потока» update_on? Zend_Db упорядочить по полю Значение вставлять текст в таблицу, зависящий от значений, возвращаемых из хранимых процедур (и оператора select) Сравнение строк с разделителями-запятыми в SQL Дифференцируя логику от других инфиксных операторов Как использовать SEQUENCE в Apache Derby? Предпочтительный метод проектирования базы данных для назначения ролей пользователей? (Шляпы против групп) SQL: как узнать, является ли содержимое столбца varchar числовым? ORDER В списке значений IN Просмотры с бизнес-логикой и кодом Получить максимальную / минимальную запись Изменить первичный ключ Присоединяться к таблицам, которые различаются по строкам В отношениях от одного до многих возвращайте разные строки на основе значения MIN

Оптимизировать запрос самостоятельного соединения MySQL

Мне нужно выбрать пары строк из таблицы, соответствующие определенным критериям.
Вот скрипт SQL, который демонстрирует, что я хочу:

http://sqlfiddle.com/#!2/4fc2f/16/0

Это хорошо работает, когда таблица небольшая, но проблема заключается в том, что моя производственная таблица может иметь миллионы строк и тысячи строк для определенной даты. Запрос занимает 14-15 секунд для выполнения конкретной даты. Как я могу улучшить его?

MySQL 5.5

вам не хватает индекса. Попробуйте использовать EXPLAIN для анализа вашего запроса, это очень поможет вам.

Решение прост, вот оно: http://sqlfiddle.com/#!2/56deb/1/0

Вам нужно добавить индекс, который включает столбцы, используемые в инструкции where, чтобы они использовались:

 KEY `night_of_2` (`night_of`,`student_id`,`check_class`) 

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

 JOIN checks checks2 

FORCE INDEX (night_of_2) ВКЛ (check1.night_of = checks2.night_of)

(если есть лучший способ, я хотел бы знать об этом) 🙂

С Уважением,

Ваши индексы не особенно эффективны – вы можете иметь более одного столбца в индексе. Но для того, чтобы получить нужные индексы, вам нужно посмотреть на каждый запрос, который вы запускаете в базе данных, на частоту каждого из них и на распределение данных. Или вы просто просите нас сделать домашнее задание? На основе предоставленной информации запрос будет более эффективным с индексом (night_of, check_class, student_id) и потерять существующие индексы, кроме ПК.