我有一个表用于保存我的应用程序的排名与以下字段:[id,username,score]我想清理表只保留前100个条目.
我怎么能这样删除?我试过DELETE FROM ranking ORDER BY score DESC LIMIT 100,999999999)但它返回一个错误:
Error: near "ORDER": syntax error
Run Code Online (Sandbox Code Playgroud)
我考虑的其他选择是:
DELETE FROM ranking WHERE id NOT IN (SELECT id FROM ranking ORDER BY score
DESC LIMIT 100)
Run Code Online (Sandbox Code Playgroud)
但我不知道它是否有效
rai*_*7ow 12
我想你正在寻找这个:
DELETE FROM ranking WHERE id NOT IN (
SELECT id FROM ranking ORDER BY score DESC LIMIT 100);
Run Code Online (Sandbox Code Playgroud)
它非常有效(事实上,它非常典型),因为嵌套查询只执行一次.它实际上更多地取决于"得分"是否被索引覆盖 - 或者不是:
(没有索引):
EXPLAIN QUERY PLAN DELETE FROM ranking WHERE id NOT IN (
SELECT id FROM ranking AS ranking_subquery ORDER BY score DESC LIMIT 2);
--
selectid order from detail
0 0 0 SCAN TABLE ranking (~500000 rows)
0 0 0 EXECUTE LIST SUBQUERY 0
0 0 0 SCAN TABLE ranking AS ranking_subquery (~1000000 rows)
0 0 0 USE TEMP B-TREE FOR ORDER BY
Run Code Online (Sandbox Code Playgroud)
(之后CREATE INDEX ts ON ranking(score);)
selectid order from detail
0 0 0 SCAN TABLE ranking (~500000 rows)
0 0 0 EXECUTE LIST SUBQUERY 0
0 0 0 SCAN TABLE ranking AS ranking_subquery USING INDEX ts (~1000000 rows)
Run Code Online (Sandbox Code Playgroud)