PDA

View Full Version : گفتگو: بهترین روش جستجو در SQL



abolfazl-z
یک شنبه 15 اردیبهشت 1392, 19:04 عصر
سلام دوستان :لبخندساده:
دوستان به نظر شما بهترین روش جستجو در SQL چه می تواند باشد!

بزارید واضح تر بیان کنم :

برای مثال ما 50000 هزار تا رکورد داریم که شامل عنوان - محتوا می باشد.
خوب حالا می می خواهیم یک برنامه ای بنویسیم که شامل الگوریتم پیچیده ای هست. اگر ما تمام این رکورد ها را در آرایه ها بریزیم و سپس عملیات را روی آن ها انجام دهیم بهتر هست و یا نه هر دفعه بیاییم یک رکود را fetch کنیم ؟:متفکر:

و روشی بهتر وجود دارد ؟

abolfazl-z
دوشنبه 16 اردیبهشت 1392, 20:04 عصر
دوستان کسی تجربه ای ندارد ؟؟؟؟

abolfazl-z
دوشنبه 16 اردیبهشت 1392, 20:27 عصر
:اشتباه: :ناراحت:

eshpilen
دوشنبه 16 اردیبهشت 1392, 21:10 عصر
والا تاجاییکه بزرگانی که به بیماری وسواس دچار نبودن گفتن، شما اول ببینید برنامه نویسی با کدوم روش خواناتر و راحتتر و سریعتره. کدوم کدنویسی کمتری میخواد.
اگر در عمل مشکل پرفورمنس نداشت پس بذار کامپیوتر فدای راحتی و آسایش شما بشه، نه اینکه شما نگران زیاد شدن کار کامپیوتر باشی و برای آسایش بیشترش کار کنی!!
اصولا ما کامپیوترها رو برای همین درست کردیم.

این اصل کلی منطقیه. حالا در مواردی ممکنه بعضی جزییات و استثناهایی به دلایلی باشه.

navid3d_69
دوشنبه 16 اردیبهشت 1392, 21:47 عصر
یعنی یک آرایه به اندازه 50000 ؟ خب این ممکن مشکل ایجاد کنه البته کاری که باید انجام بشه هم مهمه ولی فکر کنم تک تک بهتر باشه

abolfazl-z
دوشنبه 16 اردیبهشت 1392, 21:53 عصر
والا تاجاییکه بزرگانی که به بیماری وسواس دچار نبودن گفتن، شما اول ببینید برنامه نویسی با کدوم روش خواناتر و راحتتر و سریعتره. کدوم کدنویسی کمتری میخواد.
اگر در عمل مشکل پرفورمنس نداشت پس بذار کامپیوتر فدای راحتی و آسایش شما بشه، نه اینکه شما نگران زیاد شدن کار کامپیوتر باشی و برای آسایش بیشترش کار کنی!!
اصولا ما کامپیوترها رو برای همین درست کردیم.

این اصل کلی منطقیه. حالا در مواردی ممکنه بعضی جزییات و استثناهایی به دلایلی باشه.

هیچی نفهمیدم :لبخند: میشه یکم راهنمایی کنید؟



یعنی یک آرایه به اندازه 50000 ؟ خب این ممکن مشکل ایجاد کنه البته کاری که باید انجام بشه هم مهمه ولی فکر کنم تک تک بهتر باشه

آیا طبق گفته دوستمان تک تک بهتر هست ؟

eshpilen
دوشنبه 16 اردیبهشت 1392, 22:10 عصر
یعنی یک آرایه به اندازه 50000 ؟ خب این ممکن مشکل ایجاد کنه البته کاری که باید انجام بشه هم مهمه ولی فکر کنم تک تک بهتر باشه
50 هزار رکورد؟ خب هررکورد چه متوسط حجمی داره؟
البته شما شاید بتونید فقط بخشی از رکورد و مواردی که بر اساس اونا جستجو میکنید رو توی آرایه بریزید؛ اینطور حجمش میتونه خیلی کمتر بشه.
بعد مثلا اگر رکورد خاصی رو پیدا کردید میتونید با سرعت بیشتری با استفاده از id که توی آرایه هست بقیهء اطلاعات اون رو از دیتابیس بیرون بکشید.
تازه درصورت لزوم از روشهای ترکیبی هم میشه استفاده کرد. مثلا اگر عملیات مورد نظر اجازه بده، رکوردها رو هزارتا هزارتا واکشی کرده توی آرایه ریخته و پردازش کرده و بعد حافظه رو آزاد کرده و اطلاعات رکوردهای جدید رو جایگزین قبلی ها کنیم.

