2017-01-28 5 views
0

У меня есть Mysql запрос, что-то вроде этого: (. Около 10 сек)Slow MySql запросов (оптимизация LEFT OUTER JOIN)

SELECT 
    Main.Code, 
    Nt, 
    Ss, 
    Nac, 
    Price, 
    Ei, 
    Quant, 
    Dateadded, 
    Sh, 
    Crit, 
    CAST(Ss * Quant AS DECIMAL (10 , 2)) AS Qss, 
    CAST(Price * Quant AS DECIMAL (10 , 2)) AS Qprice, 
    `Extra0`.`Value` 
FROM 
    Main 
     LEFT OUTER JOIN 
    `Extra_fields` AS `Extra0` ON `Extra0`.`Code` = `Main`.`Code` 
     AND `Extra0`.`Nf` = 2 
ORDER BY `Code` 

Запрос очень медленно. Запрос без этой детали: LEFT OUTER JOIN Extra_fields AS Extra0 ON Extra0. Code = Main. Code И Extra0. Nf = 2 быстро.

Есть ли способ оптимизировать первый запрос?

+0

Создать необходимый индекс для столбцов кода и Nf – GurV

+0

Спасибо, это помогает. –

+1

Пожалуйста, предоставьте 'SHOW CREATE TABLE' для обеих таблиц. –

ответ

1

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

ALTER TABLE Extra_fields ADD KEY (Code, Nf, Value); 

Вы можете воспользоваться путем добавления индекса на Main.Code так он читает таблицу в отсортированном порядке без необходимости делать FileSort:

ALTER TABLE Main ADD KEY (Code); 

Я выбежала EXPLAIN по вашему запросу и получил это:

*************************** 1. row *************************** 
      id: 1 
    select_type: SIMPLE 
     table: Main 
    partitions: NULL 
     type: index 
possible_keys: NULL 
      key: Code 
     key_len: 5 
      ref: NULL 
     rows: 1 
    filtered: 100.00 
     Extra: NULL 
*************************** 2. row *************************** 
      id: 1 
    select_type: SIMPLE 
     table: Extra0 
    partitions: NULL 
     type: ref 
possible_keys: code 
      key: code 
     key_len: 10 
      ref: test.Main.Code,const 
     rows: 1 
    filtered: 100.00 
     Extra: Using index 

В первой таблице нет файлов. Мне пришлось использовать ...FROM Main FORCE INDEX(Code)..., но это может быть потому, что я тестировал без строк в таблице.

Вторая таблица показывает, что используется метод доступа только для индекса («Дополнительно: использование индекса»). Я предполагаю, что на них ссылаются только три столбца от Extra_fields, а все остальные столбцы - от Main.

+1

Еще лучше, 'Extra_fields', поскольку он пахнет схемой типа EAV, должен иметь' PRIMARY KEY (Code, Nf) 'и no' AUTO_INCREMENT'. –