Ceviz Forum

Geri Dön   Ceviz Forum > Programlama > Veritabanları & SQL

Cevapla
 
LinkBack Seçenekler
Eski 05/05/2003, 14:08   #1 (permalink)
Cevizci
 
Üyelik Tarihi: 02/2003
Mesaj: 165
Varsayılan select sorgusunda index secimi

selamlar.
MySQL de bir adres tablosu oluşturdum ve
'id' primary key,'adi' index,'soyadi' index olarak belirledim.
bir listeleme yaptıracağım. mesela,
SELECT adi,soyadi,adresi FROM adres_table

sorum şu.bu select cümlesinin sonucunu adi index'ine göre
nasıl getirtebilirim?
adi index olduğu için kendisi otomatikman adi alanına
göre sıralı mı getirir?yoksa 'order by adi' mı demem lazım?

tabloya rasgele 500 bin kayıt attım.adi alanina göre order by yaptım.
aynı sorguyu index olmayan başka bir alan göre yine
order by kullanarak çalıştırdım. hemen hemen aynı sürede sonucu
getirdi.

adi hanesinin index olmasının avantajını nasıl kullanacagım?
bahtiyarsenoglu hatta değil   Alıntı Yaparak Yanıtla
Eski 25/12/2005, 19:52   #2 (permalink)
İptal Durumu
 
Üyelik Tarihi: 11/2004
Mesaj: 33
Varsayılan

bence biraz aç soruyu. hiçbirşey anlaşılmıyor
benozgur hatta değil   Alıntı Yaparak Yanıtla
Eski 27/12/2005, 00:09   #3 (permalink)
naesse
misafir
 
Mesaj: n/a
Varsayılan

Alıntı:
bahtiyarsenoglu, mesajından alıntı:
adi hanesinin index olmasının avantajını nasıl kullanacagım?
arama yaparken sonuçlara daha hızlı kavuşabilirsin....
  Alıntı Yaparak Yanıtla
Eski 27/12/2005, 12:21   #4 (permalink)
Cevizci
 
Üyelik Tarihi: 02/2003
Mesaj: 165
Varsayılan

soruyu daha ayrıntılı yazıyorum:
haber_table adında bir tablom var.
alanlar:
yayin_adi
yayin_tarihi
haber
...

şeklinde.

index alanlarım:
index_1 : yayin_adi + yayin_tarihi
index_2 : yayin_tarihi + yayin_adi

2 milyon dan fazla kaydım var.

bir yayin_tarihi ne ait ortalama 20 bin kayıt
bir yayın_adi na ait ortalama 30 bin kayıt var

sorgum şu şeklide başlıyor

select yayin_adi, yayin_tarihi, ..... from haber_table
where ....

where den sonraki kısım ekrandan alınan parametrelere göre şekilleniyor.

ekrandan alınan parametreler arasında yayin_adi ve yayin_tarihi de var.
yayin_adi çoklu seçimli,
yayin_tarihi iki tarih aralığı şeklinde.

şimdi, ekrandan tek bir yayin_adi seçmişse index_1 kullanılmalı ki sonuçlar hızlı gelsin,
veya başlangıç ve bitiş yayın_tarihleri aynı ise birden fazla yayın_adi seçilmişse index_2 kullanılmalı ki sonuçlar hızlı gelsin.

buradaki sorum şuydu:
hangi index in kullanılacağını nasıl bildireceğim? Yanlış bilmiyorsam ORACLE da
hangi index i kullanacağı belirlenebiliyor SQL cümlesinde.

ben yukarıdaki durum için çeşitli denemeler yapmıştım. ancak hız konusunda
pek bir verim alamamıştım. yani index_1 i kaldırdığımdaki sorgularla index_1 vakenki sorgu hızlarında bir değişme olmamıştı. (index_2 yi hiç kaldırmadım)
sanki sürekli index_2 yi kullanıyor gibiydi.

