Rumah > Soal Jawab > teks badan
Saya sedang menyusun baris dalam lajur MySQL incident_archive
中有一个包含数百万条记录的大表,我想按 created
dan mengekalkan baris X pertama dan memadamkan yang lain, apakah cara yang paling berkesan.
Setakat ini saya menghasilkan penyelesaian ini dalam Python:
def do_delete_archive(rowsToKeep): if rowsToKeep > 0: db_name = find_environment_value('DB_NAME', False, "dbname") db_host = find_environment_value('DB_HOST', False, "host") db_user = find_environment_value('DB_USER', False, "username") db_pass = find_environment_value('DB_PASS', False, "password") db = MySQLdb.connect(host=db_host,user=db_user,passwd=db_pass,db=db_name) cursor = db.cursor() sql = f"""DELETE FROM `incident_archive` WHERE incident_id NOT IN ( SELECT incident_id FROM ( SELECT incident_id FROM `incident_archive` ORDER BY created DESC LIMIT {rowsToKeep}) foo) LIMIT 10000;""" try: rowcount = rowsToKeep+ 1 while rowcount > rowsToKeep: cursor.execute(sql) db.commit() rowcount = cursor.rowcount print(f"--- Affected Rows: {rowcount} ---") except: db.rollback()
Masalah yang saya ada di sini ialah kaedah ini tidak akan berfungsi jika rowsToKeep
的值大于或等于 10000
, apakah cara yang lebih baik untuk melakukan proses ini?
**Nota: Nilai rowsToKeep adalah dinamik, yang bermaksud ia boleh berubah.
P粉6271364502024-04-02 17:46:12
Saya datang dengan penyelesaian berikut:
Nota: Ambang ialah pembolehubah yang mengandungi bilangan maksimum rekod yang ingin kami simpan pada 1000 dalam contoh kami
sqlCreate = f"""CREATE TABLE new_incident_archive LIKE incident_archive;""" print(f"Running query is: {sqlCreate}") cursor.execute(sqlCreate) print(f"Done with: {sqlCreate}") sqlInsert = f"""INSERT INTO new_incident_archive SELECT * FROM `incident_archive` ORDER BY created DESC LIMIT {threshold}""" print(f"Running query is: {sqlInsert}") cursor.execute(sqlInsert) db.commit() print(f"Done with: {sqlInsert}") sqlDrop = f"""DROP TABLE incident_archive""" print(f"Running query is: {sqlDrop}") cursor.execute(sqlDrop) print(f"Done with: {sqlDrop}") sqlRename = f"""RENAME TABLE `new_incident_archive` TO `incident_archive`;""" print(f"Running query is: {sqlRename}") cursor.execute(sqlRename) print(f"Done with: {sqlRename}")