Webmaster Forumu

Geri git   Webmaster Forumu > Webmaster Kaynak Eğitim Tanıtım Hizmet > MySQL Veritabanı SQL
Kayıt ol Blogs Yardım Üye Listesi Ajanda iTrader Forumları Okundu Kabul Et

MySQL Veritabanı SQL SQL MySQL Access MSSQL Oracle Veritabani Database

Cevapla Add This!
 
LinkBack Seçenekler Stil
  #1 (permalink)   iTrader 
Alt 2007-04-20, 21:01
iyinet - ait Kullanıcı Resmi (Avatar)
Paylaşım için teşekkürler
 
Üyelik tarihi: Sep 2002
Mesajlar: 6.055
Blog Entries: 2
Tecrübe Puanı: 3
iTrader: %100/6
iyinet is just really niceiyinet is just really niceiyinet is just really niceiyinet is just really nice
Standart MySQL neden yavaslar

SQL sorgulari tablolardan yapilir.

Tablolari, yapilandirilmis dosya gibi dusunebilirsiniz.

Tablo boyu ne kadar kucuk olursa SQL sorgulari o kadar hizli calisir.



+ MySQL o tabloyu acip okur icindeki veriyi bulur size verir.



Basit bir ornek:

Diyelimki MySQL sizsiniz...

1. Notepad ile 5K lik bir dosyayi actiniz. 'Adana Mersin' diye arattirdiniz. Arama sonucundaki tum 'Adana-Mersin' leri Notepad ile actiginiz yeni bir dosyaya koydunuz. Bu islem toplam 1 dakikanizi alsin.

2. Notepad ile 2Mb lik bir dosta actiniz. Sadece dosyanin acilmasi 120 saniye sursun. Arama sonucundaki tum 'Adana-Mersin' leri Notepad ile actiginiz yeni bir dosyaya koydunuz. Bu islem toplam 1 saatinizi alsin.



Sonuc: Tablo boyu buyudukce, harcanan CPU ve I/O artar, sorgu sureleri uzar.



Tablo boyunun buyuyecegini hesaplayan MySQL ve benzeri veritabani yaraticilari, INDEX denen objeleri yaratmislar. Indexi bir tablodaki bir verinin nerede oldugu bilgisini saklayan baska bir dosyadir. Hani kitaplarin basinda hangi konunun hangi sayfada, kitaplarin sonunda hangi kelimenin hangi sayfalarda gectigi yazilirya, iste index odur. Aradiginizi hizlica bulmanizi saglar.



Hizlica bulunca CPU ve I/O harcamasi azalir.



Sonuc: Tablolar uzerinde gereken indexler yok ise buyuyen tablolar fazla CPU ve I/O harcarlar.



Bir SQL sorgusunun performansi: tablo boyuna, tablo uzerindeki indexlere ve kac tablo uzerinde join yapildigina baglidir.



Ek olarak SQL den donen sonuclarin filtrelenmesi "WHERE" sonuclarin daha hizli donmesini saglar ve gereksiz sonuclarin networkte tasinmasini onler.
__________________
Forum Reklam Site Reklam
Alıntı ile Cevapla

  #2 (permalink)   iTrader 
Alt 2007-04-20, 21:22
redbaron - ait Kullanıcı Resmi (Avatar)
Senior Member
 
Üyelik tarihi: May 2006
Mesajlar: 505
Tecrübe Puanı: 2
iTrader: %0/0
redbaron is an unknown quantity at this point
Standart

6,000 kayıtlı bir db vardı sonuçlar hızlı şekilde ekrana basılıyordu fakat
kayıtları 18,000 e çıkarınca bir kayıtları ikişerli listemesi 3-4 sn almaya başladı bende tamam bunları nasıl hızlandırırız diye araştıyordum bu yazın iyi oldu gerçekten +rep

yalnız devamını bekliyoruz
Alıntı ile Cevapla

  #3 (permalink)   iTrader 
Alt 2007-04-20, 21:24
iyinet - ait Kullanıcı Resmi (Avatar)
Paylaşım için teşekkürler
 
