gpt4 book ai didi

mysql - 为什么 MySQL 选择该索引,太慢有多慢?

转载 作者:搜寻专家 更新时间:2023-10-30 20:53:06 24 4
gpt4 key购买 nike

我有一个包含超过 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 分钟左右的时间?

最佳答案

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

返回。您可能只是拥有大量的行,这可能需要一些时间才能返回。

关于mysql - 为什么 MySQL 选择该索引,太慢有多慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34958913/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com