umarım açık olmuştur.
bahtiyarsenoglu hatta değil   Alıntı Yaparak Yanıtla
Eski 27/12/2005, 12:58   #5 (permalink)
Registered User
 
Üyelik Tarihi: 01/2003
Mesaj: 6,337
Varsayılan

Hangi indeksi kullanacağına MySQL karar veriyor.
İndeks 1 ve 2 aynı özelliklere sahip olduğundan herhangi birinin silinmesi hızı etkilemez. 2 indeksi de silersen, aynı sorgu daha uzun sürede sonuçlanır.
acemi hatta değil   Alıntı Yaparak Yanıtla
Eski 27/12/2005, 13:34   #6 (permalink)
Cevizci
 
Üyelik Tarihi: 02/2003
Mesaj: 165
Varsayılan

"İndeks 1 ve 2 aynı özelliklere sahip olduğundan..."

cümlesini tam anlamadım. Yani özellikleri nasıl aynı oluyor?
Birinin önceliği yayın adına göre birinin ise yayın tarihine göre.

sadece, yayin_tarihi + yayin_adi indexi varsa ve ben sadece 'Capital' in tüm kayıtlarıyla ilgili
bir sorgulama yapacaksam ve 2 milyon kayıt varsa, 2 milyon kaydı da incelemez mi?
çünkü bu yayın adı na ait bilgiler tüm yayın_tarihi bilgilerine dağılmış durumda.
yani 01.01.2005 tarihinde de bilgi olabilir 27.12.2005 tarihinde de. bu iki tarih aralığında ise neredeyse 2 milyona yakın kayıt var.

aynı sorgu için yayin_adi + yayin_tarihi şeklinde bir index olsa ve bu index i
kullansa max 30 bin kaydı sorgulayacak. Çünkü herbir kayıt için ortalama 30 bin kayıt mevcut.

Bir bilgi eksikliğim olduğu kesin.
bahtiyarsenoglu hatta değil   Alıntı Yaparak Yanıtla
Eski 27/12/2005, 14:23   #7 (permalink)
Registered User
 
Üyelik Tarihi: 01/2003
Mesaj: 6,337
Varsayılan

İndeks varken bütün kayıtları sorgulamaz. İndeks yardimiyla, ilgili kayıtların yerlerini öğrenip doğrudan ilgili kayıtlara gider ve dolayısıyla sadece gerektiği kadar kayda bakar, fazlasına değil.

Birleşik indeks kullanmak yerine tek alanlı 2 indeks tanımla. Biri tarihe, diğeri ise yayın adına göre indeksleme yapsın
acemi hatta değil   Alıntı Yaparak Yanıtla
Eski 27/12/2005, 23:34   #8 (permalink)
Read Only
 
Revne Adlı Üyenin Profil Grafiği
 
Üyelik Tarihi: 11/2005
Mesaj: 595
Varsayılan

Alıntı:
bahtiyarsenoglu, mesajından alıntı:
soruyu daha ayrıntılı yazıyorum:
haber_table adında bir tablom var.
alanlar:
yayin_adi
yayin_tarihi
haber
...

şeklinde.

index alanlarım:
index_1 : yayin_adi + yayin_tarihi
index_2 : yayin_tarihi + yayin_adi
select yayin_adi, yayin_tarihi, ..... from haber_table
where ....

where den sonraki kısım ekrandan alınan parametrelere göre şekilleniyor.

ekrandan alınan parametreler arasında yayin_adi ve yayin_tarihi de var.
yayin_adi çoklu seçimli,
yayin_tarihi iki tarih aralığı şeklinde.
index_1 : yayin_adi
index_2 : yayin_tarihi

seklinde index kurarsan MySQL veya her neyse cok rahat indexleri kullanacaktır. Bildigim kadariyla SQL cumlelerindeki Where kosulları sondan cozumleniyor.(Yanlista biliyor olabilirim)... Buna gore tarih koşulunu where icinde sona koy.
MySQL(Baska programda olabilir) once yayin_tarihi indexi yardımıyla kayıtları suzer daha sonra yayin_adini cozumler ve yayin_adi indexini kullanarak suzulen verileri bir daha suzer...

