MYI, MYD ve FRM Dosyasını Sunucuya Eklemek

MySQL sunucu kullanıyorsanız ve sunucunuz Windows’da barınıyorsa, MySQL bu verileri C:\ProgramData\MySQL\MySQL Server 5.5\data\ klasöründe saklar. Bazen burayı kullanarak yedek alabilirsiniz. Yedek aldığınız dosyalar her tablo için üç tanedir. Örneğin tablomuz “test” ise;

– test.myd
– test.myi
– test.frm

Bu dosyaları kopyalayıp yedek aldıktan sonra tekrar MySQL sunucusuna eklemek istediğinizde yapmanız gereken şey şudur. Öncelikle MySQL sunucusu çalışır durumdaysa kapatın. Bunun için MySQL Administrator adlı programı açın (Yeni adı MySQL Workbench) ve sunucuyu durdurun. Ardından yine aynı yol içerisinde hangi veritabanına kaydedecekseniz onun içine dosyayı atın. Sunucuyu tekrar çalıştırdığınızda tablonun ilgili veritabanında görüldüğünü göreceksiniz.

Herhangi bir hata ile karşılaşmamak için “REPAIR TABLE tablo” komutunu kullanabilirsiniz.

MySQL’de Üç Tabloyu Tek Sorguda Birleştirmek

Bazen aynı anda üç tablodaki verileri kullanmamız gerekebilir. Örneğin aşağıdaki şekilde üç tablomuz olsun:

veriler

Bu tablolardan “kullanici” kullanıcı bilgilerini saklıyor, “gruplar” ise kullanıcıların üye olabileceği grupları. “kullanici_grup” tablosu ise bu ikisi arasında bir köprü oluşturuyor. Yani hangi kullanıcının hangi grubu seçtiğini gösteriyor. Şimdi bu üç tabloyu kullanarak kullanici – grup şeklinde ekrana yazdıralım.

Kullanacağımız kod:

SELECT k.kullanici, g.grup
FROM kullanicilar k, gruplar g, kullanici_grup kg
WHERE kg.kullanici_id = k.id AND kg.grup_id = g.id; 

SELECT’ten hemen sonra almak istediğimiz verileri belirttik. FROM’dan sonra kullanacağımız tabloları belirttik. Her tablo için bir isim belirttik. Örneğin yukarıdaki işlemde tüm k’lar “kullanici” tablosunu belirtiyor. Bunu MySQL’in anlaması için şeklinde belirttik.

WHERE’den sonra iki tablo arasında köprü olan kullanici_grup tablosu ile eşleşen kullanici_id ve grup_id leri belirttik. Böylelikle MySQL sunucusu üç tablodan tek bir sorgu sonucu çıkartacaktır.

MySQL’de Kullanıcıya Yetki Vermek (Grant)

MySQL Yönetici ekranında bir kullanıcı ve bir veritabanı oluşturup bu kullanıcı için veritabanında tam yetki verelim.

Öncelikle veritabanını oluşturuyoruz:

CREATE DATABASE veritabani;

Ve bu veritabanında yetkilendireceğimiz bir kullanıcı oluşturuyoruz:

CREATE USER 'kullanici'@'localhost' IDENTIFIED BY 'sifre';

Yukarıda localhost sunucu adresidir ve kullanıcının bağlanabileceği sunucuyu belirtir. Eğer tüm sunucular için yetki verilecekse ‘kullanici’@’%’ olarak değiştirmelisiniz.

Şimdi bu kullanıcıya yarattığımız ‘veritabani’ isimli veritabanı üzerinde tam yetki verelim. Unutmayın yetki verebilmek için MySQL Yönetici şifresi ile giriş yapmış olmanız gerekiyor.

GRANT ALL ON veritabani.* TO 'kullanici'@'localhost';

Yukarıdaki kodu çalıştırdığınızda ‘veritabani’ üzerinde kullanıcı tam yetkilendirilmiş olacaktır.

Diğer tüm yetkiler ve kullanımlar için (İngilizce);
http://dev.mysql.com/doc/refman/5.1/en/grant.html

Veritabanı Optimizasyonu

Bu makalede MySQL’i daha az yormak, sorguların işleniş zamanlarını kısaltmak, sitenizi hızlandırmak için birtakım veritabanı optimizasyonu tavsiyelerinde bulunacağım.

Eğer kendi kodlamalarınızla veritabanı kullanacaksanız birçok mysql sorgusu ile boğuşmak durumunda kalabilirsiniz. Kullandığınız tablolar çok fazla veri içerebilir. MySQL sunucusu bu verileri işlerken tüm veritabanındaki bilgileri kontrol etmek zorunda kalıyor olabilir. Şimdi ideal bir sorgu yapısını örnekleyelim:

1. Sadece gerekli sütunları sunucudan isteyin:

Tüm sütunları istemek demek, MySQL sunucusunun fazladan ve gereksiz veri göndermesi demektir. Örneğin bir tablodaki sadece başlık ve tarih kısmını kullanmamız gerekiyorsa bunu SELECT [sütunlar] bölümünde belirtmeliyiz.

# Yanlış Kullanım:
SELECT * FROM haberler LIMIT 0, 10;