50 هزار رکورد رو بخواید دونه به دونه و چندین بار از دیتابیس fetch کنید هم احتمالش زیاده که کندی قابل توجهی ایجاد کنه و مصرف منابعش هم روی هم رفته شاید بیشتر هم بشه. حالا یه مموری کمتر مصرف میشه ولی درکل برنامه کلی عملیات سنگین تر رو در زمان طولانی تری داره انجام میده و توی اون مدت منابع اختصاص داده شده به هر درخواست هم آزاد نمیشن.

eshpilen
دوشنبه 16 اردیبهشت 1392, 22:19 عصر
کلا روی بهینه سازی ایده زیاد میشه داد، ولی تا وقتی در عمل نیاز واقعی وجود نداره معقول نیست که آدم وقت و انرژیش رو صرفش کنه و برنامه رو پیچیده تر و حجیم تر کنه.
بهینه سازی برای حل مشکله، نه دلسوزی یا رعایت عدالت درمورد کامپیوتر!!
بنابراین وقتی در عمل مشکلی وجود نداره نیازی به راه حل هم نیست.
خیلی از مشکلات هم صرفا تصوری و خیالی میتونن باشن و افراد بدون اینکه عملا تست یا تجربه کنن فکر میکنن یه چیزی هست، ولی یا نیست یا اونقدری که فکر میکردن نیست.
بزرگان گفتن که تشخیص اینکه برنامه کجاها واقعا مشکل پرفورمنس داره حتی برای برنامه نویسان با تجربه هم دشوار و بعضی وقتا غیرممکنه. و اینکه این رو خیلی وقتا باید تنها در عمل دید و درموردش تصمیم گرفت.

حالا منم تجربهء عملی خاصی ندارم اما این مطالب رو خونده بودم و استنباط و نظر خودم رو در این مورد براتون میگم.

یه وقت شما فکر میکنی مصرف حافظهء زیاد سرور رو کند میکنه، ولی رایانه ها و سیستم عاملها و برنامه ها امروزه اینقدر پیچیده هستن و الگوریتم های بهینه سازی خودشون رو هم دارن که پیشبینی این موارد براحتی میتونه غلط از آب دربیاد.
یعنی میبینی در عمل مموری رو بیشتر بکار میگرفتی و از پردازش و زمان کم میکردی در کل پرفورمنس بهتر میشد.
از قبل هیچ معلوم نیست!
بنابراین یا باید هر روش رو دقیقا تست و بنچمارک کنی یا در عمل مشکل پیش بیاد و با تجربه بفهمی.
تازه به مشخصات سخت افزاری سرور هم بستگی داره. به خیلی پارامترها درکل.
یه وقت میبینی سرور همینطوریش بطور عادی مثلا نهایت به 200 تا درخواست همزمان میتونه جواب بده بعلت Bottleneck های دیگری که داره. حالا شما اومدی مثلا محاسبه کردی که اگر هر درخواست فلان قدر حافظه مصرف کنه، میشه تا 500 درخواست همزمان رو جواب داد، ولی اگر مصرف حافظه رو کم کنی تا 2000 درخواست!! پس این محاسبهء شما اصولا برای اون سرور هیچ تاثیری نداشته، چون سرور نهایت 200 درخواست رو جواب میده. تازه ممکنه بخاطر اینکه از حافظه کم کردی و بر پردازش و منابع دیگه اضافه کردی بجاش، از اون ظرفیت 200 درخواست هم در عمل کم بشه.

abolfazl-z
دوشنبه 16 اردیبهشت 1392, 22:26 عصر
50 هزار رکورد؟ خب هررکورد چه متوسط حجمی داره؟
البته شما شاید بتونید فقط بخشی از رکورد و مواردی که بر اساس اونا جستجو میکنید رو توی آرایه بریزید؛ اینطور حجمش میتونه خیلی کمتر بشه.
بعد مثلا اگر رکورد خاصی رو پیدا کردید میتونید با سرعت بیشتری با استفاده از id که توی آرایه هست بقیهء اطلاعات اون رو از دیتابیس بیرون بکشید.
تازه درصورت لزوم از روشهای ترکیبی هم میشه استفاده کرد. مثلا اگر عملیات مورد نظر اجازه بده، رکوردها رو هزارتا هزارتا واکشی کرده توی آرایه ریخته و پردازش کرده و بعد حافظه رو آزاد کرده و اطلاعات رکوردهای جدید رو جایگزین قبلی ها کنیم.

