SQL-запрос: удалить все записи из таблицы, кроме последних N?

Я знаю, что восстанавливаю mysql-query довольно старый вопрос, но mysqlclient недавно я столкнулся с этой sql-select проблемой, но мне нужно что-то, что sql-syntax хорошо масштабируется до больших чисел. Не было никаких существующих mysqld данных о производительности, и, поскольку select-statement этому вопросу было уделено mysql-query довольно много внимания, я my-sql решил опубликовать то, что mysqldump нашел.

Решениями, которые sql-statement действительно сработали, были mysqldump метод Alex Barrett's double sub-query/NOT IN (аналогичный Bill Karwin's) и метод mysql Quassnoi's LEFT JOIN.

К сожалению, оба вышеперечисленных mysql-server метода создают очень большие my-sql промежуточные временные таблицы, и sql-syntax производительность быстро sql-statement снижается по мере того, как sql-query количество не удаляемых записей mysqld становится большим.

То, что sql-select я выбрал, использует двойной my-sql подзапрос Алекса Барретта mysql (спасибо!), но использует mysqlclient <= вместо NOT IN:

DELETE FROM `test_sandbox`
  WHERE id <= (
    SELECT id
    FROM (
      SELECT id
      FROM `test_sandbox`
      ORDER BY id DESC
      LIMIT 1 OFFSET 42 -- keep this many records
    ) foo
  );

Он использует OFFSET для mysqld получения идентификатора sql-select N -й записи и удаляет эту sql запись и все предыдущие записи.

Поскольку sql-delete порядок уже является предположением sql-delete этой проблемы (ORDER BY id DESC), <= идеально sql-query подходит.

Это намного быстрее, поскольку sql-select временная таблица, созданная sql подзапросом, содержит только sqlselect одну запись вместо N записей.

Тестовый пример

Я mysqldump протестировал три метода select-statement работы и новый метод, описанный sqlselect выше, в двух тестовых случаях.

Оба mysqld тестовых примера используют select-statement 10000 существующих строк, в sqlselect то время как первый тест mysqldump сохраняет 9000 (удаляет самую mysqld старую 1000), а второй тест sql-delete сохраняет 50 (удаляет самые sql-statement старые 9950).

+-----------+------------------------+----------------------+
|           | 10000 TOTAL, KEEP 9000 | 10000 TOTAL, KEEP 50 |
+-----------+------------------------+----------------------+
| NOT IN    |         3.2542 seconds |       0.1629 seconds |
| NOT IN v2 |         4.5863 seconds |       0.1650 seconds |
| <=,OFFSET |         0.0204 seconds |       0.1076 seconds |
+-----------+------------------------+----------------------+

Что интересно, метод sql-query <= демонстрирует лучшую производительность sql по всем направлениям, но mysqlclient на самом деле становится mysqld лучше, чем больше вы храните, а mysqlclient не хуже.

mysql

sql

sql-delete

2022-11-11T16:24:04+00:00