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.