PDA

View Full Version : حرفه ای: دو سوال در مورد MySQL



M Hidden
پنج شنبه 08 خرداد 1393, 14:45 عصر
درود.

دوستان عزیز دو سوال در مورد MySQL داشتم.

اول از همه می خواستم سوال کنم توی pdo مثل دستور mysql نیازی نیست بعد از هر کوئری، اتصال رو ببندیم؟

و سوال دوم! همچنان من از pdo استفاده می کنم.

یک کوئری دارم که بسته به foreach تعداد کاراکتر های این کوئری ابدیت بیشتر خواهد شد. از WHEN توی این کوئری استفاده می کنم. خواستم بدونم که تعداد کاراکتر این کوئری زیاد بشه (مثلا بشه 1 میلیون کاراکتر) آیا مشکلی پیش نمیاره توی سرعت و اون کوئری؟

M Hidden
دوشنبه 12 خرداد 1393, 02:50 صبح
سلامی مجدد خدمت دوستان.

کسی نبود کمکی به ما بکنه؟

ahmad156
دوشنبه 12 خرداد 1393, 08:21 صبح
سلام دوست عزیز
اتصال شما تا زمان چرخه حیات متغیری که Connection رو بهش نسبت دادی قابل دسترس هست و بعد از چرخه حیات متغیر، خود PHP خود به خود اتصال رو از بین میبره و در این زمان شما میتونین با نسبت دادن مقدار NULL به متغیر Connection تون رو از بین ببرین.البته اگه نوع اتصالتون persistent باشه شما باید خودتون Connection رو از بین ببرین و PHP این کار رو خود به خود انجام نمیده.اینجا (http://php.net/manual/en/pdo.connections.php)رو ببین.
تو حلقه while که باید 1 میلیون بار کوئری انجام بشه بهتره که Connecton تون رو نبندین و نیاز هم نیست که Persistent باشه چون تا زمان اجرای حلقه اتصال قابل دسترس خواهد بود.

M Hidden
دوشنبه 12 خرداد 1393, 13:20 عصر
سلام مجدد. بله فرمایش شما صحیح است. اما خوب به طور کلی منظور من این بود که مثل تابع mysql بعد از هر کوئری نیازی نیست که ارتباط رو قطع کنیم و برای یک کوئری جدید دوباره کانکشن برقرار کنیم؟ چون توی mysql باعث میشد فشار زیادی به سرور میاد می خوام بدونم که توی pdo هم این گونه هست؟ البته من یک جا خوندم که از php 5.3 به بعد، بعد از هر اتصال دیگه دائم میشه و دفعه بعد بخواید مجدد connect کنید از قبلی استفاده میشه. اینه که برای pdo هم این جوره و دیگه نیازی نیستش که بعد از هر کوئری ببندیم connection رو؟
و در مورد سوال دوم اینجا قرار نیست 1 میلیون کوئری انجام بشه! اگه بخوایم یک میلیون کوئری انجام بدیم و هر کدوم رو بر فرض 0.03 ثانیه بگیریم میشه چیزی حدود 30000 ثانیه که برابر است با 8 ساعت و نیم :متعجب: اینجا قرار هست این یک میلیون کوئری رو ما با WHEN و IN در MySQL به یک کوئری تبدیل کنیم که طول کاراکتر این کوئری حدودا میشه 1 میلیون کاراکتر! منظورم اینجاست که ظرری نداره و به خوبی انجام میشه؟
البته برای این بستن connection بعد از هر کوئری من برای pdo از کلاس آماده ی سایت http://medoo.in استفاده می کنم که اینجا اشاره ای نداشته بعد از هر کوئری connection رو null کنیم یا خیر!
تشکر.

MMSHFE
دوشنبه 12 خرداد 1393, 14:10 عصر
توی همون توابع mysql هم نیازی به این کار نبود. وقتی توی مستندات میگه اتصال دائم هست و با هربار اتصال جدید، اگه قبلیه هنوز جواب بده، همونو برمیگردونه، این موضوع شامل اتصال به MySQL با هر روشی (نسخه منسوخ _mysql و MySQLi و PDO و...) خواهد شد. اجرای کوئری طولانی طبیعتاً پردازش و مصرف حافظه رو به شدت میبره بالا. بهتره اصول بهینه سازی کوئریها رو رعایت کنید.

M Hidden
دوشنبه 12 خرداد 1393, 14:54 عصر
توی همون توابع mysql هم نیازی به این کار نبود. وقتی توی مستندات میگه اتصال دائم هست و با هربار اتصال جدید، اگه قبلیه هنوز جواب بده، همونو برمیگردونه، این موضوع شامل اتصال به MySQL با هر روشی (نسخه منسوخ _mysql و MySQLi و PDO و...) خواهد شد. اجرای کوئری طولانی طبیعتاً پردازش و مصرف حافظه رو به شدت میبره بالا. بهتره اصول بهینه سازی کوئریها رو رعایت کنید.
بله حرف شما صحیح هستش.
تشکر بابت پاسختون.

چون فیلدی که قرار هست آبدیت بشه به صورت آرایه هستش(یعنی دیتا ها با , از هم جدا شدند که موقع دریافت با explode به آرایه تبدیل میشه) راهی جز اینکه یا برای هر کدوم یک کوئری اجرا بشه و یا اینکه برای همه یدونه کوئری اجرا بشه نیست! البته شاید باشه که ما بی خبر هستیم از این موضوع! اما خوب چون قرار هست پروژه روی سروری با 32 گیگ رم قرار بگیره فکر نکنم آنچنان باعث دردسر در رم بشیم! البته من ایندکس گذاری ها رو هم رعایت کردم و همچنین ساختار تیبل رو.

سپاس.

MMSHFE
دوشنبه 12 خرداد 1393, 15:21 عصر
خوب اینکه مقادیر رو توی یک فیلد گذاشتین و با کاما از هم جدا شدن نشون میده که خیلی هم اصول نرمالسازی رعایت نشده. بهینگی فقط محدود به ایندکس گذاری نیست. سرور با رم 32 گیگابایت هم در ترافیک بالا دچار مشکل میشه. بنابراین خیالتون نباید راحت باشه.

M Hidden
دوشنبه 12 خرداد 1393, 15:30 عصر
آیا پیشنهاد شما این هستش که هر یک از این اطلاعاتی که با کاما جدا می شوند، تقسیم بندی شوند و در فیلد و یا تیبل های مختلفی قرار بگیرند؟ من احساس می کنم با این کار حجم دیتابیس بالاتر خواهد رفت! همچنین تعداد تیبل ها و فیلد ها هم بیشتر خواهد شد. آیا این مسئله مشکلی پیش نمیاره؟

MMSHFE
دوشنبه 12 خرداد 1393, 15:31 عصر
حجم فایل آنچنان تغییر نمیکنه و اگه زیاد بشه هم بهرحال دیسک ارزونتر از رم هست. مهم اینه که برنامه شما سریعتر کار کنه و به سرور فشار کمتری بیاره. دلیلی نداره حالا که 32 گیگابایت رم دارین، اون رو تا سقفش پر کنید.

M Hidden
دوشنبه 12 خرداد 1393, 15:39 عصر
حجم فایل آنچنان تغییر نمیکنه و اگه زیاد بشه هم بهرحال دیسک ارزونتر از رم هست. مهم اینه که برنامه شما سریعتر کار کنه و به سرور فشار کمتری بیاره. دلیلی نداره حالا که 32 گیگابایت رم دارین، اون رو تا سقفش پر کنید.
بله درست هستش و حق با شماست.

پس من مجدد دیتابیس رو بازسازی می کنم و دیتابیس رو نرمال سازی خواهم کرد.

باز هم ممنون بابت راهنمایی هاتون.