PDA

View Full Version : مشکل سرعت لود سایت (بهینه سازی کوئریها)



eimanpaladin
جمعه 04 بهمن 1392, 00:26 صبح
با سلام و خسته نباشید
من یه سایتی دارم که از پایه خودم نوشتم من تو این سایت یه جدول آگهی دارم
خوب الان تعداد رکوردهاش به 4000 رسیده و واقعا سرعت لود سایت پائین اومده

الیته به روش oop و ساخت یافته نوشتم ترکیبی هست

یکی از دوستان گفت که از روش lazy loading استفاده کنم و من هم گشتم چیزی گیرم نیومد شما راهی به نظرتون نمیرسه دوستان که فشار زیادی که سمت سرور هستش کم کنم

ممنون میشم کمک کنید کارم گیره و بد به مشکل خوردم

eimanpaladin
جمعه 04 بهمن 1392, 00:54 صبح
در ضمن برای این پروژه نیاز به مشاور داریم که دیگه از این مشکلات پیش نیاد (در مورد هزینه هاش هم مشکلی نیست )
از دوستانی که تمایل دارند لطفا شماره موبایلشو نو پ.خ کنن ممنون

plague
جمعه 04 بهمن 1392, 09:31 صبح
اگه سرعت با افزوده شدن رکورد به دیتابیس اومده پایین مشکل همون کوئری هات هستن
ربطی به شی گرا یا ساخت یافته بودنم کدنویسی و لیزی لودینگ نداره

البته 4000 عدد ناچیزیه و و معمولا بدترین کوئری هایی که من دیدم هم روی چند 10 هزار رکورد به بالا اثر خودشون رو نشون میدن ممکنه مشکلتون از جای دیگه باشه

eimanpaladin
جمعه 04 بهمن 1392, 09:48 صبح
خیلی ممنون
من کوئری هام یه select خیلی ساده هستن و کوئریم ایجوری هست

select * from agahi where agahi.status = 1 order by id desc
در ضمن من تعداد رکوردم در جدول آگهی 4000 هستش و تعداد رکورد در تمامی جداول به 12000 میرسه مشکل از اینجا نیست
به نظرتون vps بگیرم بهتر نمیشه

masiha68
جمعه 04 بهمن 1392, 09:53 صبح
خیلی ممنون
من کوئری هام یه select خیلی ساده هستن و کوئریم ایجوری هست

select * from agahi where agahi.status = 1 order by id desc

این که پدر سرور رو در میاره :)) ... حداقل یه لمیت واسش تعریف کن . اگه 4000 تا کوئری رو یه جا فراخوانی کنی حجم بالایی از اطلاعات استخراج میشه و سرور زیادی در گیری این مسئله مشه .
سعی کن توی هر بار 10-15 تا کوئری رو نشون بدی و اونم از اخرین کوئری های وارد شده توی دیتابیس ....

eimanpaladin
جمعه 04 بهمن 1392, 10:04 صبح
میشه یه توضیحی بدید نمونه اونو بنویسد بدونم چجوری میگید
از روش pageing و صفحه بندی اسفاده کنم خوبه

$lvl = "public";
@$page = mysql_real_escape_string($_GET['page']);
if(empty($page)){
$page = 1;
}
$start = ($page - 1) * $setting['paged_item'];

