İyinet'e Hoşgeldiniz!

Türkiye'nin En Eski Webmaster Forum'una Hemen Kayıt Olun!

Kayıt Ol!

sunucuyu yorarmı bu kodlar?

i.ari

0
İyinet Üyesi
Katılım
16 Aralık 2006
Mesajlar
4,437
Reaction score
6
Konum
Ankara
Merhaba arkadaşlar,
bir sistem yazdım sanırım biraz abarttım gibi geldi bu yüzden sunucuyu ilerleyen zamanlarda yoracak kodlar var sanırım. Sizce daha sade nasıl yapabilirim.

Php kod blogu:
PHP:
dbbaglan();
if(is_numeric($_GET['makale'])){ 
$query  = "SELECT baslik,yazi,id FROM makale WHERE id=".mysql_real_escape_string($_GET['makale']); 
}else{ 
header("Location: yok.php"); 
}
$result = mysql_query($query); 
$row = mysql_fetch_array($result, MYSQL_ASSOC);

Daha sade hale getirebilirmiyiz sizce?
 

i.ari

0
İyinet Üyesi
Katılım
16 Aralık 2006
Mesajlar
4,437
Reaction score
6
Konum
Ankara
sunucuya baktıgımda

| 159111 | makalekullanicisi | localhost | makaledbsi | Query | 0 | converting HEAP to MyISAM | select baslik,id from makale ORDER BY RAND() LIMIT 30 |

Bunu gösteriyor. vb. bunun gibi şeyler cıkıyor. Diger dblerde cok az cıkıyor.

Bazende alttakini yazıyor.

| 159997 | makalekullanicisi | localhost | makaledbsi | Sleep | 0 | | lisanssız |
 

atay

0
İyinet Üyesi
Katılım
29 Ekim 2005
Mesajlar
3,592
Reaction score
37
ilk mesajda geçen kod gayet optimize ve yormaması lazım.
 

i.ari

0
İyinet Üyesi
Katılım
16 Aralık 2006
Mesajlar
4,437
Reaction score
6
Konum
Ankara
Sanırım sunucuyu asıl yoran kodlar aşagıda

PHP:
<?php
$sorguex=mysql_query("select baslik,id from makale ORDER BY RAND() LIMIT 30");
 while($sonucex=mysql_fetch_array($sorguex))
 {
$baslikex=$sonucex["baslik"];
$idex=$sonucex["id"];
$url1ex= makeSEO($baslikex);

?>
            <tr>
              <td height='20' bgcolor='#F2F2F2'><img src='img/net.png' width='15' height='15' align='absbottom'> <a title="<?=$baslikex;?>" class='anasayfa' href='<?php echo $url1ex.'-makale'.$idex.'.html';?>'><span class='anasayfa'><?=$baslikex; ?></span></a> </td>
            </tr>
<?php
}
?>
 

FERDIKUCUK

0
İyinet Üyesi
Katılım
27 Ağustos 2007
Mesajlar
117
Reaction score
0
Kod:
dbbaglan(); 
if(is_numeric($_GET['makale'])){  
$query  = "SELECT baslik,yazi,id FROM makale WHERE id=".mysql_real_escape_string($_GET['makale']);  
}else{  
header("Location: yok.php");  
} 
$result = mysql_query($query);  
$row = mysql_fetch_array($result, MYSQL_ASSOC);

Else Kısmındaki Yok.php Dosyasına Yonlendirme Yerine

Kod:
dbbaglan(); 
if(is_numeric($_GET['makale'])){  
$query  = "SELECT baslik,yazi,id FROM makale WHERE id=".mysql_real_escape_string($_GET['makale']);  
}else{  
$id=1;
} 
$result = mysql_query($query);  
$row = mysql_fetch_array($result, MYSQL_ASSOC);

Devamlı Biri Ceksen yada 2 yi Yada 3 u Ne bilim Ama Bir Dosyaya Yonlendirme Bana Garip Gibi Geldi... Tabi Kodun Gayet iyi guzel Gibi..Fakat makale stringini ifle numeric oldugu icin kontrol etmissin bence numeric degilse diye Kontrol ed ?
 

fatal

