PDA

View Full Version : مشکل کوئری و سرعت لود



wallfa
یک شنبه 17 بهمن 1395, 00:49 صبح
با سلام و عرض ادب

من یک سیستم خبری نوشتم که حدودا 5000 هزار تایی آی پی بازدید میرسه کلا سایت قفل میکنه . چه راه حل هایی هست که من بتونم سیستم بهینه کنم .
ناگفته نمونه بر پایه فریم ورک لاراول هستش .

plague
یک شنبه 17 بهمن 1395, 14:05 عصر
لاراول دیباگر رو نصب کن
https://github.com/barryvdh/laravel-debugbar
وقتی صفحه اجرا میشه کوئری هات رو بهت خروجی میده با زمان اجراشون رو
ببین کدومشون طول میکشه یا کدومشون اضافیه و میشه بجای چندین درخواست با یک درخواست دریافتشون کرد
اصلاحشون کن
اگه از رابطه ها استفاده میکنی حتما از EAGER LOADING استفاده کن تا تعداد کانکشن های دیتابیس بیاد پایین

Unique
دوشنبه 18 بهمن 1395, 00:20 صبح
البته که باید query ها را بررسی کنی و بهینه سازی روی پایگاه داده و query را به درستی انجام بدی ! اما به نظرم باید سعی کنی اطلاعات را cache کنی و هر بار نری از پایگاه بخونی.

رضا قربانی
سه شنبه 19 بهمن 1395, 10:22 صبح
البته که باید query ها را بررسی کنی و بهینه سازی روی پایگاه داده و query را به درستی انجام بدی ! اما به نظرم باید سعی کنی اطلاعات را cache کنی و هر بار نری از پایگاه بخونی.

سلام برادر . خوبی
آقا من یه کد sql دارم که بهینه نیست و در هاست جواب نمیده چون چند تا مقدار میفرسته . امکانش هست راهنماییم کنید :


$sql="select `group_sub` from `tbl_amlak` where
`group_sub` <> (select `group_sub` from `tbl_amlak` where `group_sub` like '%ویلا%' ) and
`group_sub` <> (select `group_sub` from `tbl_amlak` where `group_sub` like '%آپارتمان%') and
`group_sub` <> (select `group_sub` from `tbl_amlak` where `group_sub` like '%زمین%')
GROUP BY `group_sub` DESC ";

میگم اگر فیلد group_sub مخالف ویلا و آپارتمان و زمین بود بیا نمایش بده

Unique
جمعه 22 بهمن 1395, 15:23 عصر
group_sub را کاربر خودش پر میکنه ؟! که از like استفاده میکنی !؟ اگه اینطوریه که اصلا بهینه نیست و بهتره توی tbl_amlak یک فیلد tinyint بگذاری مثلا group_type و برای ویلا و آپارتمان و زمین ... بک متناظر گذاری و مثلا اگه متناظر اینها ۱ و ۲ و ۳ باشه بنویسی :
select group_sub from tbl_amlak where group_type not in (1,2,3) group by group_sub

اگه مشکل داری برای ویرایش کد و فرم ها و این چیزا به نظرم یک اسکریپت بنویس و اول کل جدول را معادل group_type بکن و بعدش trigger بگذار روی حدول تا بر اساس group_sub بیاد مقدار group_type را ست کنه ! البته میتونی روی یک جدول دیگه trigger بگذاری و اسکریپت راننویسی و از این جدول توی جدیده Insert کنی و تمام.

اگه هم خیلی دلت میخواد با همون فیلد بهین هتر تشخیص بدی که قطعا مثل حالت بالایی نمیشه ! میتونی یک function بنویسی که مقدار group_sub را بگیره و بعدش با SUBSTR بیای چک کنی و مقدار برگشتی از Function را توی اسکریپت فیلتر کنی اینطوری :
select group_sub from tbl_amlak where func_filter(group_sub) not in (1,2,3) group by group_sub

توی این حالت هم بر اساس SUBSTR تابع func_filter میاد یک عدد متناظر بر میگردونه.

رضا قربانی
یک شنبه 24 بهمن 1395, 13:32 عصر
group_sub را کاربر خودش پر میکنه ؟! که از like استفاده میکنی !؟

بله کاربر خودش پر میکنه به همین خاطر حتما باید از like استفاده کنم . باید بهش بگم توی فیلد جستجو کن و اگر ویلا و آپارتمان و زمین داخل فیلد بود بهم نمایش نده .:ناراحت:
روش بالا مقدور نیست .

جالب اینجاست که در لوکال کد من کار میکنه و درست جواب میگیرم ولی در هاست نه :/

دقیقا برعکس جستجوعه . در جستجو میگیم اگر اینا بود بیا نمایش بده . ما در اینجا میگیم اگر ویلا و آپارتمان و زمین بود نمایش نده !!!

رضا قربانی
یک شنبه 24 بهمن 1395, 14:03 عصر
حتی اینم نوشتم روی لوکال داره جواب میده اما تو هاست آپ میکنم نه !!! :متفکر:



$sql="select `group_sub` from `tbl_amlak` where

`group_sub` like '%ویلا%' = (select `group_sub` from `tbl_amlak` where `group_sub` like '%ویلا%' ) and

`group_sub` like '%آپارتمان%' = (select `group_sub` from `tbl_amlak` where `group_sub` like '%آپارتمان%') and

`group_sub` like '%زمین%' = (select `group_sub` from `tbl_amlak` where `group_sub` like '%زمین%')

GROUP BY `group_sub` DESC ";

Unique
دوشنبه 25 بهمن 1395, 14:08 عصر
من سه تا راه حل گفتم ! مورد سوم که استفاده از function بود از روش شما خیلی خیلی خیلی بهینه تره و سرعتش بیشتره. گرچخ راه حل دوم هم به نظرم کاملا شدنیه ! یعنی با یک trigger گذاشتن توی هر Insert خودت مقدار group_type را ست میکنی و توی کد هم دست نمیبری ! مابقی هم یکبار از یک جدول به جدول جدید insert into new table select from old table با trigger میگیری و تمام ! سرعت query شما مثل سرعت نور میشه عزیز !

رضا قربانی
سه شنبه 26 بهمن 1395, 12:12 عصر
مورد سوم که استفاده از function بود از روش شما خیلی خیلی خیلی بهینه تره و سرعتش بیشتره

من تا حالا با مورد سوم شما کار نکردم . امکانش هست با مقادیر بالا برام بنویسید ؟ :ناراحت:

رضا قربانی
شنبه 07 اسفند 1395, 12:09 عصر
....up... گیر کردم

Unique
شنبه 07 اسفند 1395, 23:47 عصر
خدایی خیلی سرم شلوغه اما توی چند روز آینده توی وبلاگم حتما پست میگذارم وتوضیح میدم چطور از function ها توی mysql استفاده کنیم.

رضا قربانی
یک شنبه 08 اسفند 1395, 20:26 عصر
خدایی خیلی سرم شلوغه اما توی چند روز آینده توی وبلاگم حتما پست میگذارم وتوضیح میدم چطور از function ها توی mysql استفاده کنیم.

SELECT `group_sub` FROM `tbl_amlak` WHERE
(`group_sub` NOT LIKE '%ویلا%' ) AND
(`group_sub` NOT LIKE '%آپارتمان%') AND
(`group_sub` NOT LIKE '%زمین%')
GROUP BY `group_sub` DESC

:اشتباه:
به همین راحتی درست شد .

Unique
یک شنبه 08 اسفند 1395, 23:03 عصر
ولی اصلا بهینه نیست ! روش function را گذاشتم خبر میدم تست کنی.