Заявление MariaDB LIMIT приносит больше, чем предел - PullRequest
0 голосов
/ 11 июля 2019

У меня 10000 пользователей в таблице registrations, и я хочу ограничить этот запрос 3500 пользователями из моего приложения.Но когда я изучаю журналы, иногда их число превышает 3500. Я не могу понять, почему этот запрос возвращает больше, чем предел:

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

Я пробовал вручную на БД и видел иногда более 3500

Ответы [ 3 ]

1 голос
/ 11 июля 2019

Ваш запрос возвращает только 1 строку, которая меньше 3500.

Если вы хотите ограничить число подсчитываемых строк, вам нужно поместить это в подзапрос.

SELECT COUNT(*)
FROM (
    SELECT 1
    FROM registrations
    WHERE selectedtime IS NULL AND expirationtime < NOW()
    LIMIT 3500) AS x
0 голосов
/ 12 июля 2019

Это делает то, что вы думали , что вы делали:

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/)

0 голосов
/ 12 июля 2019

Оператор SELECT с COUNT возвращает количество строк, извлеченных оператором SELECT.

По соображениям производительности желаемый результат заключается в ограничении этого количества.Включение предложения LIMIT в инструкцию SELECT не будет работать, поскольку оно ограничивает только количество возвращаемых строк, которое всегда равно единице.

Решение, которое я называю «Limited-Count», достигается путем ограничения-count оператор SELECT и перенос его в 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

Если вам нужно знать, сколько строк вернул бы ваш оператор SELECT без учета без LIMIT, вы можете использовать информационную функцию FOUND_ROWS ().Он извлечет общее количество строк без повторного выполнения оператора.

...