MariaDB LIMIT语句带来的不仅仅是限制

时间:2019-07-11 19:27:18

标签: mysql database mariadb limit

我在registrations表上有10,000个用户,并希望从我的应用程序中将此查询限制为3500个用户。但是,当我调查日志时,有时计数超过3500。我不明白为什么该查询返回的值超出限制:

select  count(*)
    from  registrations
    where  (selectedtime IS NULL
       AND  expirationtime < NOW()
           )
    LIMIT  3500;

我在数据库上手动尝试过,发现有时超过3500

3 个答案:

答案 0 :(得分:1)

您的查询仅返回1行,该行少于3500。

如果要限制要计数的行数,则需要将其放入子查询中。

SELECT COUNT(*)
FROM (
    SELECT 1
    FROM registrations
    WHERE selectedtime IS NULL AND expirationtime < NOW()
    LIMIT 3500) AS x

答案 1 :(得分:0)

带有COUNT的SELECT语句返回SELECT语句检索的行数。

出于性能原因,所需的结果是限制该计数。 在SELECT语句中包含LIMIT子句将不起作用,因为它仅限制返回的行数,始终为1。

该解决方案(我称为“有限计数”)是通过限制非计数SELECT语句并将其包装在COUNT(*)中来完成的。

例如: 如果您的count语句看起来像

select count(*) from registrations where (selectedtime IS NULL AND expirationtime < NOW()) LIMIT 3500;

您可以通过将查询替换为以下内容来限制结果:

SELECT COUNT(*) AS total
FROM (
    SELECT 1
    FROM registrations
    WHERE selectedtime IS NULL AND expirationtime < NOW()
    LIMIT 3500) AS x

如果您需要知道不带LIMIT的非计数SELECT语句将返回多少行,则可以使用信息函数FOUND_ROWS()。它将获取总行数,而无需再次运行该语句。

答案 2 :(得分:0)

这就是您所做的

select  count(*)
    from  registrations
    where  (selectedtime IS NULL
       AND  expirationtime < NOW()
           )
    LIMIT ROWS EXAMINED 3500;

(自MariaDB 5.5.21起可用-参见https://mariadb.com/kb/en/library/limit-rows-examined/