sunucuyu yorarmı bu kodlar?

0
Onaylı Üye
Üye
Katılım
16 Aralık 2006
Mesajlar
4,437
Tepki puanı
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?
 
0
Onaylı Üye
Üye
Katılım
16 Aralık 2006
Mesajlar
4,437
Tepki puanı
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 |
 
0
Onaylı Üye
Üye
Katılım
29 Ekim 2005
Mesajlar
3,592
Tepki puanı
36
ilk mesajda geçen kod gayet optimize ve yormaması lazım.
 
0
Onaylı Üye
Üye
Katılım
16 Aralık 2006
Mesajlar
4,437
Tepki puanı
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
}
?>
 
0
Onaylı Üye
Üye
Katılım
26 Ağustos 2007
Mesajlar
117
Tepki puanı
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 ?
 
0
Onaylı Üye
Üye
Katılım
6 Kasım 2007
Mesajlar
495
Tepki puanı
0
Konum
Gemlik
kodu kısaltmaya gerek yok ki ya, bence gayet hızlı calısması lazım.
 
0
Onaylı Üye
Üye
Katılım
10 Mayıs 2006
Mesajlar
5,299
Tepki puanı
13
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
 
0
Onaylı Üye
Üye
Katılım
16 Aralık 2006
Mesajlar
4,437
Tepki puanı
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?
 
0
Onaylı Üye
Üye
Katılım
10 Mayıs 2006
Mesajlar
5,299
Tepki puanı
13
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.
 
0
Onaylı Üye
Üye
Katılım
30 Aralık 2003
Mesajlar
475
Tepki puanı
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.
 
0
Onaylı Üye
Üye
Katılım
12 Aralık 2004
Mesajlar
9,603
Tepki puanı
106
Konum
AZ
my.cnf'unu optimize edebilirsin ayrıca, timeout sürelerini ve cacheleri. Bu konuda iyinet'in yazdığı topik var mysql optimizasyon diye.
 
0
Onaylı Üye
Üye
Katılım
17 Kasım 2006
Mesajlar
170
Tepki puanı
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.
 
0
Onaylı Üye
Üye
Katılım
16 Aralık 2006
Mesajlar
4,437
Tepki puanı
6
Konum
Ankara
select ile EXPLAIN arasındaki fark nedir?
 
X
xfreex
Misafir
artık bu kodda yorarsa serverı bizim serverın çökmesi lazım :D
 
0
Onaylı Üye
Üye
Katılım
31 Ocak 2003
Mesajlar
336
Tepki puanı
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 ;)
 
Root
Root
İyinet Ekibi
Onaylı Üye
Katılım
2 Eylül 2002
Mesajlar
5,043
Tepki puanı
79
Konum
SEO
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?
 
0
Onaylı Üye
Üye
Katılım
16 Aralık 2006
Mesajlar
4,437
Tepki puanı
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
 
Root
Root
İyinet Ekibi
Onaylı Üye
Katılım
2 Eylül 2002
Mesajlar
5,043
Tepki puanı
79
Konum
SEO
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;
 
0
Onaylı Üye
Üye
Katılım
16 Aralık 2006
Mesajlar
4,437
Tepki puanı
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;
 
Root
Root
İyinet Ekibi
Onaylı Üye
Katılım
2 Eylül 2002
Mesajlar
5,043
Tepki puanı
79
Konum
SEO
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.
 
Geri
Üst