• 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
بهینه کردن دستورات php و sql
#1
سلام
من امدم از این دستور sql استفاده کردم. و مشتریم بهم گفت که فشار زیادی به سرورش میاد:
کد پی‌اچ‌پی:
SELECT `backlink`,`ip`,`zamanFROM `jadval1JOIN `jadval2ON `jadval1`.ip=`jadval2`.meta_value WHERE zaman BETWEEN :az AND :ta  ORDER BY `idDESC LIMIT :mo, :limit 
بعد امدم کارهای زیر را انجام دادم:

1) به جای JOIN از RIGHT JOIN استفاده کردم.
2) برای زمان قبلاً تاریخ فارسی را در دیتابیس ثبت میکردم و بعد درش جستجو میکردم. امدم با تابع time() تاریخ را ثبت کردم. و از کد زیر استفاده کردم که تاریخ را تبدیل کنم و بعد در جدول تاریخ جستجو کنم:
کد پی‌اچ‌پی:
$azz explode('/'$az);
 
$az jalali_to_gregorian($azz[0] , $azz[1] ,$azz[2] ,'-');
  
$az implode('-'$az);
$azstrtotime($az); 
3) به جای LIMIT :mo, :limit از LIMIT :limit OFFSET :mo استفاده کردم.
ولی مشکل هنوز حل نشده.
طرف بهم گفته که در یکی از جداولش یک میلیون رکورد ثبت شده داره.
فکر میکنم این دستور هم که برای چاپ مقادیر داخل جدول هست هم بهینه نیست جاش چی رو پیشنهاد میدید؟
کد پی‌اچ‌پی:
$sth->execute();
 foreach(
$sth as $rowso){
    echo 
$rowso['ip'];

اگه پیشهادات دگه ای هم دارید بگید ممنونم.
  پاسخ
تشکر شده توسط :
#2
فهمیدم مشکل از JOIN هست ولی نمیدونم باید به جای JOIN از چی استفاده کنم که بهینه تر باشه؟!
  پاسخ
تشکر شده توسط :
#3
سلام،
ساختار جداولت به چه صورت هست؟ کلیدها رو رعایت کردی؟
با یک میلیون رکورد نباید اینجوری بشه.
غایب
  پاسخ
تشکر شده توسط : ravand
#4
ساختار جداول:
کد پی‌اچ‌پی:
CREATE TABLE `jadval1` (
  `
idint(11NOT NULL,
  `
backlinktext COLLATE utf8_persian_ci,
  `
ipvarchar(50COLLATE utf8_persian_ci NOT NULL,
  `
zamanint(20NOT NULL
ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_persian_ci;


ALTER TABLE `jadval1`
  
ADD PRIMARY KEY (`id`);
 
ALTER TABLE `jadval1`
  
MODIFY `idint(11NOT NULL AUTO_INCREMENTAUTO_INCREMENT=57394



کد پی‌اچ‌پی:
CREATE TABLE `jadval2` (
  `
meta_idbigint(20UNSIGNED NOT NULL,
  `
post_idbigint(20UNSIGNED NOT NULL DEFAULT '0',
  `
meta_keyvarchar(255COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `
meta_valuelongtext COLLATE utf8mb4_unicode_ci
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

ALTER TABLE `jadval2`
  
ADD PRIMARY KEY (`meta_id`),
  
ADD KEY `post_id` (`post_id`),
  
ADD KEY `meta_key` (`meta_key`(191));

ALTER TABLE `jadval2`
  
MODIFY `meta_idbigint(20UNSIGNED NOT NULL AUTO_INCREMENTAUTO_INCREMENT=1630529
جدول jadval1 را خودم ساختم ولی جدول jadval2 مال یکی از افزونه های وردپرس هست. حالا به نظرتون مشکل چیه؟
  پاسخ
تشکر شده توسط :
#5
جدول دوم را امدم به روش دیگر ساختم. با این حال فرقی نکرد!! و بازم مدت زمان جستجو خیلی طول میکشه!
کد پی‌اچ‌پی:
CREATE TABLE `jadval2` (
  `
meta_idint(20NOT NULL,
  `
post_idint(20NOT NULL,
  `
meta_keyvarchar(255COLLATE utf8_persian_ci NOT NULL,
  `
meta_valuetext COLLATE utf8_persian_ci NOT NULL
ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_persian_ci;

ALTER TABLE `jadval2`
  
ADD PRIMARY KEY (`meta_id`);
  
 
ALTER TABLE `jadval2`
  
MODIFY `meta_idint(20NOT NULL AUTO_INCREMENTAUTO_INCREMENT=1611108
  پاسخ
تشکر شده توسط :
#6
کلیدهای خارجی بین ۲ تا جدول رو رعایت نکردی.
بعدشم اینکه تا جایی که من میدونم order by روی جدول‌های بزرگ بازدهی پایینی داره، چون اول میاد مثلا ۲ میلیون رکورد رو مرتب میکنه، بعد limitها رو اعمال میکنه.
ببین بدون order by چه جوری میشه.
غایب
  پاسخ
تشکر شده توسط : ravand
#7
(۱۳۹۵ آذر ۱۳, ۰۴:۴۱ ب.ظ)Alaa نوشته: کلیدهای خارجی بین ۲ تا جدول رو رعایت نکردی.
بعدشم اینکه تا جایی که من میدونم order by روی جدول‌های بزرگ بازدهی پایینی داره، چون اول میاد مثلا ۲ میلیون رکورد رو مرتب میکنه، بعد limitها رو اعمال میکنه.
ببین بدون order by چه جوری میشه.
منظورت از کلید های خارجی چیه؟ میشه درستش کنی؟
ممنونم
  پاسخ
تشکر شده توسط :
#8
کد:
`jadval1`.ip=`jadval2`.meta_value WHERE zaman
در جدول اول آی پی و زمان رو ایندکس بذار
در جدول دوم meta_value رو ایندکس بذار
وبلاگ rezaonline.net/blog
سفارش برنامه نویسی reza.biz
Php , mysql , postgresql , redis , Yii and ... Cool
  پاسخ
تشکر شده توسط : Alaa ravand
#9
(۱۳۹۵ آذر ۱۳, ۰۷:۴۶ ب.ظ)Reza نوشته:
کد:
`jadval1`.ip=`jadval2`.meta_value WHERE zaman
در جدول اول آی پی و زمان رو ایندکس بذار
در جدول دوم meta_value رو ایندکس بذار

روبروی فیلد meta_value در phpmyadmin وقتی روی index کلیک که میکنم این پیغام میاد:
#1170 - BLOB/TEXT column 'meta_value' used in key specification without a key length
رفتم فیلد را از نوع text کنم. دیدم حالا دکمه index خاموش میشه!!!
اگه من از نوع text کنم به اطلاعات که آسیبی نمیرسه؟
حالا که index خاموش شده باید چکار کرد؟!
اینم جدول:
کد پی‌اچ‌پی:
CREATE TABLE `jadval2` (
  `
meta_idbigint(20UNSIGNED NOT NULL,
  `
post_idbigint(20UNSIGNED NOT NULL DEFAULT '0',
  `
meta_keyvarchar(255COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `
meta_valuelongtext COLLATE utf8mb4_unicode_ci
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

ALTER TABLE `jadval2`
  
ADD PRIMARY KEY (`meta_id`),
  
ADD KEY `post_id` (`post_id`),
  
ADD KEY `meta_key` (`meta_key`(191));

ALTER TABLE `jadval2`
  
MODIFY `meta_idbigint(20UNSIGNED NOT NULL AUTO_INCREMENTAUTO_INCREMENT=1630529
  پاسخ
تشکر شده توسط :
#10
ظاهرا که index اضافه شده، phpMyadmin توی جزئیات جدول بری یه لینک هست Indexes. اون رو بزنی نشون میده چه ایندکس‌هایی ثبت شده.
غایب
  پاسخ
تشکر شده توسط :


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان