gpt4 book ai didi

MySQL 索引未命中

转载 作者:可可西里 更新时间:2023-11-01 08:55:18 24 4
gpt4 key购买 nike

我有一个如下所示的查询:

select count(*) from `foo` where expires_at < now()”

因为 expires_at 是有索引的,所以查询命中索引没有问题。但是以下查询:

select count(*) from `foo` where expires_at < now() and some_id != 5

索引永远不会被命中。

expires_at 和 some_id 都被索引了。

我的索引没有正确创建吗?

最佳答案

这个查询:

SELECT  COUNT(*)
FROM foo
WHERE expires_at < NOW()

可以只用索引来满足,不引用表本身。您可以从计划中的 using index 中看到它。

这个查询:

SELECT  COUNT(*)
FROM foo
WHERE expires_at < NOW()
AND some_id <> 5

需要查看表以找到 some_id 的值。

由于查表是一个相当昂贵的事情,所以使用表扫描和过滤记录效率更高。

如果您在 expires_at, some_id 上有一个复合索引,查询可能会使用该索引在 expires_at 上进行范围搜索并在 some_id 上进行过滤>.

SQL Server 甚至为此提供了称为包含字段 的功能。这个命令

CREATE INDEX ix_foo_expires__someid ON foo (expires_at) INCLUDE (some_id)

会在 expires_at 上创建一个索引,它会在整个叶节点中额外存储 some_id(没有排序开销)。

MySQL,不幸的是,不支持它。

关于MySQL 索引未命中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5897882/

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