Как я могу оптимизировать этот запрос, занимает больше минуты, чтобы выполнить - PullRequest
1 голос
/ 29 марта 2012

У меня следующий запрос, выполнение которого занимает более минуты, как я могу его оптимизировать.Это медленно из-за порядка по o.id desc , если я удаляю его, запрос выполняет его несколько мс.


select o.*, per.email, p.name
from order o 
inner join product p 
on o.product_id=p.id 
inner join person per 
on o.person_id=per.id 
order by o.id desc 
limit 100;

Ниже приводится результат объяснения


1   SIMPLE  p   index   PRIMARY FK2EFC6C1E5DE2FC    8   NULL    6886    Using index; Using temporary; Using filesort
1   SIMPLE  o   ref FK67E9050121C383DB,FK67E90501FC44A17C   FK67E90501FC44A17C  8   dev.p.id    58  
1   SIMPLE  per eq_ref  PRIMARY PRIMARY 8   dev.o.person_id 1   Using index

Все таблицы InnoDB, а соединения - по первичному и внешнему ключам.Кроме этого, индексы находятся в электронная почта столбец в Персона и статус столбец в Порядок

Количество записей в каждомстол

человек: 1 300 000 продукт: 7 000 заказ: 70 000

Ответы [ 3 ]

1 голос
/ 29 марта 2012

Планировщик, скорее всего, не использует подсказку limit для удаления строк из таблицы заказов перед объединением. Таким образом, сервер должен выполнить объединение для всех строк, а затем вернуть только несколько.

Попробуйте это:

select o.* from
(select * order order by id desc limit 100) o
inner join product p 
on o.product_id=p.id 
inner join person per 
on o.person_id=per.id 
order by o.id desc limit 100;

РЕДАКТИРОВАТЬ: Это будет работать только при наличии ограничения, гарантирующего, что соответствующие строки присутствуют в таблицах Product и Person.

0 голосов
/ 29 марта 2012

Увеличьте значение этой переменной и перезапустите сервер MySQL. read_rnd_buffer_size Установка большого значения для переменной может значительно повысить производительность ORDER BY.

Также вы можете сослаться на http://www.mysqlperformanceblog.com/2007/07/24/what-exactly-is-read_rnd_buffer_size/

0 голосов
/ 29 марта 2012

да, я понимаю ваш вопрос, в этом случае, прежде всего, сохраните ваш запрос в файле .sql.Вы можете использовать утилиту sql server под названием «Помощник по настройке ядра СУБД» в меню «Инструменты» Sql Server Management Studio.

Сначала откройте SQL Server, перейдите в инструменты и выберите опцию «Помощник по настройке ядра СУБД».затем выберите файл, который вы сохранили ранее.Теперь отметьте галочкой свою базу данных, которую вы используете, и таблицу, которая используется в запросе, а затем нажмите «Начать анализ» в главном меню.он покажет вам возможные индексы и статистику состояний, которые можно создать сейчас, чтобы применить эту рекомендацию к вашему запросу, перейдите к руководству действия и выберите «Применить рекомендацию», которая создаст индексы и статистику состояний в вашей таблице и сократит время выполнения запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...