MySQL 多列索引
MySQL Index on multiple columns
我有一个 select 查询,我需要在其中包括以下列(几乎所有来自 table 的列):
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 在列中具有 NULL 值。
谢谢!
复合索引仅在您将测试与 AND
组合时才有用,而不是 OR
。当你有一个 OR
条件时,它必须独立地测试每一列,但是复合索引是一棵树,在它们的相关 ANI
中包含 DNIS
的所有值。所以你应该为每一列创建单独的索引。
MySQL 通常也不擅长优化 OR
查询。如果将它分成两个查询并与 UNION
:
结合使用可能会更好
SELECT ...
FROM call_data_report
WHERE ANI = 123456
UNION
SELECT ...
FROM call_data_report
WHERE DNIS = 123456
在您的情况下,您可以尝试使用两个单列索引..
create index ani_idx1 on call_data_report(ANI);
create index ani_idx2 on call_data_report(DNIS);
因为 usinge OR 复合索引的第二个键 ani_idx DNIS
没有被使用..
我有一个 select 查询,我需要在其中包括以下列(几乎所有来自 table 的列):
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 在列中具有 NULL 值。
谢谢!
复合索引仅在您将测试与 AND
组合时才有用,而不是 OR
。当你有一个 OR
条件时,它必须独立地测试每一列,但是复合索引是一棵树,在它们的相关 ANI
中包含 DNIS
的所有值。所以你应该为每一列创建单独的索引。
MySQL 通常也不擅长优化 OR
查询。如果将它分成两个查询并与 UNION
:
SELECT ...
FROM call_data_report
WHERE ANI = 123456
UNION
SELECT ...
FROM call_data_report
WHERE DNIS = 123456
在您的情况下,您可以尝试使用两个单列索引..
create index ani_idx1 on call_data_report(ANI);
create index ani_idx2 on call_data_report(DNIS);
因为 usinge OR 复合索引的第二个键 ani_idx DNIS
没有被使用..