Üyelik tarihi: Sep 2002
Mesajlar: 6.055
Blog Entries: 2
Tecrübe Puanı: 3
iTrader: %100/6
iyinet is just really niceiyinet is just really niceiyinet is just really niceiyinet is just really nice
Standart devami

Indexlere SQL sorgulariniza bakarak karar vermelisiniz.

Yani oyle kafadan index yaratilmaz.

Fazla index te zarar verebilir, indexler okuma islemini hizlandirir ama yazma islemini de yavaslatirlar.

Tablolar uzerindeki 'primary key' ler zaten kendiginden indexlidirler. Bunlar icin ek index yaratmaniza gerek yok.

Bu artik biraz fazla detay ve teknik ama anlayabilecekler icin soyluyorum: SQL sorgularinizi "describe" ile inceletip indexlere karar verebilirsiniz.

Ek olarak tecrubeye bagli olarak (benim isim Veritabani uzmanligi) sadece tabloya bakarak basitce (kesin olmamak sarti ile) indexleri tahmin edebilirsiniz.

Ornegin asagidaki tablo icin session_id ve user_id uzerinde index yaratilabilecegini dusunuyorum. session_id uzerinde zaten primary key indexi koyulmus. Ama dogru olan boyle bakip karar vermek degildir. Sorgularin ve Tablolarin incelenmesi esastir.


CREATE TABLE `cpg149_sessions` (
`session_id` varchar(40) NOT NULL default '',
`user_id` int(11) default '0',
`time` int(11) default NULL,
`remember` int(1) default '0',
PRIMARY KEY (`session_id`)
) TYPE=MyISAM COMMENT='Used to store sessions';
__________________
Forum Reklam Site Reklam
Alıntı ile Cevapla

  #4 (permalink)   iTrader 
Alt 2007-04-20, 21:26
iyinet - ait Kullanıcı Resmi (Avatar)
Paylaşım için teşekkürler
 
Üyelik tarihi: Sep 2002
Mesajlar: 6.055
Blog Entries: 2
Tecrübe Puanı: 3
iTrader: %100/6
iyinet is just really niceiyinet is just really niceiyinet is just really niceiyinet is just really nice
Standart devami

"bu indexi her tablo nun basinami koymam gerek?"

Hayir, index tablonun basina yada sonuna konulmaz.

Indexler tablonun kolonlari uzerinde yaratilirlar.

1 tablo uzerinde 1 den fazla index yaratilabilir.

Ornegin su sekildeki bir tablo uzerinde permutasyon olarak 6 adet index yaratilabilir: (7 index mantikli olmaz, sadece bilgi amacli goteriyorum)

CREATE TABLE `cpg149_sessions` (
`session_id` varchar(40) NOT NULL default '',
`user_id` int(11) default '0',
`time` int(11) default NULL,
)

Indexler:
1. session_id
2. user_id
3. time
4. session_id , user_id
5. session_id , time
6. user_id , time
7. session_id , user_id , time
__________________
Forum Reklam Site Reklam
Alıntı ile Cevapla

  #5 (permalink)   iTrader 
Alt 2007-04-20, 21:33
sitemedya - ait Kullanıcı Resmi (Avatar)
Member
 
Üyelik tarihi: Nov 2004
Mesajlar: 362
Tecrübe Puanı: 3
iTrader: %0/0
sitemedya is on a distinguished road
Standart

iyinetin bahsettikleri mysql, mssql ve diğer DB ler için geçerli ortak payda.

iyinet'in bazı eksikleri var. onları da ben tamamlayım.

Yavaşlık konusunda bir çok etken olmasına rağmen en önemli 2 tanesi şudur:

1. field indexleme. Bunu biraz açalım: kitaptaki fihrist gibi düşünebileceğimiz index, DB pointerin hedef recordu daha çabuk bulmasına yarar. Burada önemli olan, mümkün olduğunca unique field(ler) için index yapılması gerektiği. Düşünülenin aksine, bir tabloda çokca index kullanmak yarar değil zarar getirir.