0
İyinet Üyesi
Katılım
7 Kasım 2007
Mesajlar
495
Reaction score
0
Konum
Gemlik
kodu kısaltmaya gerek yok ki ya, bence gayet hızlı calısması lazım.
 

selim61

0
İyinet Üyesi
Onaylı Üye
Katılım
10 Mayıs 2006
Mesajlar
5,299
Reaction score
11
Konum
<?=selim61?>
Çok fazla veri olan db lerde ORDER BY RAND() baya kasar makineyi, anlık online sayısı fazla ise yer bitirir makineyi, mysql iyice şişer.Bunun yerine hite göre tarihe göre yada id ye göre sıralamaya bak
 

i.ari

0
İyinet Üyesi
Katılım
16 Aralık 2006
Mesajlar
4,437
Reaction score
6
Konum
Ankara
örnegin rand(1, 500) yapıp bunun üzerine +30 yapıp

DESC limit $rand,$rand+30 şeklinde yapsam sizce nasıl olur?

Hız konusunda düzeltirmi?
 

selim61

0
İyinet Üyesi
Onaylı Üye
Katılım
10 Mayıs 2006
Mesajlar
5,299
Reaction score
11
Konum
<?=selim61?>
örnegin rand(1, 500) yapıp bunun üzerine +30 yapıp
DESC limit $rand,$rand+30 şeklinde yapsam sizce nasıl olur?
Hız konusunda düzeltirmi?
evet düzelir tabiki, önce kayıt sayısını(mysql_num_rows rand(1, $kayıtsayisi)) alırsan dahada iyi olur.
 

FrontPage

0
İyinet Üyesi
Katılım
31 Aralık 2003
Mesajlar
475
Reaction score
0
Konum
Yozgat
Büyük tablolarda RND fonksiyonu sistemi çok fazla yorar. Bunun yerine kayıt sayısına göre rastgele bir kayıt numarası almak tabiki işlemi yüzlerce kez arttıracaktır.
Başka bir alternatif düşünecek olursak RND sonuçlarını saatlik yaptırıp çıkan sonuçları depolayabilirsin. geçici bir tablo oluşturup onun içerisine sadece saatlik primary key değerinde olan alandaki verileri eklersen saatte 1 kez kasacak daha sonra kasmayacaktır. Bu işlemi arka tarafta bir cron (zamanlanmış görev) olarak çalıştırırsan yavaşlama hissedilmez bile.
 

Angelo

0
İyinet Üyesi
Katılım
13 Aralık 2004
Mesajlar
9,603
Reaction score
111
Konum
AZ
my.cnf'unu optimize edebilirsin ayrıca, timeout sürelerini ve cacheleri. Bu konuda iyinet'in yazdığı topik var mysql optimizasyon diye.
 

KaleSoft

0
İyinet Üyesi
Katılım
17 Kasım 2006
Mesajlar
170
Reaction score
0
query cache i kullan bunlar cok hafif kodlar hic bir sorun ıkarmaamsı gerek, ben 90GB veri tabani ile caliştim mysql gayet iyi, sadece index lerini iyi olustur.

eger daha fazla optimiz edecem diyorsan EXPLAIN ile sorgularini incele.
dahada ileri gitmek istersen pear in timer nesnesi ve db clasi ile sorgularin surelerini olcebilirsn, 0.5 saniyenin ustund kalanlari gozden gecir.

EXPLAIN SELECT baslik,yazi,id FROM makale WHERE id=5