NOT:
yayin_tarihi indexi Yayin_adi indexinden cok daha hizli calisir.Cunku Tarih aslında geri planda YIL + AY + GUN seklinde bir sayı olarak tutulur ve buda performans saglar... Bunun icin Tarih indexini Where cumleciginin sonuna almanı istedim...

Kolay Gelsin...
Revne hatta değil   Alıntı Yaparak Yanıtla
Eski 28/12/2005, 09:43   #9 (permalink)
Cevizci
 
Üyelik Tarihi: 02/2003
Mesaj: 165
Varsayılan

Bir bileşik index olarak bir de, her iki alana göre ayrı ayrı index yapıp hızları
test edeceğim.
Teşkkür ederim ilgilendiğiniz için.
bahtiyarsenoglu hatta değil   Alıntı Yaparak Yanıtla
Eski 03/01/2006, 11:06   #10 (permalink)
Cevizci
 
Üyelik Tarihi: 12/2005
Yer: İstanbul
Mesaj: 66
Varsayılan

Where kosulları sondan cozumleniyor cümlesi doğrudur. Bunun için filtreleme yaparken veriyi en çok süzecek kriteri en sona yazmak gerekir.

Ayrıca indexlerin faydasını where kısmında kriter yazarsan daha rahat görürsün.

Not: Bütün RDBMS'lerde yapacağın işlem yüküne göre bazı şeylerden vazgeçmen gerekir. Örneğin OLAP türü projelerde index kullanmak işlemleri oldukça hızlandıracaktır. Fakat OLTP türü işlemlerde ise yavaşlatacaktır. Nihayetinde index kullanmanın da bir maliyeti vardır. (Ekstra Not: MCSD eğitimlerinde, daha çok OLTP türü işlemleri üzerinde durulur.)
mazbil hatta değil   Alıntı Yaparak Yanıtla
Cevapla

Bookmarks

Seçenekler

Mesaj Yazma Hakları
Yeni mesajgöndermezsiniz
Cevap yazamazsınız
Dosya ekleyemezsiniz
Mesajınızı düzenleyemezsiniz

BB code is Açık
[IMG] kodu Açık
HTML kodu Kapalı
Trackbacks are Açık
Pingbacks are Açık
Refbacks are Açık

Benzer Konular
Konu Konuyu açana göre Forum Cevap En Son Mesaj
where sorgusunda yardım SeVeRaL Veritabanları & SQL 4 30/06/2006 18:35
C# sql sorgusunda değişken esabah C# 3 22/07/2005 13:14
5 html sayfa var bunları index.php veya index.html nasıl yerleştire bilirim asiklarnet PHP 6 14/09/2004 10:20
Php içinde select ile seçilen verinin başka select içinde gelmesi yumert PHP 6 12/11/2003 14:05
Select te index secimi bahtiyarsenoglu Veritabanları & SQL 1 15/10/2003 18:59


Forum saati Türkiye saatine göredir. GMT +3. Şu anda saat 01:48.

Reklamlar & Desteklenenler
Hassas Valf | Hassas Kaplama | Antalyamız | Gazete | Ticari Bilişim | Hakan Müştak | Rüya Tabirleri | Kadın | Hastalıklar | Cepte msn ve e-posta | Webmaster | Antalya Aupair | Turkish Property Antalya | Forum | Chat | Perde | Adsl | Araba | bolindir.com | guncelle.com | livescore | Web Tasarım | evden eve nakliyat | forum | evden eve | sohbet | Resimcim| Kalifiye İnsan Kaynakları | Web Tasarım | Oyun | Yusuf KOÇ | Akın Yorulmaz | şiir | UFO | Web Tasarım | Oyunlar | Canlı Tv |


Forum Yazılımı: vBulletin Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.2.0
Copyright ©2001 - 2008, Ceviz.net