if ((isset($_GET['id'])))
{
$catid =mysql_real_escape_string(htmlspecialchars($_GET['id']))+0;
$querypage = mysql_query("SELECT * FROM nafis_product WHERE nafis_product.cat ='$catid' and nafis_product.lvl='$lvl' ORDER BY id ASC LIMIT $start, ".$setting['paged_item']."")
or die(mysql_error());
$total = mysql_query("SELECT * FROM nafis_product WHERE nafis_product.cat ='$catid' and nafis_product.lvl='$lvl' ")
or die(mysql_error());
}else{
$querypage = mysql_query("SELECT * FROM nafis_product WHERE lvl='$lvl' ORDER BY id ASC LIMIT $start, ".$setting['paged_item']."")
or die(mysql_error());
$total = mysql_query("SELECT * FROM nafis_product WHERE lvl='$lvl' ")
or die(mysql_error());

}
while($row = mysql_fetch_array($querypage)){


و بعد از تگ html


$count = mysql_num_rows($total);
if($count - $setting['paged_item'] > 0){
$paged_total = ceil($count / $setting['paged_item']);
$paged_last = $paged_total;
$paged_middle = $page + 4;
$paged_start = $paged_middle - 4;

if($page > 1){
$paged_result = '<div class="paged-link"><a href="vg.php?page=1" title="صفحه نخست">نخست</a></div>'."\n";
}
else{
$paged_result = '<div class="paged-link-off">نخست</div>'."\n";
}
if($page > 1){
$paged_perv = $page - 1;
$paged_result .= '<div class="paged-link"><a href="vg.php?page='.$paged_perv.'" title="صفحه قبلي">قبلي</a></div>'."\n";
}
else{
$paged_result .= '<div class="paged-link-off">قبلي</div>'."\n";
}
for ($i=$paged_start-2; $i<=$paged_middle; $i++){
if ($i > 0 && $i <= $paged_last){
if($i == $page){
$paged_result .= '<div class="paged-link-selected"><a href="vg.php?page='.$i.'" title="صفحه '.$i.'">'.$i.'</a></div>'."\n";
}
else{
$paged_result .= '<div class="paged-link"><a href="vg.php?page='.$i.'" title="صفحه '.$i.'">'.$i.'</a></div>'."\n";
}
}
}

if($page <= $paged_last - 1){
$paged_next = $page + 1;
$paged_result .= '<div class="paged-link"><a href="vg.php?page='.$paged_next.'" title="صفحه بعدي">بعدي</a></div>'."\n";
}
else{
$paged_result .= '<div class="paged-link-off">بعدي</div>'."\n";
}

if($page <= $paged_last - 1){
$paged_result .= '<div class="paged-link"><a href="vg.php?page='.$paged_last.'" title="صفحه آخر">آخر</a></div>'."\n";
}
else{
$paged_result .= '<div class="paged-link-off">آخر</div>'."\n";
}
$paged_result .= '<div class="paged-link-info">&raquo; صفحه: '.$page.' از '.$paged_total.'</div>'."\n";
echo $paged_result;
}
else{
echo 'صفحه اي وجود ندارد!'."\n";
}
?>

masiha68
جمعه 04 بهمن 1392, 10:21 صبح
دقیقا
پیج بندی مشکلتو حل می کنه ....
الته مسائل دیگه ای هم هست مثل نحوه ی طراحی دیتابیس ، یا تعداد کانکشن زیاد و نبستن اونا ... ولی فک کنم همین پیجینگ رو اجرا کنی حل میشه

eimanpaladin
جمعه 04 بهمن 1392, 10:24 صبح
ببخشید این روش رو چند تا رکورد جواب میده

masiha68
جمعه 04 بهمن 1392, 10:31 صبح
همه چی بستگی به سرور و شما داره .... بعضی کوئری ها رو نمی شه محدود کرد ، مثلا دسته بندی های مطالب که همگی فراخوانی می شن ... ولی در مورد تعداد مطالب درج شده میشه این محدودیت رو گذاشت . من همیشه عددی بین 15-10 می زارم چون می دونم اگه مثلا 20 تا باشه و همزمان 20 نفر توی سایت انلاین باشن سرور می خوابه (20*20=400)... ببینین کدوم کوئری هاتون زیاد فراخوانی میشن اونا رو بیشتر محدود کنین و در مورد کوئری هایی که زیاد فراخوانی نمی شن و معمولا هم تغییر نمی کنن سعی کنین پیج رو کش کنین و الخ ... این یه بحث پیچیده ای و اکثرا هم با تجربه بدست میاد . و در اخر اگه سرورتون قوی باشه این کوئری رو روی 20 تا به بالا هم می تونین اجرا کنین ولی من بازم همون 10-15 تا رو توصیه می کنم
مانا باشید

afee1990
جمعه 04 بهمن 1392, 17:30 عصر
سعی کن از caching هم استفاده کنی

eimanpaladin
شنبه 05 بهمن 1392, 07:59 صبح
بحث cashing مگه نباید روی سرور کانفیگ بشه ؟؟

peachcms
شنبه 05 بهمن 1392, 09:07 صبح
اگه از فایل کش استفاده کنید نخیر اما اگه از memcache بخواهید استفاده کنید باید سرور مجازی یا اختصاصی داشته باشید

eimanpaladin
شنبه 05 بهمن 1392, 09:35 صبح
این فابل کش رو مثالش رو دارید بگید ممنون

afee1990
شنبه 05 بهمن 1392, 09:48 صبح
لینک زیرو ببین :
http://www.catswhocode.com/blog/how-to-create-a-simple-and-efficient-php-cache