# Doğru Kullanım:
SELECT baslik, tarih FROM haberler LIMIT 0, 10;

2. ORDER BY rand() kullanımından kaçının.

Gelen verilerin sırasını bildirmemize yarayan ORDER BY komutunun yanında eklenen rand() verilerin rastgele getirilmesini ister. Fakat bu özellikle binlerce kayıt bulunan bir tabloda sunucuya extra yük bindirir. Yaklaşık 120000 kayıtlı bir tabloda rand() kullanırsak en az 0.3 saniye sürecektir sorgumuz. Oysa ideal bir sorgu 0.001-0.005 ms harcamalıdır.

# Yanlış Kullanım:
SELECT * FROM sarki_sozleri ORDER BY rand() LIMIT 0, 10;

Eğer illa ki rastgele veri almak istiyorsanız, bu işi PHP’de de yapabileceğinizi unutmayın. Böylelikle yük MySQL’den kalkacaktır.

3. INDEX kullanın.

MySQL’de verileri hızlı bir biçimde sıralamak ve karşılığında gelen veriyi bulmak için INDEX yaratmalıyız. Özellikle en çok kullanılan sütunlar için INDEX yaratırsak sunucu daha az zamanda verileri bulacaktır:

İki yolla index ekleyebilirsiniz:

# 1. Yol
ALTER TABLE tablo_adi ADD INDEX index_adi (sutun1, sutun2, ...);

# 2. Yol
CREATE INDEX index_adi ON tablo_adi (sutun1, sutun2, ...);
# Örneğin aşağıdaki tarz bir sorguyu sıkça kullanıyorsak:
SELECT baslik FROM haberler WHERE dosya = "dosya_adi" AND kategori = "1";

# Aşağıdaki gibi bir index yaratma yoluna gidebiliriz:
CREATE INDEX l_dosya_kat ON haberler (dosya, kategori);

Böylelikle bu tarz sorgular daha az zaman harcayacaktır.

Eğer tablodaki CHAR, VARCHAR, TEXT gibi yazı içeren verilerde LIKE “%kelime%” tarzı aramalar gerçekleştiriyorsanız. FULLTEXT INDEX’i kullanabilirsiniz.

# Şarkı sözü tablomuzda sözlerin bulunduğu sütuna bunu ekliyoruz.
CREATE FULLTEXT INDEX l_sozler ON sarkisozleri (sozler);

# Ve eğer sözlerde arama yapacaksak bunu kullanmamız yeterli:
SELECT isim, soz FROM sarkisozleri WHERE MATCH(sozler) AGAINST('kelime');

Yukarıdaki örnek çalıştırılsaydı içinde “kelime” geçen tüm şarkı sözleri sorgu sonucu olarak yansıtılırdı.

Umarım sizlere faydalı olur bu yazı.

Unutmadan HTML Dersleri sayfamızdan sonra MySQL Komutları sayfamız da tamamlandı. Veritabanları ile ilgili yardım için bu siteyi kullanabilirsiniz.

MySQL’de Inner Join Kullanımı

Bazı durumlarda bir MySQL veritabanındaki tablolarımızı bir arada kullanmamız gerekir. Sadece yazı ve kategori numaralarının bulunduğu bir tabloda, kategori numarasına karşılık gelen kategorinin adını almak için başlıkta bahsettiğimiz INNER JOIN … ON() kodunu kullanarak istediğimiz bilgileri tek bir sorguyla alırız. Bu komut yapısı şu şekildedir:

SELECT (alacağımız veriler) FROM tablo1 INNER JOIN tablo2 ON (kurallar);

Alacağımız veriler bölümünde gerekli olan sütun adlarına aralarına virgül koyarak yer veririz. Kurallar bölümünde ise klasik bir WHERE … sonu gibi hangi kurallar dahilinde işlemin yapılacağını belirleriz.

SELECT etiket_id, baslik FROM etiketler_yazi INNER JOIN etiketler ON etiket_id=etiketler.id;

Yukarıdaki örnekte etiketler_yazi tablosundan etiket_id değeri, etiketler tablosundan ise baslik değerini aldık. En son kurallar kısmında “etiketler.id” kullanımı dikkatinizi çekmiş olabilir. Burada her iki tablo da id değerine sahip olduğunu düşünerek hangi tablonun id değerini alacağını bildirdik. tabloadi.sutunadi şeklinde bu kullanım sayesinde MySQL’e hangi sütundan bahsettiğimizi anlatmış olduk.

Bunun gibi aynı sütun adına sahip değerlerde “tabloadı as takmaad” şeklinde özel olarak isimlendirme şansına da sahipsiniz. Eğer bu şekilde verileri alacak olsaydık:

SELECT t1.etiket_id, t2.baslik FROM etiketler_yazi as t1 INNER JOIN etiketler as t2 ON t1.etiket_id=t2.id;

Yukarıdaki kod ile bu kod aynı işlevi görüyor. Tek farkı burada özel isimlendirilmelere gidilerek MySQL ile kesin olarak bir anlaşma sağladık. Benzer sütun adları için de “t1.id as id2” şeklinde isimlendirmelere gidilebilir. Bir sorgu sırasında sonuçlarımızdaki sütun adı burada belirttiğimiz id2 değerini alacaktır.

Kolay gelsin…