[Linux-programlama] Re: MySQL ve Index & PHP ve Include

---------

[Linux-programlama] Re: MySQL ve Index & PHP ve Include

From: Tuncay BAŞ <tuncay_at_bir.net.tr>
Date: Wed, 9 Jan 2008 10:35:20 +0200
Message-ID: <002e01c8529a$921092a0$39a0aed4@net>

PHP de include komutu ile dosya çağırılır. Çağırılan dosya, kendisini
isteyen dosyaya bir değer gönderebilir.

Require komutu ile eklenen sayfalar, kendisini çağıran dosyalara bir değer
göndermez.

Require_Once komutu ise require komutu ile daha önce dosya eklenmişmi ona
bakar. (Ben tavsiye etmem.)

MySQL de Index için ise aşağıdaki makaleyi okumanızı tavsiye ederim.

Makalenin orijinali :
http://www.bilisim-kulubu.com/sozluk/sozluk.php?e=index

Index, veritabanı nesnelerinden biridir.Bir tablo içinde bulunan verilere
daha hızlı ulaşmak için kullanılmaktadırlar.Veritabanı tune işlemleri için
bakılacak yerlerden biri de tablolar üzerinde index olma
durumudur.Genellikle aramalar en çok hangi sutun üzerinde gerçekleşiyorsa, o
alana index konur.Bu sayede daha performanslı sonuçlar elde edilir.

Indexler sadece select sorgularında kendilerini gösterir.Bir tabloda index
varsa, veritabanı yönetim sistemi tabloyu full scan etmek yerine, index
üzerinden tabloyu dolaşır.Bu sayede daha hızlı sonuca ulaşılmış olunur.

insert sorguları için, indexin bir ek maliyeti vardır.Çünkü her yeni bir
insert, indexin yeniden organize edilmesine neden olmaktadır.Bu da haliyle
işlemin yavaş sonuçlanmasına neden olmaktadır.
Yapılan testlerde-bu testler bizzat yapılmıştır-, indexli bir tablodan
yapılan select işlemi, indexsiz tabloya göre yaklaşık 40 kat daha hızlı
gerçekleşmektedir.Ama aynı şekilde indexli bir tablodan yapılan insert
işlemi, indexsiz bir tabloya göre yaklaşık 5 kat daha yavaş
gerçekleşmektedir.

Yanlış bir inanış vardır.Indexler performans arttırır diye.*Bu
yanlıştır.OLTP ağırlıklı sistemlerde index dikkatli
kullanılmalıdır.Datawarehouse sistemlerinde ise index daha yoğun
kullanılmaktadır. Çünkü bu tip sistemler ağırlıkla raporlamaların
çıkarıldığı sistemlerdir.

Bir tablonun bir alanı için index tanımlamak, o alanın değerlerinin
sıralanması demektir ki; bu sayede o alandaki değerlere daha hızlı
erişebilirsiniz.

Kelimelerin rastgele sırada yazıldığı bir sözlük düşününüz. Aradığımız
kelimeyi bulmak için tek tek bütün kelimeleri okumak zorunda kalırdık!
Halbuki kelimelerin sıralı kaydedildiği aklı başında bir sözlükte,
aradığımızı bulmak için en fazla 10 sayfa çeviriyoruz.

Örneğin

create table Kisi(
   id int,
   ad varchar(50),
   yas int
)
şeklinde bir tablomuz olsun ve bu tabloya bir milyon kayıt ekleyelim. bu
tablo üzerinde çalıştırılan

select * from Kisi where ad='allenscoot'
şeklinde bir sorgu bütün kayıtları tek tek dolaşır. Eğer allenscoot en son
kayıtta ise veritabanı bir milyon işlem yapmak zorunda kalacaktır. Eğer ad
alanında index varsa, allenscoot kaydı nerede olursa olsun veritabanı onu
bulmak için en fazla 20 işlem yapar. (2^20 ~ 1,000,000. bkz: binary search)

Bu durumda ad alanı için index tanımlamak çok mantıklıdır. Peki yas alanı
için de index tanımlasak mı? Gerek yok, çünkü sorgumuzun where kısmında ad
alanı var, yas yok. Buradan önemli bir sonuca ulaşırız: Indexlere ihtiyaç,
runtime'da ortaya çıkar. Programı (yani SQL'leri) yazmadan hangi alanların
index'e ihtiyacı olacağını bilemeyiz. Geliştirdiğimiz veritabanı uygulaması
için yazdığımız tüm SQL'lerin where kısımlarını incelemeli ve buna göre
indexlerimizi belirlemeliyiz. Bu işi yapan toollar da vardır. Örneğin MS SQL
Server'ın Index Tuning wizard'ı.

Sadece where değil elbet order by'da belirtilen alanlar için de index
tanımlamak sorguları hızlandıracaktır.

"Ne güzel o zaman, ne kadar where, order by varsa hepsini inceleyelim bütün
alanlar için index yapalım!"
Bu doğru değildir. Çünkü indexlenmiş bilgi sıralı bilgidir. Sıralanmış
kayıtlar select sorgularını hızlandırırken, insert ve update sorgularını
yavaşlatır. Çünkü insert edilen bilgi doğru sıraya insert edilmelidir. Bu da
şu demektir; yukarıdaki tabloya yeni bir kayıt eklemek için bilgisayarın en
az 20 işlem yapması gerekecek. İndex olmasaydı bir seferde insert
edebilirdi.

Genellikle 1000'den az satıra sahip tablolara index koymak gereksizdir.
Çünkü çoğu veritabanı bu tarz küçük tabloları farklı şekilde yönetir.

Birden fazla alan için tek bir index tanımlamak mümkündür. Bunu (where ad=x
and yas=y) veya (order by ad, yas) sorgularında tercih etmek gerekir.
Bununla birlikte hiçbir zaman sonuçlarını görmeden index tanımlamaya
çalışmamak gerekir. Önce yavaş çalışan SQL tesbit edilmeli, incelendikten
sonra indexler tanımlanmalı, SQL tekrar çalıştırılmalı ve performans
kazanımı ölçülmelidir. Kazanım yoksa index kaldırılmalıdır. Deneme yanılma
en garanti yöntemdir yani.

----- Original Message -----
From: "Nuri Akman" <nuri.akman_at_hazine.gov.tr>
To: <linux-programlama_at_liste.linux.org.tr>
Sent: Wednesday, January 09, 2008 10:26 AM
Subject: [Linux-programlama] MySQL ve Index & PHP ve Include

Arkadaşlar,

Öğrenmek istediğim konu var:

1.) MySQL tablolarında ne zaman index kullanmaya ihtiyaç duyarım? Nasıl
yaparsam sorgularım tanımladığım index'lere bakarak daha hızlı çalışır?

2.) PHP'deki include, require, require_once komutlarının birbirinden
farkı konusunu öğrenmek istiyorum.

Selamlar,
Nuri AKMAN

_______________________________________________
Linux-programlama mailing list
Linux-programlama_at_liste.linux.org.tr
http://liste.linux.org.tr/mailman/listinfo/linux-programlama

_______________________________________________
Linux-programlama mailing list
Linux-programlama_at_liste.linux.org.tr
http://liste.linux.org.tr/mailman/listinfo/linux-programlama
Received on Wed 09 Jan 2008 - 10:03:14 EET

---------

Bu arsiv hypermail 2.2.0 tarafindan uretilmistir.