Przyśpieszenie zapisu do bazy danych na przykładzie Python i MySQL

Istnieje kilka sposobów na przyspieszenie operacji wstawiania danych do bazy danych MySQL w Pythonie.

1. Użycie mechanizmu batch:
Wstawianie danych w partiach (batchach) zamiast pojedynczo może znacząco przyspieszyć operację.

import mysql.connector

# Połączenie z bazą danych
cnx = mysql.connector.connect(user='username', password='password', host='127.0.0.1', database='database_name')
cursor = cnx.cursor()

# Przykładowe dane do wstawienia
data_to_insert = [
    (value1, value2, value3),
    (value4, value5, value6),
    # ...
]

# Wstawianie danych w partiach
add_data = ("INSERT INTO table_name "
            "(column1, column2, column3) "
            "VALUES (%s, %s, %s)")
cursor.executemany(add_data, data_to_insert)

# Zatwierdzenie transakcji
cnx.commit()

cursor.close()
cnx.close()

2. Użycie transakcji:
Wykonywanie wielu operacji w ramach jednej transakcji może również przyspieszyć wstawianie danych.

import mysql.connector

cnx = mysql.connector.connect(user='username', password='password', host='127.0.0.1', database='database_name')
cursor = cnx.cursor()

try:
    # Rozpoczęcie transakcji
    cnx.start_transaction()

    # Przykładowe dane do wstawienia
    data_to_insert = [
        (value1, value2, value3),
        (value4, value5, value6),
        # ...
    ]

    # Wstawianie danych
    add_data = ("INSERT INTO table_name "
                "(column1, column2, column3) "
                "VALUES (%s, %s, %s)")
    cursor.executemany(add_data, data_to_insert)

    # Zatwierdzenie transakcji
    cnx.commit()
except mysql.connector.Error as err:
    print(f"Błąd: {err}")
    cnx.rollback()
finally:
    cursor.close()
    cnx.close()

3. Użycie silnika InnoDB z opcją innodb_flush_log_at_trx_commit ustawioną na 2:
Domyślnie InnoDB wykonuje zapis do logu po każdej transakcji. Można to zmienić, ustawiając wartość innodb_flush_log_at_trx_commit na 2, co zwiększy wydajność kosztem mniejszej trwałości danych.

SET GLOBAL innodb_flush_log_at_trx_commit = 2;

Uwaga: To ustawienie zwiększa ryzyko utraty danych w przypadku awarii.

4. Użycie narzędzi do masowego ładowania danych:
Narzędzie takie jak LOAD DATA INFILE może być znacznie szybsze niż standardowe wstawianie.

import mysql.connector

cnx = mysql.connector.connect(user='username', password='password', host='127.0.0.1', database='database_name')
cursor = cnx.cursor()

load_data_query = """
LOAD DATA INFILE 'path_to_your_csv_file.csv'
INTO TABLE table_name
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS;
"""

cursor.execute(load_data_query)
cnx.commit()

cursor.close()
cnx.close()

Każda z tych metod może przyczynić się do zwiększenia wydajności wstawiania danych do bazy MySQL. Wybór odpowiedniej metody zależy od konkretnego przypadku użycia, rodzaju danych oraz wymagań dotyczących trwałości danych.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *