PDA

View Full Version : کوئری از بانک با هزاران رکورد



omid_student
شنبه 09 خرداد 1394, 19:20 عصر
سلام
من بانکی دارم ینی قراره داشته باشم که ممکنه کاربرای زیادی توش عضو شن در حد چند صد هزار
select کردن از این بانک حتما سرعتش پایین میاد و اگه ایندکس هم کنم که معایب خودشو داره
خواستم رکورد ها رو دسته بندی کنم و براساس حروف الفبا جدول بسازم و رکورد های حروف رو در جدول مرتبط ذخیره کنم
گفتم از شما هم بپرسم به نظر شما چکاری انجام بدم؟

reza_alie
شنبه 09 خرداد 1394, 19:29 عصر
ببین دوست عزیز
اگه ساختار دیتابیس رو درست یعنی به صورت علمی طراحی کنی فکر نمی کنم مشکلی پیش بیاد شما نباید به فکر الان باشی چون احتمال داره در سالهای آینده اگه سیستم رو بد طراحی کنی با مشکل مواجه بشی

H:Shojaei
شنبه 09 خرداد 1394, 19:37 عصر
شما سیستم رو همینطوری پیادش کن چند صد هزار که چیزیم نیست تعداد رکورد هات بالا که شد و محسوس شد بعدا یه متخصص دیتابیس میگیرید...

fatima-php
شنبه 09 خرداد 1394, 19:38 عصر
چند صد هزار، اصلاً عدد بزرگی نیست. با خیال راحت index کنید.

under22
شنبه 09 خرداد 1394, 19:55 عصر
چند هزار تا اصلا چیزی برای mysql نیست خیالت راحت تا 100 هزار تا هم من تست کردم .
اینو در نظر بگیر سایت پر ترافیک سرور خوبم میخاد

-سیّد-
یک شنبه 10 خرداد 1394, 09:34 صبح
همونطور که دوستان گفتن این عددا برای MySql اصلاً عددی نیست. حتی صدها میلیون رکورد هم برای MySql چیزی نیست، که البته توی این مقیاس بستگی به خیلی چیزا داره. مثلاً اگه هاردتون SSD باشه خوب سرعت به مراتب بالاتر می‌ره (اگه هارد معمولی باشه هم خیلی خوب عمل می‌کنه، مگر توی ترافیک خیلی بالا). همچنین بستگی به Engine تون و نوع ستونی که روش index می‌ذارید داره (مثلاً int خیلی سبک‌تر از varchar هست). یا مثلاً مقدار RAM سیستم و تنظیمات cache توی MySql.

فقط برای این که بدونید، بگم که ما بیش از دویست میلیون رکورد رو توی MySql تست گرفتیم و جواب عالی ازش گرفتیم. یعنی select کردن ۲-۳ تا رکورد به صورت random در حدود ۲۰-۳۰ میلی‌ثانیه جواب می‌داد.

با توجه به این که خیلی پارامتر اینجا دخیل هست، برای این که مطمئن بشید جواب می‌گیرید یا نه، یا باید از یه متخصص پایگاه داده مشورت بگیرید (یعنی case خاص خودتون رو بهش بگید، و اگه لازمه طراحی رو بدید به اون)، یا می‌تونید تست کنید. چند صد هزار تا رکورد بسازید و در جدولتون بریزید، و بعد روش تست کنید.

imohammad
یک شنبه 10 خرداد 1394, 09:52 صبح
با فریمورک لاراول کار کن
با متد chunk میتونی فشار روی دیتابیس رو کاهش بدی

User::chunk(200, function($users)
{
foreach ($users as $user)
{
//
}
});
الان کد بالا هر دفعه 200 تا کوئری برمیگردونه

fatima-php
یک شنبه 10 خرداد 1394, 12:29 عصر
خود PHP هم متد array_chunk داره. ضمناً این کار فقط بار روی CPU و مصرف RAM رو کم میکنه و برعکس فشار روی دیتابس (و درنتیجه دیسک) رو زیاد میکنه چون مدام باید 200 تا 200 تا، با OFFSET و LIMIT کوئریهای جداگانه به دیتابیس بزنه.

imohammad
یک شنبه 10 خرداد 1394, 12:59 عصر
خود PHP هم متد array_chunk داره. ضمناً این کار فقط بار روی CPU و مصرف RAM رو کم میکنه و برعکس فشار روی دیتابس (و درنتیجه دیسک) رو زیاد میکنه چون مدام باید 200 تا 200 تا، با OFFSET و LIMIT کوئریهای جداگانه به دیتابیس بزنه.
از ارسال یه درخواست سنگین به دیتابیس در لحظه جلوگیری میکنه و فشار کمتری میاد
تصور کنید حالا 10000 کاربر یک جا یک کوئری یک میلیون رکوردی رو ارسال کنن!

