Middle
Sorğuları optimallaşdırmaq məcburiyyətində qaldınızmı?
sobes.tech Süni İntellekt
AI-dan cavab
Bəli, mən də belə vəziyyətlə qarşılaşmışam. Sorğu optimallaşdırması yüksək performanslı tətbiqlərin inkişafında vacib bir hissədir.
Təcrübəm aşağıdakıları əhatə edir:
- Sorğunun icra planını analiz etmək (EXPLAIN):
EXPLAINistifadə edərək verilənlər bazasının sorğunu necə icra etdiyini, hansı indekslərin istifadə olunduğunu və harada tıxacların yarandığını anlamaq. - İndekslərin yaradılması və optimallaşdırılması: Tez-tez istifadə olunan sütunlara uyğun indekslər əlavə etmək və filtrasiya, sıralama və birləşmələri sürətləndirmək üçün birləşdirilmiş indekslər yaratmaq. İstifadə olunmayan və ya təkrarlanan indeksləri silmək.
- Effektiv olmayan sorğuların yenidən yazılması:
SELECT *yerinə konkret sütunların seçilməsi.- Uygun join tiplərindən (
JOIN) istifadə etmək, alt sorğular və ya tətbiq səviyyəsində iç-içə döngələr yerinə. WHEREşərtlərini sadələşdirmək.- İndeksli sütunlarda
WHEREşərtlərində funksiyalardan istifadə etməkdən çəkinmək. GROUP BYvəORDER BYoptimallaşdırmaq.
- Normalizasiya/denormalizasiya: Redundansiyanı azaltmaq üçün normalizasiya tətbiq etmək və ya bəzi hallarda, məlumatların oxunmasını sürətləndirmək üçün duplikasiya və ya toplulaşdırılmış sütunlar yaratmaq (diqqətli olmaq lazımdır).
- Sorğu nəticələrinin keşi: Tətbiq səviyyəsində keşi tətbiq etmək və ya Redis, Memcached kimi verilənlər bazası keşi mexanizmlərindən istifadə etmək, tez-tez soruşulan və az dəyişən məlumatların oxunmasını azaltmaq.
- Məlumatların seçimini məhdudlaşdırmaq:
LIMITistifadə edərək səhifələmə və ya yalnız lazım olan qeyd sayını seçmək. - Monitorinq və profil çıxarma: Yavaş sorğuları müəyyən etmək üçün monitorinq alətlərindən istifadə etmək (məsələn, Percona Monitoring and Management, phpMyAdmin ilə aktivləşdirilmiş Slow Query Log).
EXPLAIN ilə analiz nümunəsi:
// Status sütununda indeks olmayan yavaş sorğu nümunəsi
SELECT * FROM orders WHERE status = 'pending' AND created_at < CURDATE();
// Planın analizi
EXPLAIN SELECT * FROM orders WHERE status = 'pending' AND created_at < CURDATE();
// Tam cədvəl skanını (ALL) və ya uyğun indeksin istifadə olunmamasını göstərə bilər.
// Hər iki sütuna birgə indeks əlavə etmək
CREATE INDEX idx_status_created_at ON orders (status, created_at);
// İndeks yaradıldıqdan sonra yenidən analiz
EXPLAIN SELECT * FROM orders WHERE status = 'pending' AND created_at < CURDATE();
// Tip (type) ref və ya range-ə dəyişməlidir və Extra "Using where;" içerməlidir.