PDA

View Full Version : حفظ جامعیت دیتا بیس و سرعت عمل



benyamin_pc
چهارشنبه 03 خرداد 1391, 07:47 صبح
1-ماکسیمم سطر و ستونی که یک جدول میتونه داشته باشه تا اَعمال بر روی دیتا بیس سرعتشون زیاد پائین نیاد چقدر میتونه باشه؟

2-اگه 2 تا request همزمان به یک جدول اشاره کنن و تغییر یکی از درخواست ها بر نتیجه درخواست دیگری موثر باشه بر حسب هزارم ثانیه هم که شده اولویت بندی میشه دیگه؟ مثلا فرض کنین یه جدول داریم که 1 میلیون سطر و 20 ستون داره , و به خاطر کاربرهای بالا , هر ثانیه چیزی حدود 40 هزار درخواست به سمت این جدول شلیک شه و امکان داشته باشه هر کاربر تغییراتی توی این جدول اعمال میکنه , و فرض کنین هر درخواست کاربری به تاثیر درخواست کاربرای دیگه روی این جدول وابسته باشه

3-اگه یه درخواست ارسال شه اما فرض کنین سرعت خیلی پائین باشه به هر حال درخواست از کلاینت یا کامل ارسال میشه یا نمیشه دیگه؟ درخواست مشکل دار که ارسال نمیشه؟ و وقتی که ارسال شد دیگه قطع هم که بشه سرور کل درخواست رو که مثلا اینجا با دیتا بیس کار داشته هرچی هم که زیاد باشه و طول بکشه تا آخر انجام میده دیگه؟ اگه درخواست خیلی سرورو مشغول کنه به هر دلیلی ممکنه مشکل دار انجامش بده و تو دیتا بیس نتایج نصفه یا اشتباه درج کنه؟

benyamin_pc
پنج شنبه 04 خرداد 1391, 10:06 صبح
برای مورد 1 به نظر میاد هیچ محدودیتی جز محدودیت سخت افزاری سرور وجود نداره

eshpilen
پنج شنبه 04 خرداد 1391, 17:56 عصر
1-ماکسیمم سطر و ستونی که یک جدول میتونه داشته باشه تا اَعمال بر روی دیتا بیس سرعتشون زیاد پائین نیاد چقدر میتونه باشه؟از نظر تعداد ستون مسلما با 10 تا و 20 تا و حتی 100 تا و 200 تا هم نباید مشکل خاصی باشی.
شما خیلی بیشتر از این نیاز داری و چرا؟
سطر هم که خودشون حداقل تا چند میلیون بنچمارک میکنن. برای اطلاعات دقیقتر هم باید گوگل کرد و مقاله ها و منابع در این زمینه رو مطالعه کرد.
بعضی افرادی که تجربه دارن میگن اگر یک جدول با چند میلیون رکورد ایندکس های درستی داشته باشه مشکلی نداره ولی اگر ایندکس صحیح نداشته باشه ممکنه سرعت زیاد بیاد پایین.


2-اگه 2 تا request همزمان به یک جدول اشاره کنن و تغییر یکی از درخواست ها بر نتیجه درخواست دیگری موثر باشهیعنی چی دقیقا؟


بر حسب هزارم ثانیه هم که شده اولویت بندی میشه دیگه؟منظورت از اولویت بندی چیه دقیقا؟
طبیعتا ترتیب اجرای درخواستها به زمان ورود اونها به سرور و یکسری پارامترها و نوسان دیگه بستگی داره و کوئری های داخل اونها هم به همین شکل.
البته موقعی که یک کوئری داره یک رکورد رو آپدیت میکنه طبیعتا کوئری دیگری نمیتونه اون سطر رو بخونه، چون قفل میشه. ولی چندتا کوئری میتونن همزمان از جدول بخونن.
اما ترتیب اجرای دقیق تضمین شده نیست. مثلا درخواست A و B رو فرض کنیم که با اختلاف زمانی چند هزارم ثانیه وارد سرور بشن (درخواست A چند هزارم ثانیه زودتر وارد شده)؛ شما نمیتونی روی این حساب کنی که درخواست A حتما سریعتر و قبل از درخواست B اجرا میشه. حتی ممکنه کوئری های مستقل درخواست A و B در بین هم اجرا بشن. مثلا فرضا درخواست A سه تا کوئری a1 و a2 و a3 رو داره و درخواست B دوتا کوئری b1 و b2 رو، اونوقت ممکنه ترتیب اجرای کوئری ها به این شکل بشه: a1 a2 b1 a3 b2
و کلا هر ترتیب دیگری.

باید جزییات مورد شما رو دقیقا بررسی کرد که چرا چه نیازی دارید و چی میخواید و چطور اون رو باید پیاده کرد.


3-اگه یه درخواست ارسال شه اما فرض کنین سرعت خیلی پائین باشه به هر حال درخواست از کلاینت یا کامل ارسال میشه یا نمیشه دیگه؟ درخواست مشکل دار که ارسال نمیشه؟بعید میدونم تا درخواست بصورت کامل دریافت نشده چیزی اجرا بشه! حداقل در سطح PHP چنین چیزی منطقی بنظر نمیاد.


و وقتی که ارسال شد دیگه قطع هم که بشه سرور کل درخواست رو که مثلا اینجا با دیتا بیس کار داشته هرچی هم که زیاد باشه و طول بکشه تا آخر انجام میده دیگه؟اگر کانکشن کلاینت با سرور به هر علتی قطع بشه، این امکان وجود داره که اجرای درخواست و کوئری ها هم ناقص بشن. البته منظور این نیست که یک کوئری ناقص اجرا بشه، منظور اینه که اگر سه تا کوئری باشه ممکنه مثلا دوتاش اجرا بشه و سومی اجرا نشه.
البته راه حل این قضیه خیلی راحته. این تاپیک رو ببینید: توقف یا عدم توقف اجرای برنامه هنگامی که کاربر روی دکمه Stop مرورگر کلیک میکند! (http://barnamenevis.org/showthread.php?341811-%D8%AA%D9%88%D9%82%D9%81-%DB%8C%D8%A7-%D8%B9%D8%AF%D9%85-%D8%AA%D9%88%D9%82%D9%81-%D8%A7%D8%AC%D8%B1%D8%A7%DB%8C-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%87%D9%86%DA%AF%D8%A7%D9%85%DB%8C-%DA%A9%D9%87-%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1-%D8%B1%D9%88%DB%8C-%D8%AF%DA%A9%D9%85%D9%87-Stop-%D9%85%D8%B1%D9%88%D8%B1%DA%AF%D8%B1-%DA%A9%D9%84%DB%8C%DA%A9-%D9%85%DB%8C%DA%A9%D9%86%D8%AF%21)

حالا یه وقتی هست مثلا ممکنه سرور در نیمهء اجرای درخواست Crash کنه یا برقش قطع بشه، بنظرم اون موقع امکانش هست که درخواست و کوئری ها ناقص اجرا بشه. البته برای کوئری ها فکر میکنم اگر از انجین هایی مثل InnoDB و ترنزکشن استفاده کنید این مشکل پیش نمیاد. یعنی تمام کوئری های هر درخواست رو در یک Transaction بذارید. اینطور اگر فرضا وسط کار هر اتفاق غیرمنتظره ای بیفته (قطع برق، کرش کلی و جزیی و غیره)، نهایتا موقعی که اشکال برطرف شد و سرور دوباره راه افتاد، یا اون کوئری ها همه با هم بصورت کامل و دقیق اجرا میشن و یا هیچکدام اجرا نمیشن؛ یعنی این حالت مثل این که دوتاش اجرا شده باشه و یکیش اجرا نشده باشه پیش نمیاد.

البته بنده نمیدونم پس این همه سایت که از انجین MyISAM که ساپورت ترنزکشن نداره استفاده میکنن آیا به مشکلی نمیخورن یا نه. البته یکی از دوستان که تجربه داره میگفت هرچند وقت یک بار جدول های MyISAM رو مجبور میشه Repair کنه، که شاید به دلایل کم و بیش مشابهی باشه.
بهرحال بنظرم برای کاربردهای حساس و مهم احتمالا مجبور هستیم از ترنزکشن استفاده کنیم.
البته بنده این تحلیل ها رو تاجاییکه میدونستم یا از نظر تحلیل تئوریک خودم گفتم. نمیگم 100% مطمئن هستم و تست عملی کردم.


اگه درخواست خیلی سرورو مشغول کنه به هر دلیلی ممکنه مشکل دار انجامش بده و تو دیتا بیس نتایج نصفه یا اشتباه درج کنه؟
بنظر بنده اگر سرور بر اثر ترافیک بیش از حد یا هر علت دیگه ای کرش کنه این امکان وجود داره، مگر اینکه از ترنزکشن استفاده بشه.

benyamin_pc
پنج شنبه 04 خرداد 1391, 22:36 عصر
بنده دقیقا چیزی مثل InnoDB مورد نیازمه , در این مورد مقاله ای صحبتی اگه دارین بفرمائین

eshpilen
جمعه 05 خرداد 1391, 00:28 صبح
با InnoDB (کلا ترنزکشن) تاحالا کار نکردم و اطلاعات بیشتری ندارم. اینا هم که گفتم درحد دانش و تحلیل تئوریک خودم بود.