arta.nasiri
یک شنبه 10 خرداد 1394, 23:03 عصر
تصور کنید حالا 10000 کاربر یک جا یک کوئری یک میلیون رکوردی رو ارسال کنن!

معمولا سایتهای بزرگی مثل فیسبوک یا امثال این سایت هم همچین کاری با سرورهای خودشون نمیکنن!! مگه اینکه تو شرایط خیلی خاص باشن.

شما به سوال استارتر توجه نکردید. ایشون نمیخوان یه میلیون رکورد رو فچ کنن بلکه میخوان از بین مثلا یک میلیون رکورد select داشته باشن. منم با نظر بقیه دوستان موافقم با طراحی درست و انتخاب صحیح سرور و ایندکس گذاری صحیح مشکلی براشون پیش نمیاد. البته اگه تعداد رکوردهاتون از یه حدی بیشتر بشه و تعداد درخواستها بیش از اندازه زیاد بشه مسلماْ یه سرور جوابگوی نیازهای شما نخواهد بود و باید از روشهایی نظیر این (http://en.wikipedia.org/wiki/MySQL_Cluster) استفاده کنید.

fatima-php
دوشنبه 11 خرداد 1394, 09:05 صبح
از ارسال یه درخواست سنگین به دیتابیس در لحظه جلوگیری میکنه و فشار کمتری میاد
تصور کنید حالا 10000 کاربر یک جا یک کوئری یک میلیون رکوردی رو ارسال کنن!

کدوم سایتی رو دیدین که کاربرانش یکمرتبه یک میلیون رکورد رو بخوان fetch کنن و توی حافظه باهاش کار داشته باشن؟ اگه سایتی اینطوری طراحی شده باشه قطعاً مشکل در طراحی داره. با رعایت مسائلی مثل Pagination و... میشه براحتی این مسائل رو حل کرد. بهرحال فکر نمیکنم مشکل استارتر توی پردازش باشه و باتوجه به کند بودن نسبتاً زیاد هارد دیسک نسبت به RAM و CPU اگه بتونیم دسترسیهای مکرر به دیسک رو کمتر کنیم، باعث افزایش سرعت سایت میشیم. بنظرم بهتره درکنار مباحثی مثل ایندکس گذاری صحیح و... نیم نگاهی هم به ابزارهایی مثل Cache کردن نتایج کوئری و... داشته باشیم.

omid_student
دوشنبه 11 خرداد 1394, 11:32 صبح
نتیجه ای که رسیدم دوستان این شد :
استفاده از سرور پرقدرت با هارد ssd و رم و سی پی یو بالا
طراحی بانک استاندارد
استفاده از ایندکس در بانک
استفاده از نوع فیلد مناسب (مثلا به جای استفاده از varchar در شماره تماس از char(11) استفاده بشه
کوچیک کردن جدول

-سیّد-
دوشنبه 11 خرداد 1394, 11:41 صبح
نتیجه ای که رسیدم دوستان این شد :
استفاده از سرور پرقدرت با هارد ssd و رم و سی پی یو بالا
طراحی بانک استاندارد
استفاده از ایندکس در بانک
استفاده از نوع فیلد مناسب (مثلا به جای استفاده از varchar در شماره تماس از char(11) استفاده بشه
کوچیک کردن جدول

البته همه‌ی اینا رو با هم ممکنه لازم نداشته باشید و باید تست کنید.
من توصیه می‌کنم از اول نرید کلی هزینه کنید و سرور پر قدرت و هارد SSD بخرید. عوضش روی یه سرور معمولی با هارد معمولی تست کنید، اگه به نتیجه نرسیدید اون وقت هزینه کنید.
تستتون هم باید تا حد ممکن به واقعیت نزدیک باشه. یعنی اون مقدار فشاری که پیش‌بینی می‌کنید روی سایتتون بیاد رو شبیه‌سازی کنید.

معمولاً با یه سرور معمولی می‌شه یه سایت معمولی رو راه‌اندازی کرد. اگه بعداً رفته رفته کاربرای سیستم زیاد شد و فشار روش بالا رفت، اون وقت می‌تونید هارد رو عوض کنید، یا RAM و CPU سیستم رو زیاد کنید.

fatima-php
دوشنبه 11 خرداد 1394, 22:25 عصر
بهتره برای تست میزان لود سرور با کاربران زیاد همزمان و... از ابزارهای ab و siege و امثال اونها بهره بگیرین.