我有一个超过3500万行的大型索引表。以下是索引,其命名约定显示了它们的顺序列顺序:
IDX_E93438363DAE128B,
IDX_LIST_ID_EMAIL_ADDRESS_DELETED,
IDX_LIST_ID_SUBSCRIBED_DELETED_EMAIL_ADDRESS,
IDX_LIST_ID_SUBSCRIBED_DELETED_FIRST_NAME,
IDX_LIST_ID_SUBSCRIBED_DELETED_LAST_UPDATED_AT
我在中型Amazon RDS实例上查询此表的时间超过15分钟:
SELECT * FROM contact
WHERE list_id = '014c7cba-c124-11e5-b4ea-0a4287b2e8c5'
AND subscribed = 1
AND deleted = 0
使用查询的EXPLAIN
我可以看到MySQL选择使用IDX_LIST_ID_EMAIL_ADDRESS_DELETED
密钥,当我希望大多数其他密钥(IDX_LIST_ID_SUBSCRIBED_DELETED_...
)更多时最佳的。
我应该相信发动机吗? 17分左右是等待查询这个大表的现实时间吗?
答案 0 :(得分:0)
SELECT id, email_address, first_name, last_name
FROM contact
WHERE list_id = '014c7cba-c124-11e5-b4ea-0a4287b2e8c5'
AND subscribed = 1
AND deleted = 0
鉴于上述查询,最佳索引将是
ALTER TABLE `contact`
CREATE INDEX (`list_id`,`subscribed`,`deleted`,`email_address`,`first_name`,`last_name`)
这将允许它使用最左边的3个字段查找所有必要的行,并且所有剩余的值都显示在其右侧。这假设id
是您表格的主键,否则您必须将其添加到该索引中deleted
的右侧。
这应该最大限度地提高运行此查询的速度,至少只要更改索引就可以了。
如果使用此索引,您仍然遇到问题,请告诉我们
的结果SELECT COUNT(*)
FROM contact
WHERE list_id = '014c7cba-c124-11e5-b4ea-0a4287b2e8c5'
AND subscribed = 1
AND deleted = 0
回报。你可能只有大量的行,这可能需要一段时间才能返回。