Как запросить фиксированное количество строк, упорядоченных по дате в MySQL? - PullRequest
0 голосов
/ 28 марта 2019

Я использую mysql для запроса БД. Я хотел бы запросить НЕ полную базу данных, а только последние 1000 строк, упорядоченных по отметке времени.

Я пытался использовать этот запрос, который не работает, и я хотел бы. Я знаю, что предел используется для возврата фиксированного количества выбранных элементов. Но это не то, что я хотел бы. Я хочу запросить фиксированное количество элементов.

select * from mutable where name = 'myschema' ORDER BY start_time DESC LIMIT 1000;

Любая помощь?

Ответы [ 2 ]

0 голосов
/ 28 марта 2019

Работает только с auto_increment

Хитрость заключается в сортировке меньшего количества данных, как упоминал О. Джонс. Проблема в том, чтобы рассказать MySQL, как это сделать.

MySQL не может знать, что такое «последние 1000 записей», если не сортирует их по запросу. Это именно то, чего вы хотите избежать, поэтому вы должны указать MySQL, как найти «последние 1000 записей».

Этот трюк состоит в том, чтобы сообщить MySQL, с чего auto_increment начать поиск данных. Проблема в том, что вы используете временные метки, поэтому я не уверен, подходит ли это для вашего конкретного случая использования.

Вот запрос:

SELECT * FROM mutable 
WHERE `name` = 'myschema' 
AND id > (SELECT MAX(id) - 1000 FROM mutable WHERE `name` = 'myschema') 
ORDER BY start_time DESC LIMIT 1000;

Проблемы:

  • auto_increments имеют пробелы. Эти числа не являются последовательными, они уникальны и рассчитываются с помощью алгоритма последовательного приращения. Чтобы получить лучшие результаты, увеличьте число вычитания. Вы можете получить 1000 результатов, но вы можете получить 500 результатов - в зависимости от набора данных

  • если у вас нет auto_increment, это бесполезно

  • если введенные временные метки необходимо предварительно отсортировать по большему, то это бесполезно

Преимущества: - первичный ключ используется для определения диапазона значений (где id> x), поэтому сокращение набора данных будет максимально быстрым.

0 голосов
/ 28 марта 2019

tl; dr Sort Less Data

Я полагаю, ваша таблица mutable имеет автоинкрементный первичный ключ с именем mutable.mutable_id.

Затем вы можете сделать это:

                 SELECT mutable_id 
                   FROM mutable 
                  WHERE name = 'myschema' 
                  ORDER BY start_time DESC 
                  LIMIT 1000;

Он дает вам результирующий набор идентификаторов всех соответствующих строк.В этом случае работа ORDER BY ... LIMIT должна сортировать только значения mutable_id и start_time, а не всю таблицу.Таким образом, на сервере MySql требуется меньше места и времени.

Затем вы используете этот запрос для получения подробной информации:

 SELECT *
   FROM mutable
  WHERE mutable_id IN (
                 SELECT mutable_id
                   FROM mutable 
                  WHERE name = 'myschema' 
                  ORDER BY start_time DESC 
                  LIMIT 1000
        )
  ORDER BY start_time DESC;

Это приведет к получению всех необходимых данных без необходимости сканирования исортировать всю таблицу.

Если вы создадите индекс для name и start_time, то подзапрос будет быстрее: запрос может случайным образом получить доступ к индексу к соответствующему name, а затем отсканировать start_time записи по одной, пока не найдет 1000. Не нужно сортировать;индекс предварительно настроен.

CREATE INDEX x_mutable_start_time ON mutable (name, start_time);

Если вы используете MySQL 8, вы можете создать нисходящий индекс, и он будет еще быстрее.

CREATE INDEX x_mutable_start_time ON mutable (name, start_time DESC);
...