我有一个select查询,其中需要包含以下列(表中几乎所有的列):
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)
但是,当我为上面的select查询检查explain的输出时,它显示它没有使用索引。是因为这些专栏吗?我需要创建什么类型的索引来提高上述查询的性能。
注意:ani和dnis在列中有空值。
谢谢!
2条答案
按热度按时间j13ufse21#
只有在将测试与
AND
,不是OR
. 当你有一个OR
条件下,它必须独立地测试每一列,但复合索引是一个包含DNIS
在他们相关的ANI
. 因此,应该为每列创建单独的索引。mysql通常也不擅长优化
OR
查询。如果将其拆分为两个查询并与之组合,可能会更好UNION
:00jrzges2#
在您的情况下,可以尝试使用两个单列索引。。
因为使用你的综合指数的第二个键
DNIS
未使用。。