2015-01-07 3 views
0

У меня проблема с запросом для веб-сайта. Это ситуация:
У меня есть 3 таблицы:
Артиколей = где есть все статьи
clasart = где есть все матчи между кодом статьей и кодой класса - 32314 строк
classificazioni =, где есть все совпадения между кодом класса и именем класса - 2401 строкамиОптимизировать запрос mysql

и это запрос

SELECT a.clar_classi , b.CLA_DESCRI 
FROM clasart a JOIN (
SELECT art.AI_CAPOCODI, art.ai_codirest 
FROM (select * from clasart where clar_azienda = 'SRL') a 
JOIN (
    SELECT AI_CAPOCODI, AI_CODIREST,AI_DT_CREAZ, 
     AI_DESCRIZI, AI_CATEMERC, concat(AI_CAPOCODI, AI_CODIREST) as codice, aI_grupscon 
    FROM articoli 
    WHERE AI_AZIENDA = 'SRL' AND AI_CATEMERC LIKE '0101______' AND AI_FLAG_NOW = 0 AND AI_CAPOCODI <> 'zzz' 
) art ON trim(a.CLAR_ARTICO) = art.AI_CODIREST 
JOIN classificazioni b ON a.CLAR_CLASSI = b.CLA_CODICE 
WHERE b.CLA_CODICE LIKE 'AA51__' 
group by CLAR_ARTICO) art ON trim(CLAR_ARTICO) = concat(art.AI_CAPOCODI, art.ai_codirest) 
JOIN classificazioni b ON a.CLAR_CLASSI = b.CLA_CODICE 
WHERE CLAR_AZIENDA = 'SRL' AND CLAR_CLASSI like 'CO____' 

Время прогона - 16 секунд. Увеличение времени до 16 секунд при соединении с классификацией.

Вы можете мне помочь? Благодаря

+0

Прежде всего, измените все 'AI_CATEMERC LIKE '0101 ______' 'на' AI_CATEMERC =' 0101 ______ ''. Вы не используете подстановочные знаки в своем 'LIKE', поэтому это необязательно. – vaso123

+0

если я изменяю как in = не найден результат – vecio88

+0

Перепишите запрос, избавившись от подзапросов. Это мешает оптимизатору, и они не нужны. –

ответ

0

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

ALTER TABLE articoli ADD INDEX idx_artc_az_cat_flg_cap (AI_AZIENDA, AI_FLAG_NOW, AI_CAPOCODI, AI_CATEMERC);

приведенный выше запрос будет ввести индексы в нескольких столбцов на ARTICOLI таблице. Индексация работает аналогично тому, как хэш-таблицы или ключи массива работают, чтобы напрямую идентифицировать строку, с которой соответствуют целевые значения. Использование нескольких столбцов приведет к сравнению меньшего количества строк.

Не используйте trim(a.CLAR_ARTICO): убедитесь, что перед вставкой значения обрезаются, но не во время соединения. Это может привести к пропуску индексных файлов, и сравнение соединений может быть дорогостоящим таким образом.

Давайте перейдем к следующим шагам:

Ввести индекс на clar_azienda используя следующий запрос:

ALTER TABLE clasart ADD INDEX idx_cls_az (clar_azienda);

Если art.AI_CODIREST не является первичным/внешнего ключа вам необходимо ввести индекс там используя приведенную ниже запрос:

ALTER TABLE classificazioni ADD INDEX idx_clsi_cd (CLA_CODICE);

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

ALTER TABLE <tableName> ADD INDEX <indexKey (<column to be indexed>);

Позвольте мне знать, если у вас еще есть вопросы, помните, что вы можете запустить эти запросы после выбора базы данных из PhpMyAdmin (SQL табл) или на тузд консоли.

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