2. Querynin mükemmel olmaması. Bunun için bolca SQL çalışmanız, araştırmanız gerekir. Çok yapılan bir yanlış olarak şunu diyebiliriz: TOP kullanmamak, SELECT içinde gereksiz fieldları kullanmak, çok çağırın sayfaki query içinde LIKE kullanmak, mantık hataları vs..
__________________
asp,php,.net,mssql,mysql,oracle,delphi,c ...
Alıntı ile Cevapla

  #6 (permalink)   iTrader 
Alt 2007-04-20, 21:39
sitemedya - ait Kullanıcı Resmi (Avatar)
Member
 
Üyelik tarihi: Nov 2004
Mesajlar: 362
Tecrübe Puanı: 3
iTrader: %0/0
sitemedya is on a distinguished road
Standart

şunları da dikkat etmek gerekir. Büyük boyutlu DB lerde select yapmak yavaşlar. Var ise, büyük boyutlu table i, 2 veya daha fazla table ye bölmek. Örneğin tek bir öğrenci tablosu yerine; öğrenci, notlar diye iki table a bölüp, aralarında relation yaratmak.

Db için bir insert yapmak, bir update yapmaktan daha fazla iş yapmak ve daha fazla zaman harcanması demektir..
__________________
asp,php,.net,mssql,mysql,oracle,delphi,c ...
Alıntı ile Cevapla

  #7 (permalink)   iTrader 
Alt 2007-04-20, 21:44
iyinet - ait Kullanıcı Resmi (Avatar)
Paylaşım için teşekkürler
 
Üyelik tarihi: Sep 2002
Mesajlar: 6.055
Blog Entries: 2
Tecrübe Puanı: 3
iTrader: %100/6
iyinet is just really niceiyinet is just really niceiyinet is just really niceiyinet is just really nice
Standart devami

MySQL, saldim cayira, mevlam kayira bir veritabani degildir, otomobilinize benzer. Duzenli yagini degistireceksiniz. Zamani geldiginde bakimini yaptiracaksiniz. Kaza oldugunda tamir ettireceksiniz...

Mysql e yapilmasi gereken rutin bakimlar:

1. Tablo optimizasyonu:
Neden gerekir?
- Tablolara veri yazildikca ve silindikce PC nizin hard diski gibi icinde bosluklar olusur, bu bosluklari (fragmentation) kapatmaniz icin optimize (defrag) etmelisiniz. Haftada 1 yapilmasinda fayda vardir.
Komut: OPTIMIZE TABLE <tablo adi>

2. Tablo Analizi:
Neden gerekir?
- Indexlerin tablolar hakkinda dogru bilgiye sahip olmalarini ,gereken istatistiklerin toplanmasini saglar. Haftada bir optimizasyonun ardindan yapilmasinda fayda vardir.
Komut: ANALYZE TABLE <tablo adi>

3. Tablo Hasar Kontrolu:
Neden gerekir?
- Bazen tablolar bozulur. Bu bazen uygulamanizin verdigi hata mesajlari ile farkedilir bazen farkedilmez. Ara sira (ayda 1) tablolari kontrol etmekte fayda vardir. Kontrolde sorunlu cikan tablolari 'Tablo Tamiri' ile tamir etmek gerekir.
Komut: CHECK TABLE <tablo adi>

4. Tablo Tamiri:
Neden gerekir?
- Bozulan tablolari tamir etmek icin kullanilir.
Komut: REPAIR TABLE <tablo adi>
__________________
Forum Reklam Site Reklam
Alıntı ile Cevapla

  #8 (permalink)   iTrader 
Alt 2007-04-20, 22:07
iyinet - ait Kullanıcı Resmi (Avatar)
Paylaşım için teşekkürler
 
Üyelik tarihi: Sep 2002
Mesajlar: 6.055
Blog Entries: 2
Tecrübe Puanı: 3
iTrader: %100/6
iyinet is just really niceiyinet is just really niceiyinet is just really niceiyinet is just really nice
Standart Basit mysql optimizayon onerileri

1. my.cnf mysql configurasyon dosyanizi optimize edin. MySQL CPU Kullanımı my.cnf optimizasyonu

