MySQL Index на несколько столбцов - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть запрос на выборку, в который мне нужно включить следующие столбцы (почти все столбцы таблицы):

SELECT  ANI,CALL_ID, DATE_TIME, ABANDON_RATE, CALL_TYPE, CAMPAIGN, CAMPAIGN_TYPE, CUSTOMER_NAME, DISPOSITION, DNIS, LIST_NAME, 
        SESSION_ID, SKILL, AGENT_EMAIL, AGENT_GROUP, THIRD_PARTY_TALK_TIME, AFTER_CALL_WORK_TIME, HOLD_TIME, CALL_TIME, HANDLE_TIME, IVR_TIME,
        MANUAL_TIME, TALK_TIME, QUEUE_WAIT_TIME, advertiserName, affiliateName, callerID, campaignName, ChargentSFA__Biling_Phone__c, CONTACT_CREATE_TIMESTAMP,
        CONTACT_ID, CONTACT_MODIFIED_TIMESTAMP, Date_Added, destinationPhoneNumber, leadsource, number1, salesforce_id, source, transactionID,
        IVR_PATH 
FROM call_data_report 
WHERE ANI= '123456' OR DNIS = '123456' 
ORDER BY DATE_TIME desc;

Выполнение этого запроса занимает слишком много времени (более 3 минут). Чтобы повысить производительность запросов, я создал индекс для столбцов, используемых в предложении where, то есть ANI и DNIS.

create index ani_idx on call_data_report(ANI,DNIS)

Но, когда я проверил вывод EXPLAIN для вышеупомянутого запроса выбора, он показывает мне, что он не использует индекс. Это из-за всех этих столбцов? Какой тип индекса мне нужно создать, чтобы повысить производительность вышеупомянутого запроса.

Примечание: ANI и DNIS, имеющие значения NULL в столбцах.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

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

create index ani_idx1 on call_data_report(ANI);

create index ani_idx2 on call_data_report(DNIS); 

потому что при использовании ИЛИ второй ключ вашего составного индекса ani_idx DNIS не используется ..

0 голосов
/ 04 сентября 2018

Составной индекс полезен только тогда, когда вы комбинируете тесты с AND, а не OR. Когда у вас есть условие OR, он должен проверять каждый столбец независимо, но составной индекс - это дерево, которое имеет все значения DNIS в пределах их связанных ANI. Поэтому вы должны создать отдельные индексы для каждого столбца.

MySQL также не очень хорошо оптимизирует OR запросы. Вероятно, было бы лучше, если бы вы разбили его на два запроса, которые вы объединяете с UNION:

SELECT ...
FROM call_data_report
WHERE ANI = 123456
UNION
SELECT ...
FROM call_data_report
WHERE DNIS = 123456
...