Jak przyspieszyć zapis do bazy MySql

0

Witam,

$_SESSION["id"] = -27;
		$user = 'root';
		$pass = '';
		$db = 'baza';
		$db = new mysqli('localhost', $user, $pass, $db) or die("Unable to connect");
		
		//1
		$zapytanie = "INSERT INTO `jeden` (`id`, `godzina`, `data` , `nazwa`, `cc`) VALUES ('".$_SESSION["id"]."', '".date("H:i:s")."', '".date("Y-m-d")."', 'name', ".$_SESSION["cc1"].")";
		$idzapytania = mysqli_query($db,$zapytanie);
//2
		$zapytanie = "INSERT INTO `jeden` (`id`, `godzina`, `data` , `nazwa`, `cc`) VALUES ('".$_SESSION["id"]."', '".date("H:i:s")."', '".date("Y-m-d")."', 'name', ".$_SESSION["cc2"].")";
		$idzapytania = mysqli_query($db,$zapytanie);

Takich linijek:

$zapytanie = "INSERT INTO `jeden` (`id`, `godzina`, `data` , `nazwa`, `cc`) VALUES ('".$_SESSION["id"]."', '".date("H:i:s")."', '".date("Y-m-d")."', 'name', ".$_SESSION["ccn"].")";
		$idzapytania = mysqli_query($db,$zapytanie);

Mam łącznie 200. Czas zapisu całości wynosi 10 sekund. To jest zdecydowanie dla mnie za dużo. Da się jakoś przyspieszyć ten proces?

1

Insert przyjmuje dowolną liczbę wierszy którą mu wyślesz. Wysyłanie po jednym wierszu jest skrajnie nieoptymalne.

Możesz to zrobić np. tak:

$values = [];
foreach ($_SESSION as $index => $value) {
    if (preg_match('%^cc.+%', $index)) {
        $values[] = "('".$_SESSION["id"]."', '".date("H:i:s")."', '".date("Y-m-d")."', '2GIVE'," . $value.")";
    }
}
$zapytanie = "INSERT INTO `jeden` (`id`, `godzina`, `data` , `nazwa`, `cc`) VALUES " . implode (',', $values); 
1

MySQL jest w stanie robić dziesiątki tysięcy insertów na sekundę, o ile tylko prawidłowo do tego podejdziesz.

Aktualnie wysyłasz do bazy te 200 zapytań, które MySQL musi za każdym razem przeparsować od zera - wykorzystując binding możesz ten proces mu ułatwić; to będzie dobre na start.

1

Pojedynczy zapis do bazy składa się z następujących kroków (liczby w nawiasach to proporcje czasu, jaki dana czynność zajmuje):

Connecting: (3)
Sending query to server: (2)
Parsing query: (2)
Inserting row: (1 × size of row)
Inserting indexes: (1 × number of indexes)
Closing: (1)

Jak widzisz najdłużej schodzi się z samym połączeniem. Prostym rozwiązaniem jest tzw. bulk insert. Czyli zamiast robić 200 x 1 zapytanie, to robisz 1 zapytanie, które dodaje 200 wpisów. Tym magicznym sposobem zaoszczędzasz sobie full czasu na m.in. łączenie z bazą, wysyłanie zapytania, parsowanie go itd.

1 użytkowników online, w tym zalogowanych: 0, gości: 1