2. data ve binary lerinizi varsa ayri disklere koyun. MySQL i calistiran dosyalar ile MySQL veritabaninin bulundugu dosyalari (tablolar, indexler vb...) ayri disklere koyun. Mumkunse her disk icin ayri I/O kontrol karti kullanin.

3. MySQL ve PHP+Apache yi mumkunse ayri makinalara kurun. Ancak bu makinalarin ayni frame de olma sartini arayin. Birbirleri ile local/dogrudan bagli olmalari sartini arayin.

4. MySQL icin ne kadar RAM o kadar PERFORMANS sloganini akliniza yazin.

5. MySQL icin server turu CPU lar kullanin Xeon dual Core ornegin. CPU sayiniz en az 2 olsun.

6. MySQL inizin rutin bakinlarini yapan scriptler gelistirin.

7. MySQL inizin rutun yedeklerini (backup) alan scriptler gelistirin. Arada bir ornegin ayda 1 kez dizin bazinda yedek alin. Yani tum mysql dizinini MySQL i kapattiktan sonra "taz cvzf tum_mysql.tzg /var/lib/mysql" seklinde yedekleyin.

8. MySQL ayarlariniz ne kadar iyi olursa olsun kotu kodlama en guclu makineleri durdurmaya yeter. Yavas SQL sorgularinizi asagidaki konfigurasyon (my.cnf) ile tesbit edip duzeltin
[mysqld]
long_query_time=3
log-slow-queries=/var/log/mysql/log-slow-queries.log

9. MySQL verinizi arsivleyin. Gerekmeyen bilgileri aktif veritabaninizdan baska veritabaniniza atin. Ornegin iyinet in 5 sene onceki sayac bilgileri iyinetin ana veritabani yerine iyinet_2002 adli veritananinda saklayin. Boylece tablo boyunu kisaltip az erisilen bilgileri baska bir veritabanina atmis olursunuz. Artik gerekmedigini dusundugunuz verileri dikkatlice silin.

10. MySQL cok guclu ve guvenilir bir veritabanidir. Unutmayin siz ona ne kadar iyi bakarsaniz o da size o kadar iyi bakar
__________________
Forum Reklam Site Reklam
Alıntı ile Cevapla

  #9 (permalink)   iTrader 
Alt 2007-04-20, 23:19
WhiteKey - ait Kullanıcı Resmi (Avatar)
Senior Member
 
Üyelik tarihi: Dec 2004
Nerden: istanbul
Mesajlar: 806
Tecrübe Puanı: 3
iTrader: %0/0
WhiteKey is on a distinguished road
Standart

performansı arttırmak için en önemli özelliklerden biri hangi alan için hangi tip bilgi saklamanın uygun olduğunu bilmek..

örnegin standar değerleriniz var
"server", "hosting","reseller","proreseller","proreseller1", "proreseller2","proreseller3","proreseller4","pror eseller5","proreseller6","proreseller7","proresell er8"

bir host firmasının paket isimlerini yukarıdaki şekilde düşünün
bunlara varchar(50) yapanlar bile var varchar yaparak bunlara en az 6 byte ayırmak yerine enum kullanılırsa ? phpmyadmin için
enum seçilip sağına
"server", "hosting","reseller","proreseller","proreseller1", "proreseller2","proreseller3","proreseller4","pror eseller5","proreseller6","proreseller7","proresell er8"

yazarsanız bu hem performansı arttırır hemde boyutu düşürür.

ama en ömemlisi söylendiği gibi kodlama o kötü olduktan sonra db iyi olmuş çok önemli değil 1 x 0 = 0 gibi birşey

enum vb. diğer beri tipleri içinde aşağıdaki adresi kullanabilirsiniz.
http://dev.mysql.com/doc/refman/5.0/en/data-types.html
__________________
[Bir Türk]
Alıntı ile Cevapla

  #10 (permalink)   iTrader 
Alt 2007-04-21, 17:29
iyinet - ait Kullanıcı Resmi (Avatar)
Paylaşım için teşekkürler
 
