2016-04-20 3 views
0

У меня есть следующий SQL, но его выполнение очень медленно, занимает около 45 секунд, таблица имеет 15 миллионов записей, как я могу улучшить?Оптимизируйте запрос mysql seach

SELECT A.*, B.ESPECIE 
FROM 
(
SELECT 
    A.CODIGO_DOCUMENTO, 
    A.DOC_SERIE,A.DATA_EMISSAO, 
    A.DOC_NUMERO, 
    A.CF_NOME, 
    A.CF_SRF, 
    A.TOTAL_DOCUMENTO, 
    A.DOC_MODELO 
FROM MOVIMENTO A 

WHERE 
    A.CODIGO_EMPRESA = 1 
     AND A.CODIGO_FILIAL = 5 
     AND A.DOC_TIPO_MOVIMENTO = 1 
     AND A.DOC_MODELO IN ('65','55') 
     AND (A.CF_NOME LIKE '%TEXT_SEARCH%' 
     OR A.CF_CODIGO LIKE 'TEXT_SEARCH%' 
     OR A.CF_SRF LIKE 'TEXT_SEARCH%' 
     OR A.DOC_SERIE LIKE 'TEXT_SEARCH%' 
     OR A.DOC_NUMERO LIKE 'TEXT_SEARCH%') 
ORDER BY A.DATA_EMISSAO DESC , A.CODIGO_DOCUMENTO DESC 
LIMIT 0, 100 
) A 
LEFT JOIN MODELODOCUMENTOFISCAL B ON A.DOC_MODELO = B.CODMODELO 
+4

Поместите EXPLAIN перед этим запросом, отредактируйте ваш вопрос с результатами – Mihai

+0

Сколько строк это, если вы запускаете запрос без условий текстового поиска? – Kateract

+0

# id, select_type, table, type, possible_keys, key, key_len, ref, rows, Extra '1', 'PRIMARY', '', 'ALL', NULL, NULL, NULL, NULL, '100', ' NULL '1', 'PRIMARY', 'B', 'ALL', NULL, NULL, NULL, NULL, '34', 'Using where; Использование присоединиться буфер (блок вложенного цикла)» '2', 'DERIVED', '', 'Индекс А', 'ПЕРВИЧНЫЙ, DOC_TIPO_MOVIMENTO, FK_MOVIMENTO_CODPAGTO, IDX_DOC_MODELO, IDX_CONSULTA, IDX_CF_CODIGO_CF_TIPO, CF_CODIGO, IDX_ITEM_REF, IDX_PDV', 'DATA_EMISSAO', '6', NULL, '14350757', 'Использование где' –

ответ

0

Для этого запроса, я хотел бы начать с индексом на MOVIMENTO(CODIGO_EMPRESA, CODIGO_FILIAL, DOC_MODELO) и MODELODOCUMENTOFISCAL(CODMODELO).

Это должно ускорить запрос.

Если это не так, вам может потребоваться полный текстовый поиск для обработки предложений LIKE. Я отмечаю, что у вас есть только подстановочный знак в начале одного из шаблонов. Это намеренно?

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