SQL Notları: İndeksler ve Tam Metin Arama

MySQL’de indeksler, veritabanı sorgularının performansını artırmak için kullanılan önemli araçlardır. Ayrıca, tam metin arama (FULLTEXT search) özelliği, metin tabanlı verilerde hızlı ve etkili arama yapmayı sağlar. Bu yazıda, MySQL’de indeks oluşturma, tam metin arama ve hazır ifadeler (PREPARE statements) gibi konuları ele alacağız.

#### 1. İndeks Oluşturma

İndeksler, tablolardaki belirli sütunlar üzerinde oluşturulur ve sorguların daha hızlı çalışmasını sağlar.

##### Örnek 1: Basit İndeks Oluşturma

Aşağıdaki örnekte, `my_table` tablosundaki `name` sütunu için bir indeks oluşturuluyor:

“`sql
CREATE INDEX idx_name ON my_table(name);
“`

##### Örnek 2: Benzersiz İndeks Oluşturma

Benzersiz indeks, bir sütuna yinelenen veri girilmesini engeller:

“`sql
CREATE UNIQUE INDEX idx_name ON my_table(name);
“`

##### Örnek 3: Bileşik İndeks Oluşturma

Bileşik indeks, birden fazla sütun üzerinde oluşturulur ve bu sütunların birlikte kullanıldığı sorguları hızlandırır:

“`sql
CREATE INDEX idx_name_date ON my_table(name, date);
“`

**Not:** Bileşik indekslerde sütun sırası önemlidir. Sorgular, indeksin solundaki sütunları kullanmalıdır.

#### 2. AUTO_INCREMENT Anahtarı

`AUTO_INCREMENT`, bir sütuna otomatik olarak artan değerler atamak için kullanılır. Genellikle birincil anahtar (PRIMARY KEY) olarak kullanılır.

##### Örnek: AUTO_INCREMENT ile Tablo Oluşturma

“`sql
CREATE TABLE my_table (
   id INT UNSIGNED NOT NULL AUTO_INCREMENT,
   name VARCHAR(100),
   PRIMARY KEY(id)
);
“`

**Not:** `AUTO_INCREMENT` değerleri her zaman benzersizdir, ancak boşluklar olabilir veya değerler yeniden kullanılabilir.

#### 3. Tam Metin Arama (FULLTEXT Search)

Tam metin arama, metin tabanlı sütunlarda hızlı ve etkili arama yapmayı sağlar. Bu özellik, özellikle büyük metinlerde arama yaparken kullanışlıdır.

##### Örnek 1: Basit Tam Metin Arama

Aşağıdaki örnekte, `book` tablosundaki `Title` sütununda “Database Programming” terimini arar:

“`sql
ALTER TABLE book ADD FULLTEXT INDEX Fulltext_title_index (Title);

SET @searchTerm = ‘Database Programming’;
SELECT MATCH (Title) AGAINST (@searchTerm IN NATURAL LANGUAGE MODE) AS Score, ISBN, Author, Title
FROM book
WHERE MATCH (Title) AGAINST (@searchTerm IN NATURAL LANGUAGE MODE)
ORDER BY Score DESC;
“`

##### Örnek 2: Boolean Modunda Tam Metin Arama

Boolean modu, arama terimlerine operatörler ekleyerek daha karmaşık aramalar yapmayı sağlar:

“`sql
SET @searchTerm = ‘Database Programming -Java’;
SELECT MATCH (Title) AGAINST (@searchTerm IN BOOLEAN MODE) AS Score, ISBN, Author, Title
FROM book
WHERE MATCH (Title) AGAINST (@searchTerm IN BOOLEAN MODE)
ORDER BY Score DESC;
“`

##### Örnek 3: Çoklu Sütunda Tam Metin Arama

Aşağıdaki örnekte, `Title` ve `Author` sütunlarında “Date Database Programming” terimini arar:

“`sql
ALTER TABLE book ADD FULLTEXT INDEX Fulltext_title_author_index (Title, Author);

SET @searchTerm = ‘Date Database Programming’;
SELECT MATCH (Title, Author) AGAINST (@searchTerm IN NATURAL LANGUAGE MODE) AS Score, ISBN, Author, Title
FROM book
WHERE MATCH (Title, Author) AGAINST (@searchTerm IN NATURAL LANGUAGE MODE)
ORDER BY Score DESC;
“`

#### 4. Hazır İfadeler (PREPARE Statements)

Hazır ifadeler, dinamik SQL sorguları oluşturmak ve çalıştırmak için kullanılır. Bu özellik, özellikle sorguların çalışma zamanında oluşturulması gereken durumlarda kullanışlıdır.

##### Örnek: Hazır İfade ile Sorgu Çalıştırma

Aşağıdaki örnekte, bir hazır ifade oluşturulur ve çalıştırılır:

“`sql
SET @s = ‘SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse’;
PREPARE stmt FROM @s;
SET @a = 6;
SET @b = 8;
EXECUTE stmt USING @a, @b;

DEALLOCATE PREPARE stmt;
“`

**Sonuç:**
“`
+—+
| hypotenuse |
+—+
| 10 |
+—+
“`

#### Sonuç

MySQL’de indeksler, tam metin arama ve hazır ifadeler, veritabanı sorgularının performansını artırmak ve karmaşık işlemleri kolaylaştırmak için kullanılan güçlü araçlardır. Bu özellikleri etkili bir şekilde kullanarak, veritabanı uygulamalarınızı daha verimli hale getirebilirsiniz. Bir sonraki yazıda görüşmek üzere!