50 هزار رکورد رو بخواید دونه به دونه و چندین بار از دیتابیس fetch کنید هم احتمالش زیاده که کندی قابل توجهی ایجاد کنه و مصرف منابعش هم روی هم رفته شاید بیشتر هم بشه. حالا یه مموری کمتر مصرف میشه ولی درکل برنامه کلی عملیات سنگین تر رو در زمان طولانی تری داره انجام میده و توی اون مدت منابع اختصاص داده شده به هر درخواست هم آزاد نمیشن.

واقعا ممنون.

خوب یک سوالی دیگر پیش میاید که اونم این هست من 50000 هزار پست دارم و می خواهم بر اساس الگوریتم خاصی(تک تک فیلد ها جستجو بشه وو ... مقادیری خارج بشه و اون مقادیر در دیتابیس جدید وارد فیلد جدیدی بشن..) خوب اگر من اینکار را پشت سر هم انجام بدهم 100 درصد با خطای Fatal error: Maximum execution time of 30 seconds exceeded in روبرو خواهم شد و همچنین طبق گفته شما از منابع خیلی استفاده میشه !

آیا همان روشی که شما گفته اید (1000 تا 1000 تا) انجام دهیم بهتر هست و یا روشی دیگری وجود دارد؟

eshpilen
سه شنبه 17 اردیبهشت 1392, 00:12 صبح
من بودم همه 50 هزارتا رو میریختم توی آرایه و کارم رو میکردم. بعد اگر میدیدم مشکلی داره اونوقت میرفتم دنبال بهینه سازی.
بخصوص اگر این عملیات در دسترسی عموم نیست و مثلا فقط ادمین یا مدیرها بعضی وقتا میخوان انجام بدن.

MMSHFE
سه شنبه 17 اردیبهشت 1392, 08:26 صبح
یک موردی که باید دقت کنید اینه که بهرحال برای ریختن در آرایه هم یکبار باید همه مقادیر یکی یکی fetch بشن. پس فرقی توی سرعت و... نخواهد داشت. ضمناً ریختن مقادیر توی آرایه وقتی خوبه که حتماً بعد از اینکار با mysql_free_result حافظه اختصاص داده شده به result تولیدشده توسط MySQL رو آزاد کنید وگرنه دو کپی از یک محتوا توی RAM خواهید داشت (یکی بصورت Resource و یکی دیگه بصورت Array). درمورد زمان اجرا هم با ;(set_time_limit(0 میتونید جلوی بروز خطای Maximum Execution Time Exceeded رو بگیرین.

eshpilen
سه شنبه 17 اردیبهشت 1392, 22:46 عصر
یک موردی که باید دقت کنید اینه که بهرحال برای ریختن در آرایه هم یکبار باید همه مقادیر یکی یکی fetch بشن. پس فرقی توی سرعت و... نخواهد داشت.
بله حق با شماست.
ولی بنده اینطور بنظرم رسید که یکسری عملیات مختلف میخواد روی رکوردها انجام بشه و چند بار تکرار بشن به شکلهای مختلف.
اگر سناریو این بود خب اینکه بخوایم چند بار کوئری های مختلفی رو انجام بدیم و/یا تمام رکوردها رو دوباره از ابتدا fetch کنیم بنظرم پردازش و زمان بیشتری مصرف میکنه نسبت به اینکه رکوردها تنها یک بار واکشی بشن با یک کوئری و بعد توی RAM هرچند بار و هر عملیات ترکیبی و پیچیده ای رو که میخوایم روشون انجام بدیم.
البته شاید هم اینطور نباشه!

اون جملهء «می خواهیم یک برنامه ای بنویسیم که شامل الگوریتم پیچیده ای هست» یک مقدار گمراه کننده بود.
یعنی آدم اینطور بنظرش میرسه که ممکنه نیاز باشه به هر رکورد بیش از یک بار رجوع و روش پردازش انجام بشه.
یعنی الگوریتم/عملیاتی که میخوایم روی رکوردها انجام بدیم یه چیزی خطی و یک مرحله ای نباشه.
مثلا شاید دسترسی به رکوردها ترتیبی نباشه اصلا، یا حتی تعداد دسترسی به هر رکورد هم برابر نباشه.
ترکیب عبارت الگوریتم پیچیده و خود سوال این ذهنیت رو به ذهن بنده آورد.

بقول شما اگر صرفا هر رکوردی یک بار و بصورت ترتیبی قراره خونده بشه که دیگه فرقی نمیکنه!