ayrica:
if(is_numeric($_GET['makale'])){
$query = "SELECT baslik,yazi,id FROM makale WHERE id=".mysql_real_escape_string($_GET['makale']);

bunun yerine
$id=intval($_GET['makale']);
$query = "SELECT baslik,yazi,id FROM makale WHERE id=".$id;

if ( mysql_num_rows == 1) sunlari yap
else bunlari yap

diyebilirsin.
 

SeVeRaL

0
İyinet Üyesi
Katılım
31 Ocak 2003
Mesajlar
336
Reaction score
1
Konum
İstanbul
Ya hiç gerek yok explain falan.. Eğer makale sorgusunda sorgu sonucu yalnızca bir metin gelecekse; sql sorgusunun sonuna da "limit 1" koy bitsin gitsin. Çok kasmaya gerek yok. Milyonlarca row (satır) ile çalışıyorsa böyle çok ufak şeylere önem vermelisin.

Örneğin yukarda milyonlarla ifade ettiğim gibi çok büyük mysql veritabanları ve yüksek kullanıcı yoğunluğu ile uğraşan sunucularda değişkenlere değer verirken " veya ' kullanımının bile önemi artmakta. Ama senin öyle bir durumun olmayacağını düşünerek diyorum ki; hiç kasma ;)
 

iyinet

Root
Admin
Hosting Firması
Katılım
2 Eylül 2002
Mesajlar
5,030
Reaction score
73
Konum
Sakarya
sunucuya baktıgımda



Bunu gösteriyor. vb. bunun gibi şeyler cıkıyor. Diger dblerde cok az cıkıyor.

Bazende alttakini yazıyor.

Buradaki sorun tablonun HEAP yapısında olması. Birlikte MyIsam a çevirebiliriz.
phpMyAdmin den tablo yapısını (structure) buraya yapıştırırmısın.
Bir de MySQL versiyonun nedir, 3.23.7 versiyonundan önce böyle bir bug vardı.
Son olarak, InnoDB kullanıyormusun?
 

i.ari

0
İyinet Üyesi
Katılım
16 Aralık 2006
Mesajlar
4,437
Reaction score
6
Konum
Ankara
iyinet aşagıdaki gibi. Hazır bir db yapısıydı. AUTO_INCREMENT hiç bir şey yok. Sadece aşagıdaki gibi

zaman
baslik,
yazi

mysql versiyonu 4.1.20
 

iyinet

Root
Admin
Hosting Firması
Katılım
2 Eylül 2002
Mesajlar
5,030
Reaction score
73
Konum
Sakarya
iyinet aşagıdaki gibi. Hazır bir db yapısıydı. AUTO_INCREMENT hiç bir şey yok. Sadece aşagıdaki gibi

zaman
baslik,
yazi

mysql versiyonu 4.1.20

Tablo yapısını rica ediyorum, alan adları bir işime yaramaz.
phpMyAdmin varsa structure export yapabilirsin.
Bunun gibi:

CREATE TABLE `avatar` (
`avatarid` smallint(5) unsigned NOT lisanssız auto_increment,
`title` varchar(100) NOT lisanssız default '',
`minimumposts` int(10) unsigned NOT lisanssız default '0',
`avatarpath` varchar(100) NOT lisanssız default '',
`imagecategoryid` smallint(5) unsigned NOT lisanssız default '0',
`displayorder` smallint(5) unsigned NOT lisanssız default '1',
PRIMARY KEY (`avatarid`)
) TYPE=MyISAM;
 

i.ari

0
İyinet Üyesi
Katılım
16 Aralık 2006
Mesajlar
4,437
Reaction score
6
Konum
Ankara
CREATE TABLE `makale` (
`zaman` varchar(50) NOT lisanssız default '',
`makale` text NOT lisanssız default '',
`baslik` varchar(100) NOT lisanssız default '',
KEY `kelime` (`baslik`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
 

iyinet

Root
Admin
Hosting Firması
Katılım
2 Eylül 2002
Mesajlar
5,030
Reaction score
73
Konum
Sakarya
CREATE TABLE `makale` (
`zaman` varchar(50) NOT lisanssız default '',
`makale` text NOT lisanssız default '',
`baslik` varchar(100) NOT lisanssız default '',
KEY `kelime` (`baslik`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

Tablo benim düşündüğüm gibi HEAP çıkmadı, anladığım kadarı sorgu esnasında yaratılan geçici HEAP tabloyu MyISAM a çeviriyor MySQL.
Bu başlık altında RAND konusunda öneri sunan arkadaşların yorumlarını takip etmeni öneririm.
Koddan rand() ı çıkartım onun yerine PHP ile random sayı üretip rastgele kayıt al.
Arkadaşların da dediği gibi tablo büyükse RAND() yük bindirir MySQL e.
 

Türkiye’nin ilk webmaster forum sitesi iyinet.com'da forum üyeleri tarafından yapılan tüm paylaşımlardan; Türk Ceza Kanunu’nun 20. Maddesinin, 5651 Sayılı Kanununun 4. maddesinin 2. fıkrasına göre, paylaşım yapan üyeler sorumludur.

Üst