2014-01-04 7 views
0

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

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

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

MySQL 5.5

+0

У вас есть индексы на месте? Сделайте 'show create table'. BTW 14 секунд для запроса, который обращается к миллионам строк, не * that * bad – Jim

+0

Да, индексы во всех столбцах, показанных здесь (в таблице больше столбцов, но я упрощаю). Прямой выбор для конкретной даты, кажется, происходит почти мгновенно (<секунда). Кажется, что самосоединение - это то, что дорого, но похоже, что он должен быть в состоянии сузить до даты (несколько тысяч строк), а затем сделать соединение? – scotru

ответ

1

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

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

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

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

Кроме того, необходимо чтобы заставить использование индекса на объединение, так как вы присоединяетесь таблицу к себе:

JOIN checks checks2 

FORCE INDEX (night_of_2) ON (Checks1.night_of = checks2.night_of)

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

С уважением,

+1

Здесь нет ничего, чтобы предположить, что требуется форсировать индекс (это очень плохая идея, если вам не обязательно). И с добавлением индекса, который мы оба предложили, принудительный индекс приводит к менее эффективному запросу (больше строк рассматривается). – symcbean

+1

Спасибо за помощь! Потребовалось около часа, чтобы добавить индекс, но теперь запрос будет приятным и быстрым. Я пропустил FORCE INDEX по рекомендации symcbean. – scotru

+0

Если вы не возражаете, меня бы интересовали результаты запроса также с включенным индексом силы (скорость и/или объяснение). Было бы очень благодарно :) –

1

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

+0

Спасибо, что нашли время ответить на мой вопрос. Вы действительно правильно относитесь к проблеме с моими индексами, но кажется, что упорядочение индекса (night_of, student_id, check_class) по рекомендации Sinisa более эффективно на основе моего распределения данных. Спасибо также за комментарий об исключении FORCE INDEX. – scotru

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