Öncelikle herkes'e selam,
Ultima-Strike'de baktım ki fazla mysql hakkında bilgiye sahip olan kişi yok ve bende böyle bir döküman hazırlayayım sizlere sunayım dedim. Affınıza sığınarak söylüyorum bilen değil - Detaylı şekilde bilen yada anlatan yok - yanlış anlaşılmalar olmasın. Seriler şeklinde sizlere birazda olsun mysql database sistemini tanıtmaya çalışacağım. Ufak tefek yazım hataları olursa kusura bakmayınız.
Tanıtım 1'e başlayalım.
Şimdi ilk önce ufak tefek detaylara girelim ufak dediğime bakmayın makinanizi ek yükten kurtaracak ufak ipuçları. Bunları yaptıkdan sonra eminim çok daha iyi performans aldığınızı göreceksiniz.
1. olarak yanlış sorgu şekli olan " * " kavramı
Sorgu şekli 1;
Varsayalım ki mysql den playerların isimlerini çekip listeleceğiz. Fakat databasemizde " charName,charKarma,charFame,charKill,charUid,charGold,insertDate "
gibi uzayan sürüsüne field var aşşağıdaki sorgu bizim yapmak istediğimiz iş için çok yanlış bir sorgu bakalım ve görelim:
"select * from playerList" -> bu sorgu bize " charName,charKarma,charFame,charKill,charUid,charGold,insertDate " bu fieldların hepsini verecekdir
ama biz hangisini kullanacağız ? Sadece charName yanına birde button ekleticeksek charUid gerekli bunun için doğru olan sorgu şöyle olmalıdır ;
"select charName,charUid from playerList" bu şekilde performans artmış olucak ve gereksiz yükden makinanız kurtulmuş olacakdır. Diyeceksiniz ki nasıl ?
Şöyle bir düşünün 40 player listeliyorsunuz ve hepsinin 3kb lık dataları çekiliyor bu da her çekildiğinde Ram üzerine 120 kb veri çekilmesi anlamına
geliyor, peki biz sadece 2 field almış olsaydık ? Bu boyut 10 kb a kadar düşmüş olacakdı.
2. olarak num_rows kullanımının hataları ;
"select id from playerList" böyle bir sorguyu num_rows ile toplamak yerine şöyle yapabiliriz;
"select count(id) as sayi from playerList" yapıp fetch_assoc (db.row.0.sayi anlamına gelmekte) yaparak mysql'i yine bir yükten kurtarmış olup 2 kere
saymasını engellemiş oluyoruz.
3. olarak insert kullanımındaki hata ;
Genelde gördüğüm sorgular üzerine konuşayım insert yapan kişiler şu şekilde işlem yapiyor;
"insert into playerList values(NULL,'<name>','<karma>','<fame>','<kills>','<uid>','<gold>','<serv.time>')"
Gibi devam eden ve field sayısı kadar datayi sistem'e insert etmeye çalışan saçma bir insert şeklini kullanıyor fakat, MysQL in bize sunduğu güzel şeyleri kullanmak aklına gelmiyor örneğin bir Tarihi <serv.time> olarak kaydetmek yerine mysql'den Timestamp yada Datetime kullanıp Current_Date seçeneğini işaretlemiş olsaydı bu field'a insert yapmak zorunda kalmazdı yada... id field'i otomatik gelen sisteme tanıtmış olsa bile NULL olarak kaydetmek yerine kaydetmemeyi tercih etseydi tekrar mysql bunu algılamak için yorulmazdı. Bunun için nasıl bi sorgu yazılmalı ?
"insert into playerList (charName,charKarma,charFame,charKill,charUid,charGold) values ('<name>','<karma>','<fame>','<kills>','<uid>','<gold>')"
Böyle bir sorgu yükü daha azalmış olacak ve hangi field'ı nerede kaydetmek ve nasıl kaydetmek istediğinizi ayarlayabilecekdiniz. Ben mesela şöyle kaydetmek istiyorum ;
"insert into playerList (charGold,charKarma,charFame,charName,charKill,charUid) values ('<gold>''<karma>','<fame>','<name>','<kills>','<uid>')"
Böyle yapınca fieldlara kaydedilen verilerin yeri değişecek mi ? Tabiki hayır.
Bu bahsettiklerim sadece ufak ve genelde gördüğüm scriptlerde yapılan hatalardan 1-2 tanesidir.
Gelelim gerekli olan ve uğraş verici olan şeylere;
Bir tablomuz var ve adamın sürekli artan bi puanı var? Sürekli adam birilerini kesiyor ve her kesdiğinde insert yapiliyor (Gereksiz update yapmak çözümdü
fakat siz böyle yazdınız neyse..). Bunu toplamak için sürekli While For gibi döngülere giriyorsunuz, gereksiz!
select sum(playerPoint) as point from playerPoints where player = '<uid>'
Bu sorgu ne işe yarar? uid ini verdiğiniz player'ın tüm puanlarını toplar ve size point olarak geri döner bunu şu şekilde geri alabilirsiniz Sphere'de "<db.row.0.point>" bu şekilde size gereken çıktıyı vericekdir. Sizin while ile yada for ile topladığınız kullanıcı puanı ne kadarda uğraş verici dimi ?
İlerleyen derslerde olacak anlatımlar :
* Gruop Kullanımı
* Group Concat kullanımı
* Left join kullanımları (2 tabloya aynı anda eş değer bağlantılar yapmak örneğin playerList ile playerPoits'i birbirine bağlamak)
* Left kullanımı
* Mid kullanımı
5 konudan sonra diğer anlatımda da ondan sonraki anlatımlar yer alacakdır.
Problem yaşayanlar döküman altına yazarlarsa sorunlarını, çözümü en kısa sürede elinizde olacakdır. Kolay gelsin.
Dip Not : Bu döküman hakkı Leon Jade (Yunus Emre Kütük)'ye aitdir. Başka bir portal yada bir sitede izinsiz,site ismi ve yazarı belirtilmeden kullanıldığı taktirde site hakkında İnternet Hakları ve yasalar gereği işlem yapılacağını tarafımca belirtirim.
Teşekkürler Leon Jade.
0 Kullanıcı
Sunucular 3 saat önce
Sunucular 1 gün önce
Ultima Online 1 hafta önce
Ultima Online 1 hafta önce
Counter-Strike 1 hafta önce
Sunucular 3 hafta önce
Sunucular 3 hafta önce
Ultima Online 4 hafta önce
Sunucular 1 ay önce
Sohbet & Geyik 1 ay önce
Sunucular 1 ay önce
Ultima Online 1 ay önce
Ultima Online 2 ay önce
2024-10-31 22:47
2024-10-14 17:45
2024-09-26 14:21
2024-07-08 22:50
2024-07-08 22:34
2024-06-19 22:05
2024-06-01 02:19
2024-05-31 21:17
[b]İlerleyen zaman içerisinde Sphere-Mysql yerine hiç bilmeyenler için mysql dökümanı eklenecekdir.[/b]
yap ya sql öğrenme aşkıyla yanıp tutuşuyom burada :D
:)
Sallıyo hepsi yalan :P
[b]Onlarla ilgili dökümanlar mevcut diye ordan başladım. Eğer gerekliyse o tarz bi anlatım onuda yaparız :)[/b]
abi keşke daha temelden başlasaydın :) ben yine anlamadım :D:D