Baza sklepu internetowego na MariaDB: klienci, produkty, zamówienia, pozycje zamówień, raporty i historia klienta
Wyzwanie
Baza sklepu zaprojektowana w pośpiechu miała tylko klucze główne. Przy małych tabelach wszystko było natychmiastowe, więc brak indeksów nie rzucał się w oczy. Wraz ze wzrostem danych zapytania, które wcześniej trwały milisekundy, zaczęły trwać setki milisekund, a listy i raporty pod obciążeniem zajmowały bazę na długie chwile.
Zadanie: pokazać pomiarem, ile kosztuje brak indeksów na prawdziwych danych, dodać właściwe indeksy do typowych zapytań sklepu, filtra po kliencie, historii zamówień z JOIN, raportu sprzedaży i paginacji, oraz wskazać pułapki, przez które indeks jest bezużyteczny, choć został założony.
Rozwiązanie
Baza taka, jaką zastaliśmy: cztery tabele, klienci, produkty, zamówienia i pozycje, z samymi kluczami głównymi. Klucze obce między nimi istniały tylko w kodzie aplikacji, nie jako ograniczenia w bazie, więc nic nigdy nie założyło na nich indeksu. Dla każdego typowego zapytania sklepu zarejestrowaliśmy plan, liczbę wierszy odczytanych skanem i medianę czasu, potem dodaliśmy właściwe indeksy jeden po drugim i zmierzyliśmy to samo zapytanie ponownie.
Pułapki dostały osobne pomiary: przypadki, w których indeks istnieje, a baza go nie używa albo używa źle. A ponieważ indeks nie jest darmowym zyskiem, zmierzyliśmy, o ile pięć indeksów spowalnia zapis i ile zajmuje miejsca. Dane sklepu w tamtym momencie: 100 000 klientów, 50 000 produktów, 500 000 zamówień i 1,75 miliona pozycji na MariaDB 10.11 z InnoDB, stan na 2026-10.
Wyniki
- Historia klienta, JOIN trzech tabel
- Z 406,8 ms na 0,075 ms
- Zamówienia klienta
- Z 500 000 skanowanych wierszy na 5
- Wyszukiwanie po adresie e-mail
- Z 5,9 ms na 0,024 ms
- Dziesięć najnowszych zamówień
- Z 39,3 ms na 0,009 ms
- Raport sprzedaży po statusie i zakresie dat
- Z 34 268 wierszy na 3 336 dzięki indeksowi złożonemu
- Cena pięciu indeksów na tabeli zamówień
- Zapis 3,1 raza wolniejszy, indeksy to 237 procent rozmiaru tabeli