2010-10-22 3 views
1

У меня есть две таблицы, jos_eimcart_customers_addresses и jos_eimcart_customers. Я хочу вытащить все записи из таблицы клиентов и включить адресную информацию, доступную из таблицы адресов. Запрос действительно работает, но на моей машине localhost потребовалось более минуты для запуска. На локальном хосте таблицы составляют около 8000 строк, но в процессе производства таблицы могут иметь до 25 000 строк. Есть ли способ оптимизировать это, так что это не займет много времени? Обе таблицы имеют индекс в поле id, который является первичным ключом. Есть ли какой-нибудь другой индекс, который мне нужно создать, чтобы это ускорилось? Должна ли таблица адресов иметь индекс в поле customer_id, так как это внешний ключ? У меня есть другие запросы к базе данных, которые схожи и работают на гораздо больших таблицах, быстрее.Как оптимизировать запрос левого соединения?

(отредактирован ADD:. Там может быть более чем один адрес записи для каждого клиента, поэтому customer_id не уникальное значение в таблице адресов)

select 
    c.firstname, 
    c.lastname, 
    c.email as customer_email, 
    a.email as address_email, 
    c.phone as customer_phone, 
    a.phone as address_phone, 
    a.company, 
    a.address1, 
    a.address2, 
    a.city, 
    a.state,a.zip, 
    c.last_signin 
from jos_eimcart_customers c 
    left join jos_eimcart_customers_addresses a 
    on c.id = a.customer_id 
order by c.last_signin desc 

отредактирован ADD: Объяснить результаты

id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra 
========================================================================================== 
1 | SIMPLE  | c | ALL | NULL  | NULL| NULL |NULL |6175 |Using temporary; Using filesort 
--------------------------------------------------------------------------------------- 
1 | SIMPLE  | a | ALL | NULL  | NULL| NULL |NULL |8111 | 

ответ

5

Вы должны создать индекс на a.customer_id. Он не обязательно должен быть уникальным индексом, но его нужно обязательно индексировать.

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

Попробуйте http://www.dbtuna.com/article.asp?id=14 и http://www.devshed.com/c/a/MySQL/MySQL-Optimization-part-1/2/ для получения информации об EXPLAIN.

+2

WOW! Я добавил индекс на a.customer_id, и запрос пошел от 84 секунд до 0,0168 секунд. Большая разница! – EmmyS

+0

FYI, я принимаю этот ответ по сравнению с Даррен только потому, что он пришел за 2 минуты раньше - оба имеют в основном тот же ответ, так что нет другого способа решить, кто победит! – EmmyS

4

Короткий ответ: Да, customer_id должен иметь индекс.

Лучший ответ: было бы лучше всего найти анализатор запросов для MySql и использовать его, чтобы определить, какова фактическая причина замедления.

Например, вы можете поставить EXPLAIN перед тем, как выбрать, и посмотреть, какие результаты есть.

Optimizing MySQL: Queries and Indexes

+0

Отредактировано для добавления результатов EXPLAIN. – EmmyS

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