gpt4 book ai didi

MySQL 高效测试 count w/where 是否大于一个值

转载 作者:行者123 更新时间:2023-11-29 01:26:38 39 4
gpt4 key购买 nike

有没有办法优化以下查询?

SELECT count(*)>1000 FROM table_with_lot_of_rows WHERE condition_on_index;

使用这个查询,MySQL 首先执行 count(*) 然后比较。当只有几行满足条件时,这是很快的,但如果很多行满足条件,则可能需要很长时间。有没有办法在找到 1000 个项目后立即停止计数,而不是遍历所有结果?

特别是,我对具有全文条件的 MyISAM 表感兴趣,但对 InnoDB 和/或基本 WHERE 子句的任何答案都会有所帮助。

最佳答案

SELECT 1
FROM table_with_lot_of_rows
WHERE condition_on_index
LIMIT 1000, 1;

以这种方式工作:

  1. 使用索引(大概比使用数据更快)
  2. 跳过 1000 多行,一无所获。 (这比其他答案更好。)
  3. 如果到此为止,获取 1 行,仅包含文字 1(在 SELECT 中)。

现在您要么有一个空结果集(<= 1000 行),要么有一行 1(至少 1001 行)。

然后,根据您的应用程序语言,很容易区分这两种情况。

另一个注意事项:如果这是一个更大查询中的子查询,那么做

EXISTS ( SELECT 1
FROM table_with_lot_of_rows
WHERE condition_on_index
LIMIT 1000, 1 )

返回 TRUE/FALSE(与 1 或 0 同义)。

面对现实吧,扫描 1001 行,即使是索引,也需要一些时间。我认为我的公式是最快的。

要检查的其他事项:这是 InnoDB 吗? EXPLAIN 是否说“使用索引”?多少内存? innodb_buffer_pool_size 的设置是什么?

请注意,InnoDB 现在具有 FULLTEXT,因此没有理由坚持使用 MyISAM。

如果您正在使用 MyISAM 并且 WHEREMATCH...,那么我所说的大部分内容可能都不适用。 FULLTEXT 可能 在让引擎的其余部分有机会使用 ORDER BYLIMIT 进行这些游戏之前获取所有结果>.

请向我们展示实际的查询、它的EXPLAINSHOW CREATE TABLE。真正的目标是什么?查看查询是否会提供“太多”结果?

可能的改进(取决于上下文)

由于我的初始 SELECT 返回标量 1NULL,它可以在任何 bool 上下文中使用,例如 WHERE1TRUENULL 将被视为FALSE。因此 EXISTS 可能是多余的。

另外,1/NULL可以这样变成1/0。注意:需要额外的括号。

IFNULL( ( SELECT ... LIMIT 1000,1 ), 0)

关于MySQL 高效测试 count w/where 是否大于一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43219056/

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