MySQL Performans Optimizasyonu Nasıl Yapılır? Index Kullanımı ve Sorgu Hızlandırma Nasıl Yapılır?

E-posta Hosting Kampanya

Veritabanı performansı, yüksek trafikli uygulamalarda sistemin sürekliliği ve verimliliği açısından kritik öneme sahiptir. MySQL performans optimizasyonu, yalnızca donanım kaynaklarını verimli kullanmakla sınırlı değildir; aynı zamanda doğru sorgu yapıları, uygun indeksleme stratejileri ve optimizasyon tekniklerini de içerir.

Bu makalede MySQL veritabanlarında performansı artırmak için kullanılabilecek en etkili yöntemler detaylı biçimde ele alınacaktır. Özellikle index (indeks) kullanımı, yavaş sorguların tespiti, veritabanı yapılandırmaları ve optimize edilmiş SQL ifadeleri gibi konulara odaklanılacaktır.

Index Kullanımı Nedir ve Neden Önemlidir?

MySQL’de index, tablo üzerinde arama işlemlerini hızlandırmak için kullanılan veri yapılarıdır. Bir tabloya index eklendiğinde, MySQL belirli sütunlarda yapılan arama, sıralama ve birleştirme işlemlerini çok daha hızlı bir şekilde gerçekleştirir.

Temel Index Türleri

  • PRIMARY KEY: Her tabloda yalnızca bir adet olabilir. Benzersiz ve boş olmayan değerleri temsil eder.
  • UNIQUE INDEX: Tekrarlayan değerleri engeller, her değerin benzersiz olmasını sağlar.
  • FULLTEXT INDEX: Metin arama işlemleri için kullanılır.
  • COMPOSITE INDEX: Birden fazla sütunu kapsayan index yapısıdır.

Index Kullanımında Dikkat Edilmesi Gerekenler

  • Gereksiz index’ler, yazma (INSERT, UPDATE, DELETE) işlemlerinde performans kaybına yol açar.
  • Her sütun için index oluşturmak yerine, sık kullanılan sorgulara göre stratejik index’ler belirlenmelidir.
  • EXPLAIN komutu kullanılarak hangi sorguların index kullandığı analiz edilmelidir.

EXPLAIN ile Sorgu Analizi Nasıl Yapılır?

MySQL’de bir sorgunun nasıl yürütüldüğünü analiz etmek için EXPLAIN komutu kullanılır. Bu komut, sorgunun hangi tabloları taradığını, hangi index’leri kullandığını ve sıralama işlemleri yapıp yapmadığını gösterir.

EXPLAIN SELECT * FROM kullanicilar WHERE email = '[email protected]';

Bu analizle:

  • type sütunundan erişim tipi (örneğin ALL, index, range) görülebilir.
  • key sütunu, kullanılan index’i gösterir.
  • rows sütunu, sorgunun kaç satırı tarayacağını belirtir.

type = ALL değeri, tablo taraması yapıldığını gösterir ve performans açısından kaçınılmalıdır.

SQL Sorgularını Hızlandırma Teknikleri

1. Gereksiz Sütunlardan Kaçının

Tüm sütunları çağıran SELECT * yerine sadece gerekli sütunlar belirtilmelidir.

SELECT ad, soyad FROM kullanicilar WHERE durum = 'aktif';

2. WHERE Şartlarını Doğru Kullanın

Sorgularda WHERE şartları, filtreleme yaparak sorgunun tarayacağı satır sayısını azaltır. Sık kullanılan filtre sütunlarına index eklenmesi önerilir.

3. JOIN Kullanımında Dikkatli Olun

JOIN işlemleri özellikle büyük tablolar üzerinde çalışırken performans sorunlarına neden olabilir.

  • Join yapılacak sütunların her iki tabloda da index’li olması önemlidir.
  • LEFT JOIN yerine mümkünse INNER JOIN tercih edilmelidir.

4. LIMIT ve OFFSET Kullanımına Dikkat

Büyük veri kümesinde LIMIT 100000 OFFSET 0 gibi sorgular veritabanını zorlayabilir. Bunun yerine “id ile sayfalama” gibi alternatifler tercih edilebilir.

SELECT * FROM kayitlar WHERE id > 100000 LIMIT 100;

5. Alt Sorgular Yerine JOIN Kullanımı

Alt sorgular (subqueries) yerine JOIN ifadeleri daha performanslı çalışabilir.

-- Yavaş Sorgu
SELECT * FROM urunler WHERE kategori_id IN (SELECT id FROM kategoriler WHERE aktif = 1);

-- Daha Hızlı Sorgu
SELECT u.* FROM urunler u JOIN kategoriler k ON u.kategori_id = k.id WHERE k.aktif = 1;

MySQL Yapılandırması ile Performans Artırma

Veritabanı ayarlarının optimize edilmesi performansa doğrudan katkı sağlar. Aşağıda bazı önemli yapılandırmalar yer almaktadır.

1. query_cache_size

Query cache özelliği aktifse, tekrar eden sorgular bellekte saklanarak daha hızlı yanıt verilir. Ancak modern MySQL sürümlerinde bu özellik kaldırılmıştır veya devre dışıdır. MariaDB gibi sistemlerde hâlen kullanılabilir.

2. innodb_buffer_pool_size

InnoDB motoru kullanan sistemlerde bu parametre, veritabanı tablolarının bellekte tutulmasını sağlar. Genellikle fiziksel belleğin %60-70’i kadar ayarlanır.

3. tmp_table_size ve max_heap_table_size

Geçici tablolar bellekte tutuluyorsa daha hızlı işlem yapılır. Bu parametrelerin artırılması, karmaşık sorgularda performansı iyileştirir.

Yavaş Sorgu Logları ile Performans Takibi

MySQL’in yavaş sorgu günlüğü özelliği sayesinde, belirli sürenin üzerinde çalışan SQL ifadeleri kaydedilir. Bu kayıtlar analiz edilerek darboğaz yaratan sorgular tespit edilebilir.

Aktif Etmek İçin:

[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql-slow.log
long_query_time = 2

Bu yapılandırma ile 2 saniyeden uzun süren tüm sorgular log dosyasına kaydedilecektir.

Veritabanı Normalizasyonu ve Performansa Etkisi

Normalizasyon, veri tekrarını önlerken veri bütünlüğünü sağlar. Ancak aşırı normalizasyon, fazla sayıda JOIN işlemine neden olarak performansı olumsuz etkileyebilir. Kritik uygulamalarda performans ve veri bütünlüğü dengesi kurulmalı, gerekirse denormalizasyon tercih edilmelidir.

Sonuç

MySQL performans optimizasyonu, sadece donanım değil; sorgu yazımı, indeksleme, yapılandırma ve izleme gibi birçok katmanda uygulanması gereken bir süreçtir. Özellikle doğru index kullanımı, EXPLAIN ile analiz, yavaş sorguların tespiti ve sunucu yapılandırmalarının optimize edilmesi gibi adımlar performans üzerinde doğrudan etkili olur.

Yüksek performanslı bir veritabanı yapısı kurmak ve sürdürülebilir hale getirmek için periyodik analizler yapılmalı, sorgular düzenli olarak gözden geçirilmelidir.