byhk44 Hayır anlamadınız. Bir tane haberler diye tablonuz olsun:
CREATE TABLE news
(
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) not null,
slug VARCHAR(255) not null,
content LONGTEXT not null
);
Buraya iki tane index atılacak, biri slug için unique index, diğeri title ve content için full-text (id MySQL'de otomatik olarak PRMARY index olur). Slug benzersiz olması gerektiği için index unique olacak böylece hem aynı slugdan eklenmesini veritabanı düzeyinde engellemiş olacağız hem de WHERE slug = 'haber-basligi'
gibi sorgular hızlı çalışacak:
CREATE UNIQUE INDEX news_slug_unique_index on news (slug);
title ve content alanı için ise full-text index:
CREATE FULLTEXT INDEX news_search_index ON news (title, content);
Bu indexi kullanabilmek için full-text araması yapılması lazım:
SELECT *,
MATCH(title, content) AGAINST('"arama+ kelimesi+"' IN BOOLEAN MODE) as score
FROM news
WHERE MATCH(title, content) AGAINST('"arama+ kelimesi+"' IN BOOLEAN MODE)
ORDER BY score
Örneğin şimdi bir LIKE sorgusunu bir de MATCH...AGAINST sorgusunu EXPLAIN ANALYZE ile kontrol edelim:
EXPLAIN ANALYZE
SELECT *
FROM news
WHERE title LIKE '%arama kelimesi%'
OR content LIKE '%arama kelimesi%';
EXPLAIN ANALYZE
SELECT *,
MATCH(title, content) AGAINST('"arama+ kelimesi+"' IN BOOLEAN MODE) as score
FROM news
WHERE MATCH(title, content) AGAINST('"arama+ kelimesi+"' IN BOOLEAN MODE)
ORDER BY score DESC
İlk sorgunun çıktısı:
-> Filter: ((news.title like '%arama kelimesi%') or (news.content like '%arama kelimesi%')) (cost=0.35 rows=1) (actual time=0.016..0.016 rows=0 loops=1)
-> Table scan on news (cost=0.35 rows=1) (actual time=0.015..0.015 rows=0 loops=1)
İkinci sorgunun çıktısı
-> Sort row IDs: (match news.title,news.content against ('"arama+ kelimesi+"' in boolean mode)) (cost=0.35 rows=1) (actual time=0.009..0.009 rows=0 loops=1)
-> Filter: (match news.title,news.content against ('"arama+ kelimesi+"' in boolean mode)) (actual time=0.005..0.005 rows=0 loops=1)
-> Indexed full text search on news using news_search_index (title='"arama+ kelimesi+"') (actual time=0.004..0.004 rows=0 loops=1)
İkinci sorguda Indexed full text search on news using news_search_index... şeklindeki bize sorguyu çalıştırırken index kullandığını belirtiyor. İkinci sorguda ise Table scan on news... diyerek index kullanmadığını, tüm tabloyu taradığını belirtiyor. Boş tablo olmasına rağmen ilk sorgunun süresi 0.015 ms iken ikinci sorgunun süresi 0.004 ms yani ilk sorgu ikinci indexli sorgunun 3.75 katı daha yavaş...
Primary index, tarihlerde index kullanımı, composite index, partial composite index, B-TREE, B+TREE, HASH... Şimdi anlatabilmiş olmam lazım. Bu konu PHP ya da Laravel ile ilgili bir konu değil...