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
SQL-запрос: удалить все записи из таблицы, кроме последних N?
Мы используем файлы cookies для улучшения работы сайта. Оставаясь на нашем сайте, вы соглашаетесь с условиями использования файлов cookies. Чтобы ознакомиться с нашими Положениями о конфиденциальности и об использовании файлов cookie, нажмите здесь.