Je trie les lignes de la colonne MySQL incident_archive
中有一个包含数百万条记录的大表,我想按 created
, je garde les X premières lignes et je supprime le reste, quelle est la manière la plus efficace.
Jusqu'à présent, j'ai trouvé cette solution en 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()
Le problème que j'ai ici est que cette méthode ne fonctionnera pas si rowsToKeep
的值大于或等于 10000
, quelle est la meilleure façon de réaliser ce processus ?
**Remarque : la valeur rowsToKeep est dynamique, ce qui signifie qu'elle peut changer.
J'ai trouvé la solution suivante :
Remarque : Le seuil est la variable contenant le nombre maximum d'enregistrements que nous souhaitons conserver à 1000 dans notre exemple