Sobes.tech
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): EXPLAIN istifadə 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 BYORDER BY optimallaş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: LIMIT istifadə 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.