Sobes.tech
Middle

Да ли сте икада морали да оптимизујете упите?

sobes.tech АИ

Одговор од АИ

Da, bilo je potrebno. Optimizacija upita je važan deo razvoja visokoperformansnih aplikacija.

Moj iskustvo uključuje:

  • Analiza plana izvršenja upita (EXPLAIN): Korišćenje EXPLAIN za razumevanje kako baza podataka izvršava upit, koje indekse koristi i gde se javljaju uska grla.
  • Kreiranje i optimizacija indeksa: Dodavanje odgovarajućih indeksa na često korišćene kolone i složenih indeksa za ubrzanje filtriranja, sortiranja i spajanja. Uklanjanje neupotrebljenih ili duplikatnih indeksa.
  • Prepisivanje neefikasnih upita:
    • Zamena SELECT * sa izborom specifičnih kolona.
    • Korišćenje prikladnijih tipova spajanja (JOIN) umesto podupita ili ugnježdenih petlji na nivou aplikacije.
    • Pojednostavljenje uslova WHERE.
    • Izbegavanje funkcija u uslovima WHERE na indeksiranim kolonama.
    • Optimizacija GROUP BY i ORDER BY.
  • Normalizacija/denormalizacija: Primena normalizacije za smanjenje suvišnosti ili, u nekim slučajevima, denormalizacije za ubrzanje čitanja podataka putem dupliranja ili kreiranja agregiranih kolona (sa oprezom).
  • Keširanje rezultata upita: Implementacija keširanja na nivou aplikacije ili korišćenje mehanizama keširanja baze podataka (npr. Redis, Memcached) za smanjenje opterećenja na bazu pri čitanju često traženih, retko menjajućih podataka.
  • Ograničenje uzorka podataka: Korišćenje LIMIT za paginaciju ili izbor samo potrebnog broja zapisa.
  • Monitoring i profilisanje: Korišćenje alata za monitoring (npr. Percona Monitoring and Management, phpMyAdmin sa uključenim Slow Query Log-om) za identifikaciju sporih upita.

Primer analize sa EXPLAIN:

// Primer sporog upita bez indeksa na koloni status
SELECT * FROM orders WHERE status = 'pending' AND created_at < CURDATE();

// Analiza plana
EXPLAIN SELECT * FROM orders WHERE status = 'pending' AND created_at < CURDATE();
// Može prikazati potpuni sken tabele (ALL) ili neupotrebu odgovarajućeg indeksa.

// Dodavanje složenog indeksa na oba kolona
CREATE INDEX idx_status_created_at ON orders (status, created_at);

// Ponovna analiza nakon kreiranja indeksa
EXPLAIN SELECT * FROM orders WHERE status = 'pending' AND created_at < CURDATE();
// Očekuje se da će tip (type) promeniti u ref ili range, a Extra će sadržavati "Using where;"