Как оптимизировать этот медленный (очень медленный) запрос MySQL? - PullRequest
3 голосов
/ 03 августа 2009

У меня есть таблица mysql 2 ГБ с 500k строк, и я запускаю следующий запрос в системе без нагрузки.

select * from mytable 
where name in ('n1', 'n2', 'n3', 'n4', ... bunch more... ) 
order by salary

Для выполнения сортировки файлов требуется от 50 до 70 секунд.

При удалении заказа по зарплате и выполнении сортировки в приложении общее время выполнения (включая сортировку) сокращается примерно до 25-30 секунд. Но это все еще слишком много.

Есть идеи, как мне это ускорить?

Спасибо.

Ответы [ 5 ]

5 голосов
/ 03 августа 2009

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

create temporary table names
    (name varchar(255));

insert into names values ('n1'),('n2'),...,('nn');

select
    a.*
from
    mytable a
    inner join names b on
        a.name = b.name

Также обратите внимание, что name должен иметь индекс. Это заставляет вещи идти намного быстрее. Спасибо Томасу за то, что он сделал эту заметку.

1 голос
/ 03 августа 2009

В зависимости от распределения данных и количества строк, соответствующих вашему предложению WHERE, вы можете попробовать индексировать (зарплата, имя) или даже (имя, зарплата) хотя последний, скорее всего, будет не очень полезен для такого рода запросов.

Возможно, вы также захотите увеличить настройку sort_buffer_size . Проверьте все по отдельности и сравните вывод EXPLAIN .

1 голос
/ 03 августа 2009

Попробуйте выбрать нужные строки с помощью подзапроса, а затем упорядочить результаты этого подзапроса. См. Этот вопрос .

А у вас есть индекс на name в mytable, верно?

1 голос
/ 03 августа 2009

Некоторые идеи:

  • Вам нужно выбрать *, можете ли вы выбрать только подмножество?
  • Если вы можете выбрать подмножество, вы можете добавить индекс покрытия, который уже отсортирован по зарплате
  • Если все по одной схеме, вы можете сделать LIKE ('n%')
0 голосов
/ 03 августа 2009
create index xyz on mytable(name(6));

«IN» запросы почти всегда неэффективны, так как они концептуально обрабатываются следующим образом:

select * from mytable where name = n1  
or name = n2
or name = n3
...

Указанный выше индекс может означать, что оптимизатор запросов получает доступ к строкам по индексу вместо сканирования таблицы.

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