簡體   English   中英

Mysql從表中刪除多個隨機行

[英]Mysql Deleting multiple random row from a table

我現在有一張有604 000行的表。 我想刪掉4000個隨機行,所以我的表只包含60萬個條目。

會有快速的方法嗎?

非常感謝。

從理論上講,這將是隨機和快速的。 在實踐中,它只會很快:

DELETE FROM tableX
LIMIT 4000

這將是隨機但非常慢,有600K行:

DELETE FROM tableX
ORDER BY RAND() 
LIMIT 4000

這不是真正隨機的(因為ID中通常存在間隙),它甚至可能不會刪除正好4000行(但是當存在許多間隙時會少一些),但它可能比之前更快。

需要在子查詢中進行額外的換行,因為從多個表中刪除的語法不允許LIMIT

DELETE td
FROM
      tableX AS td
  JOIN 
      ( SELECT t.id
        FROM
             tableX AS t 
          CROSS JOIN
              ( SELECT MAX(id) AS maxid 
                FROM tableX
              ) AS m
          JOIN
              ( SELECT RAND() AS rndm
                FROM tableX AS tr
                LIMIT 5000
              ) AS r
            ON 
               t.id = CEIL( rndm * maxid )
        LIMIT 4000
      ) AS x
      ON 
         x.id = td.id 

解釋輸出(子查詢的輸出,來自400K行表):

id           table        possible_keys  key_len     rows 
 select_type         type             key     ref         Extra
1 PRIMARY <derived2> system                             1
1 PRIMARY <derived3> ALL                             5000
1 PRIMARY t          eq_ref PRIMARY PRIMARY 4 func      1 Using where;Using index
3 DERIVED tr         index          PRIMARY 4      398681 Using index
2 DERIVED                                            Select tables optimized away
delete from yourTable limit 4000

如果我不得不猜測:

DELETE FROM table where id = (SELECT id FROM table ORDER BY rand() LIMIT 1) LIMIT 10
DELETE FROM TABLE ORDER BY RAND() LIMIT 4000;

雖然這需要時間......

更快的執行方式(不寫代碼!)可能是循環中的4000個單獨刪除

DELETE FROM TABLE WHERE AssumedPKisInt = <ARandomNumber>

當然,您需要確保不要嘗試刪除不存在或已刪除的行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM