Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么MySQL会选择那个索引,有多慢太慢了?_Mysql_Database_Indexing_Amazon Rds - Fatal编程技术网

为什么MySQL会选择那个索引,有多慢太慢了?

为什么MySQL会选择那个索引,有多慢太慢了?,mysql,database,indexing,amazon-rds,Mysql,Database,Indexing,Amazon Rds,我有一个超过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 我在中等亚马逊RDS实例上

我有一个超过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
我在中等亚马逊RDS实例上查询此表需要15分钟以上:

SELECT * FROM contact
WHERE list_id = '014c7cba-c124-11e5-b4ea-0a4287b2e8c5'
AND subscribed = 1
AND deleted = 0
使用查询的
EXPLAIN
,我可以看到MySQL选择使用
IDX\u LIST\u ID\u EMAIL\u ADDRESS\u DELETED
键,而我希望大多数其他键(
IDX\u LIST\u ID\u SUBSCRIBED\u DELETED\u…
)更为优化

我应该相信引擎吗?在如此大的表上等待查询17分钟左右是一个现实的时间吗

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

返回。您可能有大量的行,返回这些行可能需要时间。

您需要使用
SELECT*
?通过这样做,您将强制数据库返回其索引中找到的每一行的主键行。还有,什么发动机?MyISAM还是InnoDB?谢谢你的回复。我已经将我的查询改进为只选择id、电子邮件地址、名字、姓氏……,但我仍然遇到同样的问题。我正在使用InnoDB。当您从联系人使用索引(idx\u列表\u id\u订阅\u删除\u名字)中选择*时,性能如何…?