MySQL 多列索引

Sub*_*ukh 3 mysql indexing sql-execution-plan

我有一个选择查询,我需要包含以下列(几乎表中的所有列):

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;
Run Code Online (Sandbox Code Playgroud)

此查询执行时间过长(超过 3 分钟)。为了提高查询性能,我在 where 子句中使用的列(即 ANI 和 DNIS)上创建了索引。

create index ani_idx on call_data_report(ANI,DNIS)
Run Code Online (Sandbox Code Playgroud)

但是,当我检查上述选择查询的 EXPLAIN 的输出时,它显示它没有使用索引。是因为所有这些专栏吗?我需要创建什么类型的索引来提高上述查询的性能。

注意:ANI 和 DNIS 的列中有 NULL 值。

谢谢!

Bar*_*mar 7

仅当您将测试与 , 组合时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
Run Code Online (Sandbox Code Playgroud)