Üyelik tarihi: Sep 2002
Mesajlar: 6.055
Blog Entries: 2
Tecrübe Puanı: 3
iTrader: %100/6
iyinet is just really niceiyinet is just really niceiyinet is just really niceiyinet is just really nice
Standart devam

MySQL de tum ayarlari yaptiniz, kodlarinizi duzelttiniz, yeterince belleginiz var , indexlerinizi yaratip SQL lerinizi duzelttiniz....
Hersey hizli ve guzel calisiyor.

MySQL i turbo moduna almaya hazirmisiniz?

Aslinda turbo modu diye bir mod yok ama asagidaki islemleri yaptiginizda MySQL cok daha iyi, sayfalarinizin ne kadar hizli acildigini gozlerinizle farkedebileceksiniz.

Buradaki amac disk I/O sunu en aza indirerek, bellekten en fazla faydayi saglamaktir.

Turbo 1.

key_buffer:
key_buffer index keylerinin RAM de yani bellekte saklanmasini saglar. Bir tur index cache i diyebilirsiniz.
Cok yogun calisan bir bilgisayarin en pahali yaptigi islem disk I/O sudur. Cunku en yavas yapilan islem disk I/O sudur. Bellek disk'e gore yuzlerce/binlerce kat daha hizlidir.
MySQL in disk yerine bellek kullanmasini saglayarak, I/O islemlerini en az 100 kat hizlandirmis olursunuz.

key_buffer my.cnf icinde yer alir.

my.cnf
-------

[mysqld]
...
...
key_buffer = 256Mb
...
...

Tavsiye edilen key_buffer degeri Bellek boyunuz / 4 dur.

1Gb lik bir server icin 256Mb iyi bir degerdir.

Ancak toplam indexlerinizin buyuklugu 256Mb dan az ise bu bellegi bosa harcamak anlamina gelir.


Turbo 2.

query_cache

MySQL de yaptiginiz sorgularin sonuclarinin saklandigi cache e verilen addir.
Bu deger normalde my.cnf icinde belirtilmez yani kapalidir.

Ozlellikle sikca kullanilan sorgularin sonuclarinin, cache de saklanmasi, disk I/O sunun azaltacak ve sonuclarin hemen bellekten okunmasini saglayacaktir.

Dikkat edilmesi gereken SQL sorgularinizin buyuk kucuk harf farki olmamasi.

Ornegin:

"Select ad, soyad from kullanici where kullanici_kod = 100"
ile
"SELECT ad, soyad from kullanici WHERE kullanici_kod = 100"

ayni SQL kodu olmasina karsin query cache bu kodlari farkli sanar.

Ayni sorgulari hep ayni buyuk-kucuk harf uyumu ile yazmaniz query cache optimize sekilde kullanmanizi saglar.

query cache my.cnf icinde yer alir.

my.cnf
-------

[mysqld]
...
...
query_cache_type = 1
query_cache_size = 32M
...
...

32Mb baslamak icin cok uygun. Tavsiyem 64Mb in ustune cikmayin.
__________________
Forum Reklam Site Reklam
Alıntı ile Cevapla

Cevapla



Konuyu Toplam 1 Üye okuyor. (0 Kayıtlı üye ve 1 Misafir)
 
Seçenekler
Stil


Benzer Konular
Konu Konuyu Başlatan Forum Cevaplar Son Mesaj
neden.com mathiaxbars Webmaster Genel Konular 0 2007-01-18 04:49
socket '/var/lib/mysql/mysql.sock' (2) Bu hata niyedir ? annudora PHP 7 2006-07-09 23:10
Mysql sunucusu neden çalışmıyor olabilir? BabaPanter PHP 3 2006-03-09 12:01
MySQL 3.23.58 versiyonlu database MySQL 4.1.10 versiyonda çalıştırma.. DamgaNet MySQL Veritabanı SQL 6 2006-01-15 20:36


Bütün Zaman Ayarları WEZ +2 olarak düzenlenmiştir. Şu Anki Saat: 03:32 .


Powered by vBulletin® Version 3.6.10
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Content Relevant URLs by vBSEO 3.1.0

Firefox