ورود

View Full Version : دیتابیس بهینه



under22
چهارشنبه 14 خرداد 1393, 19:04 عصر
سلام دوستان
من قرار پایگاه داده ایی طراحی کنم که حداقل 5 میلیون رکورد داره و بعدا هم بیشتر میشه شاید 7 میلیارد خلاصه قرار خیلی سنگین بشه . راه کار های زیادی هم پیدا کردم گفتم باهاتو به اشتراک بزارم
از دوستان حرفه ایی میخام که کمکم کنن و نکاتی بگن که تو بهینه طراحی کردن کمکم کنه و مرجعی بشه برای بهینه سازی .
در ادامه راهکار ها رو میزارم برای تبادل سطح علمی خودم و دوستان .
چند مورد شنیدم که Index گذاری کن فیلد هایی که جستجو زیاد میشه و index multi هم استفاده کن که من index multi رو بلد نیستم راهنماییم کنید؟؟
فیلد هایی که قرار جستجو به صورت like انجام بدی انجام نده و از full text استفاده کن که اگه میشه بهم یاد بدید بلد نیستم !!

سعید صابری
چهارشنبه 14 خرداد 1393, 19:10 عصر
اگه میلیاردی هست برو سراغ Nosql

under22
چهارشنبه 14 خرداد 1393, 19:14 عصر
من شنیدم برای کار با php بهترین پایگاه داده mysql هست ولی mongodb هم هست که عالیه حتی facebook هم از اون استفاده میکنه ولی متاسفانه افراد کمی هستن که بتونن ازش استفاده کنن منجمله من !

سعید صابری
چهارشنبه 14 خرداد 1393, 21:02 عصر
فکر کنم facebook از mysql و nosql استفاده می کنه.البته هر کی یه چیزی میگه.
بهترین گزینه برای php، mysql است. ولی برای دیتابیس های حجیم به این بزرگی جواب نمیده.

us1234
جمعه 16 خرداد 1393, 10:43 صبح
از نظر insert هر تعداد رکورد را میشه در mysql ثبت کرد ولی همه دردسر ها سر سرچ ها و Select ها پیش میاد شما باید اول شرح بدید این رکورد ها قراره چه استفاده ای ازش بشه ؟

under22
جمعه 16 خرداد 1393, 11:19 صبح
حجم دیتابیس که خیلی زیاده . اما از نظر جستجو و ارتباطات باید بگم که جستجو دونش زیاد میشه هم ترکیبی هم تک فیلدی مثل یه فروشگاه آنلاین مثل دیجی کلا.
join های زیادی هم قرار زده بشه .
الآن من نمیدونم دیتابیس رو چطوری بسازم که بهینه ترین حالت رو داشته باشه

us1234
جمعه 16 خرداد 1393, 12:12 عصر
مشابه سوال شما اینجا مطرح شده :
http://serverfault.com/questions/168247/mysql-working-with-192-trillion-records-yes-192-trillion
http://www.sitepoint.com/forums/showthread.php?711911-Searching-on-38-million-records-How-can-I-speed-up-the-return-of-results

اطلاعات فنی مثل نوع تیبل ( MyISAM و InnoDB و... ) داده شده است و همچنین نوع ایندکس گذاری .
ولی یک راه کار مناسب برای تیبل ها که تعداد رکورد ها واقعا بالایی دارند ( چند میلیارد به بالا ) این است که اطلاعاتی که خواستگاه زیادی دارد و ممکن از در روز 2 یا 3 بار بیشتر سرچ شوند در یک تیبل دیگه نگهداری شود ممکن از در نگاه اول این کار باعث شود که اطلاعات یکپارچگی خود را از دست بده ولی در سرچ های اول فشاری که به سرور میاره را خیلی کم میکنه اگر کد در تیبل کوچک نتیجه را پیدا نکرد شروع به سرچ در جدول بزرگ تر میکنه . ( مشابه اش را عمدتا دیدید در سایتهایی که قسمت آرشیو دارند یا سرچ پیشرفته هست )

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

i-php-i
جمعه 16 خرداد 1393, 12:40 عصر
منم برای طراحی سایتی با تعداد رکورد بالا نیاز به راهنمایی و بدست آوردن اطلاعات بیشتر دارم، احتمالا حداکثر 25 میلیون رکورد توی دیتابیس ذخیره بشه. اگر به نتیجه رسیدید لطفا توی این تاپیک عنوان کنید. ممنون

under22
جمعه 16 خرداد 1393, 15:18 عصر
من مقداری تحقیق کردم فقط به چند تا نتجیه رسیدم یکی ایندکس گذاری تک فیلدی با ایندکس گذاری ترکیبی .
نوشتن دستورات بهینه sql . برای مثال از عملگر between و like حدال امکان استفاده نشه یا معادلش به صورت بهینه نوشته بشه .
کش کردن دیتا بیس (اگه از فریمورک php استفاده می کنید خیلی سادس)
تعریف بهینه فیلد ها . برای مثال اگه میخواهید 0 یا 1 رو ذخیره کنید از نوع tinyint که فقط اندازه یک بیت از استفاده بشه .
اگه دوستان راحل دیگه دارن پیشنهاد کنن

i-php-i
شنبه 17 خرداد 1393, 03:26 صبح
این مباحث در اصل مباحث پایه ای بهینه سازی هست، با رعایت این نکات تونستید روی لوکال 5 میلیون رکورد رو به سادگی ایجاد و مدیریت کنید؟ موقع صفحه بندی یا جستجو سایت کند نمی شه؟

under22
شنبه 17 خرداد 1393, 11:35 صبح
من هنوز دیتابیس رو طراحی نکردم ولی کلا اگه این نکته هایی که میگم رعایت mysql تا میلیارد رکورد هیچ مشکلی نداره .
استفاده از stored procedure (وقتی از این استفاده می کنید برای دفعه اول کوئری رو کش میکنه و سرعت رو تا 45% بیشتر میکنه)
یکی ایندکس گذاری تک فیلدی با ایندکس گذاری ترکیبی .
نوشتن دستورات بهینه sql . برای مثال از عملگر between و like حدال امکان استفاده نشه یا معادلش به صورت بهینه نوشته بشه .
کش کردن دیتا بیس (اگه از فریمورک php استفاده می کنید خیلی سادس)
تعریف بهینه فیلد ها . برای مثال اگه میخواهید 0 یا 1 رو ذخیره کنید از نوع tinyint که فقط اندازه یک بیت از استفاده بشه .

i-php-i
شنبه 17 خرداد 1393, 13:54 عصر
من هنوز دیتابیس رو طراحی نکردم ولی کلا اگه این نکته هایی که میگم رعایت mysql تا میلیارد رکورد هیچ مشکلی نداره . اگر نسخه رایگان و عمومی mysql بتونه این کار رو انجام بده که عالیه، منبع معتبری برای این مطلب سراغ ندارید؟

under22
شنبه 17 خرداد 1393, 15:44 عصر
منابع این مطالب تو خود سایت Mysql هست . خیالتون راحت اگه اون موارد بالا رو رعایت کنید اصلا چند میلیاردم داده داشته باشید هیچ مشکلی پیش نمیاد .
فقط تو مواردی می تونیم بگیم که باز هم موارد بال رو انجام بدیم مشکل داریم که هم داده ها خیلی خیلی زیاد باشن (برای مثال از 10 میلیاردم بیشتر باشن) هم اینکه داده ها حجیم باشن که اون موقع باید برای دیتابیس یه سرور جدا تهیه کرد .
تازه اگه شما از stored procedure استفاده کنید غیر از این که وقتی کوئری رو دفعه دوم درخواست کنید 45% سریعتره که اینکار حمله sql injection رو صفر میکنه . (منبعش تو سایت Mysql) دو تا مزیت عمده داره

سعید صابری
شنبه 17 خرداد 1393, 21:58 عصر
در حالت عادی با این حجم mysql جوابگو نخواهد بود.امتحان این موضوع خیلی سخت نخواهد بود.50-60 میلیون رکورد اینسرت کنید و بعدش انتخاب و....
ببینید جواب میده یا خیر.

در حالت غیر معمول که سراغ بحث های دیگه باید بریم که فکر کنم هزینه بر خواهد بود.وقتی یک دیتابیس رایگان عملکرد بهتری در این زمینه داره چرا از ابتدا درست انتخاب نکنید؟

nosql واقعا ساخته شده برای دیتابیس های بزرگ.زمان بازدهی اصلا قابل مقایسه با بیشتر دیتابیس ها نیست.

under22
شنبه 17 خرداد 1393, 22:23 عصر
شما اشتباه می کنید . چند میلیون رکورد اصلا چیزی واسه mysql نیست تو میلیارد رکوردم اگه بهینه طراحی کرده باشید بازم جوابگو هست .
اگه داده هاتوت دیگه از خیلی زیاد باشه مثلا بیشتر از میلیارد باید مثله فیسبوک و کلوپ اون رو رو سرور های جدا اجرا کنید تا بتواند از همه سیستم ایتفاده کنه و جوابگو باشه .
فیسوک و کلوپ از Mysql استفاده می کنند البته فیسبوک بخشیش از Mysql هست (بیشترش با mysql هست)
من با فردی صحبت کردم که تجربه ذخیره میلیون تو Mysql رو داشته و هیچ مشکلی نداشته
چرا mysql رو اینقدر ضعیف جلوه می دید
nosql برای مواقعی خوبه که طول داده ما خیلی متغییر باشه برای مثال معلوم نیست داده ما 10 میشه ی 10 مگابایت و داده های ما خیلی سنگیه البته این سنگنی از لحاظ کلی نه از لحاظ فیلدی مقادیر ما خیلی زیاد باشه

سعید صابری
یک شنبه 18 خرداد 1393, 21:51 عصر
من با فردی صحبت کردم که تجربه ذخیره میلیون تو Mysql رو داشته و هیچ مشکلی نداشته

یکی دیگه از کسایی در حال حاضر داره از mysql (در شبکه خارج از نت) ذخیره میلیونی رکورد داره خود منم!فکر کنم دیتابیس عمرش به 9-10 سالی میرسه تقریبا ازش راضیم.فکر کنم تعداد رکورد به 30 به بالا که رسید برای جستجوی ساده تا چندها دقیقه زمان میبرد مجبور شدم از هزار راه برای سبک کردن بار دیتابیس استفاده کنم و هر روز که بار دیتابیس سنگین تر میشه روز از نو روزی از نو....

به نظر من برای به نتیجه رسیدن بحث یکی از دوستان یک جدول تک فیلدی در mysql و nosql ایجاد کنم.مقدار زیادی رکورد اینسرت کنه بعد زمان ها بزاره.

nazanin_asadi_1
چهارشنبه 21 خرداد 1393, 12:01 عصر
منم مشکلم همینه حجم زیاد رکوردها هستش


با یک فیلد فکر نکنم جواب دقیق تری بشه پیدا کرد ولی خوب یک جدول با چند میلیون رکورد


این کوئری رو یک بار اجرا کنید :
CREATE TABLE `table1` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_persian_ci;

INSERT INTO table1(id)VALUES(""),(""),(""),(""),(""),(""),(""),(""),(""),(""),(""),(""),(""),(""),(""),(""),(""),(""),(""),("");;



حالا این کوئری رو 17 بار اجرا کنید تا تعداد رکوردها به 2.5 میلیون برسه
INSERT INTO table1(id)(
SELECT "" from table1
)


الان که تست میکنم روی لوکال با 2.6 میلیون رکورد برای رسیدن به آخرین رکورد زمان زیر رو دارم

Showing rows 2621430 - 2621439 ( 2,621,440 total, Query took 1.5437 sec)

اینم روی هاست اشتراکی تست گرفتم

Showing rows 2621425 - 2621439 (2621440 total, Query took 1.8466 sec)



درباره دیتابیس nosql هم اطلاعاتی ندارم

under22
چهارشنبه 21 خرداد 1393, 12:08 عصر
شما اگه موارد بالا رو رعایت کنید این زمان خیلی کم میشه .
مشا تایپیک های بالا رو بخونید .
برای مثال شما تو ساخت جدولتون اصلا index تعریف نکردید .
وقتی ایندکس تعریف می کنید فایل ها اون فیلد به صورت شاخص گذاری ذخیره میشه که این کمک میکنه برای مثال تو 70 میلیون با 6 یا 7 مقایسه رکود مورد نظر شما رو پیدا میکنه .
حالا غیر از ایندکس بقیه موارد رو هم رعایت کنید عالی میشه اصلا 2 یا 10 میلیون رکورد برای mysql هیچی نیست اگه بهینه طراحی کنید

nazanin_asadi_1
چهارشنبه 21 خرداد 1393, 12:49 عصر
شما اگه موارد بالا رو رعایت کنید این زمان خیلی کم میشه .
مشا تایپیک های بالا رو بخونید .
برای مثال شما تو ساخت جدولتون اصلا index تعریف نکردید .
وقتی ایندکس تعریف می کنید فایل ها اون فیلد به صورت شاخص گذاری ذخیره میشه که این کمک میکنه برای مثال تو 70 میلیون با 6 یا 7 مقایسه رکود مورد نظر شما رو پیدا میکنه .
حالا غیر از ایندکس بقیه موارد رو هم رعایت کنید عالی میشه اصلا 2 یا 10 میلیون رکورد برای mysql هیچی نیست اگه بهینه طراحی کنید

دوست عزیز تا اونجا که من میدونم برای فیلدی که خودش کلید هستش نیازی به ایندکس گذاری نداره (چون خودش ایندکس هست )
موارد بالا رو هم که هی میگی اگه نگاه کنی می بینی که فقط یک فیلد هستش فقط یک فیلد که اونم اتونامبر هستش و کلید هم هستش و نوع موتور هم InnoDB هستش

under22
چهارشنبه 21 خرداد 1393, 13:01 عصر
دوست عزیز تا اونجا که من میدونم برای فیلدی که خودش کلید هستش نیازی به ایندکس گذاری نداره (چون خودش ایندکس هست )
موارد بالا رو هم که هی میگی اگه نگاه کنی می بینی که فقط یک فیلد هستش فقط یک فیلد که اونم اتونامبر هستش و کلید هم هستش و نوع موتور هم InnoDB هستش
شما راست می گی من حواسم نبود .
خب فکر کنم این نزدیک به 2 ثانیه یا 1.8 ثانیه زمان خوبی باشه به خصوص که وقتی این رو کش کنید دفعه دوم زیر نیم ثانیه بهش دسترسی پیدا می کنید و اگه این رو با stored procedure استفاده کنید بهترم میشه و یک دفعه هم تو خود Mysql کش میکنه اینطوری دو دفعه کش صورت میگیره .
تو تالار PHP آقا رضا که سایت های بزرگی رو با بازدید بالا زدن با Mysql زدن من هم باهاشون حرف زدم میگفت تا 5 میلیون رکورد داشته دیتابیسش ولی با رعایت اصول که گفتم و یک سرور خوب با کانفیگ mysql خوب تا میلیارد رو جواب میشه داد مثل این سایت که آقار رضا زده و 5 میلیون رکورد داره . http://jahanpay.com/

nazanin_asadi_1
چهارشنبه 21 خرداد 1393, 13:23 عصر
شما راست می گی من حواسم نبود .
خب فکر کنم این نزدیک به 2 ثانیه یا 1.8 ثانیه زمان خوبی باشه به خصوص که وقتی این رو کش کنید دفعه دوم زیر نیم ثانیه بهش دسترسی پیدا می کنید و اگه این رو با stored procedure استفاده کنید بهترم میشه و یک دفعه هم تو خود Mysql کش میکنه اینطوری دو دفعه کش صورت میگیره .
تو تالار PHP آقا رضا که سایت های بزرگی رو با بازدید بالا زدن با Mysql زدن من هم باهاشون حرف زدم میگفت تا 5 میلیون رکورد داشته دیتابیسش ولی با رعایت اصول که گفتم و یک سرور خوب با کانفیگ mysql خوب تا میلیارد رو جواب میشه داد مثل این سایت که آقار رضا زده و 5 میلیون رکورد داره . http://jahanpay.com/

این شد یه چیزی سعی کن تا متن رو نخوندی جواب ندی تا اینجوری سوتفاهم پیش نیاد

ساختار هر برنامه با توجه به سبک برنامه نویسش فرق داره مثلا دو برنامه که هر دو یک کار رو انجا میدن اگه توسط دو برنامه نویس مجزا نوشته بشه قطعا ساختارشون فرق خواهد داشت

الان همین جدولی که ایجاد کردم توی پست 17 (http://barnamenevis.org/showthread.php?455134-%D8%AF%DB%8C%D8%AA%D8%A7%D8%A8%DB%8C%D8%B3-%D8%A8%D9%87%DB%8C%D9%86%D9%87&p=2040699&viewfull=1#post2040699) خوب اگه از کش بخوای استفاده کنی یعنی باید به اعزای هر درخواست یک بار کش صورت بگیره تا از دفعه دیگه از اون کشها استفاده کنه خوب حالا وقتی تعداد INSERT رکوردها بیشتر میشه اونم زمانی که داده های ثبت شده توی چند جدول مربوط به یک کالا یا شخص هستش (داده ها توی چند جدول ثبت میشه ) باز یه سری مشکلات هستش

الان همین یک جدول رو با همون یک فیلد رو بهینش کن نتیجش رو ببینیم حالا فقط صفحه بندیش هست جستجوش و JOIN شدنش با جدولهای دیگه که بماند

under22
چهارشنبه 21 خرداد 1393, 13:39 عصر
این شد یه چیزی سعی کن تا متن رو نخوندی جواب ندی تا اینجوری سوتفاهم پیش نیاد

ساختار هر برنامه با توجه به سبک برنامه نویسش فرق داره مثلا دو برنامه که هر دو یک کار رو انجا میدن اگه توسط دو برنامه نویس مجزا نوشته بشه قطعا ساختارشون فرق خواهد داشت

الان همین جدولی که ایجاد کردم توی پست 17 (http://barnamenevis.org/showthread.php?455134-%D8%AF%DB%8C%D8%AA%D8%A7%D8%A8%DB%8C%D8%B3-%D8%A8%D9%87%DB%8C%D9%86%D9%87&p=2040699&viewfull=1#post2040699) خوب اگه از کش بخوای استفاده کنی یعنی باید به اعزای هر درخواست یک بار کش صورت بگیره تا از دفعه دیگه از اون کشها استفاده کنه خوب حالا وقتی تعداد INSERT رکوردها بیشتر میشه اونم زمانی که داده های ثبت شده توی چند جدول مربوط به یک کالا یا شخص هستش (داده ها توی چند جدول ثبت میشه ) باز یه سری مشکلات هستش

الان همین یک جدول رو با همون یک فیلد رو بهینش کن نتیجش رو ببینیم حالا فقط صفحه بندیش هست جستجوش و JOIN شدنش با جدولهای دیگه که بماند
ببنید کش تو PHP میاد دفعه اول کل کوئری رو کش میکنه بعد ما یک کوئری خیلی سبکتر از کوئری اول بهش میدیم و دفعه بعد میاد اون کوری سبکه رو اجرا میکنه اگه تغییری داده نشده باشه میاد از کش میخونه اگه تغییری داده شده باشه کش رو پاک میکنه و کوئری بزرگه رو اجرا میکنه و دوباره کشش میکنه . برای مثال ما یک کوئری سنگین داری که یک join هم داره ما این رو کش میکنیم و کوئری کوچیک رو اینطوری می نویسیم
SELECT MAX(update_time) from tb_product

خب معلومه این کوئری خیلی خیلی سبکتره از کوئری اصلیه هست و هر دفعه این کوئری اجرا میشه تا اینکه بیاد بزرگه رو اجرا کنه اگه تغییری ایجاد نشده باشه .
من اگه بخام این کوئری شما رو بهینه کنم اول میاد این کوئری رو تو Mysql به صورت stored procedure می نویسم و تو برنامه PHP هم میاد صداش می کنم و کشش می کنم و شرط کش هم اینگونه می نویسم . اینطوری دو دفعه کش میشه
SELECT MAX(id) from tb_product
به نظره بنده این میتونه بهینه باشه و تا 1 میلیاردو جوابگو هست اگه هم بیشتر شد باید خود کوئری بهینه بشه که باید با یک فرد خبره مشورت بشه

under22
چهارشنبه 21 خرداد 1393, 13:51 عصر
برای مثال این کوئری نثبت به کوئر پایین خیلی بهینه تره و خودش رو تو حجم های بالا نشون میده
SELECT id,name from tb_product
این کوئری سریعتر از کوئری پایینی است .
SELECT * from tb_product
این یه مثال ساده بود

nazanin_asadi_1
چهارشنبه 21 خرداد 1393, 15:10 عصر
برای مثال این کوئری نثبت به کوئر پایین خیلی بهینه تره و خودش رو تو حجم های بالا نشون میده
SELECT id,name from tb_product
این کوئری سریعتر از کوئری پایینی است .
SELECT * from tb_product
این یه مثال ساده بود
دوست عزیز این مباحثی که شما مطرح کردید مباحث پیش پا افتاده هستش که حداقل کسایی که توی این تایپیک دارن پست میدن بیشتر این موارد رو بلد هستن


الان من 5242880 رکورد دارم که توی همون جدولی هستش که ساختارش رو توی پست 17 گذاشتم و فقط یک فیلد داره با نام ID که هم کلیده هم ایندکس هم اتونامبره

الان وقتی میخوام به آخرین رکورد هاش با phpmyadmin برم 5 ثانیه زمان میبره حالا اگه اینو بخوام JOIN کنم با جدول های دیگه و سطرهای دیگه هم بهش اضافه بشه دیگه باید به فکر یه سرور (یا چند سرور ) باشیم ساختار پیچیده ای نیست

under22
چهارشنبه 21 خرداد 1393, 15:22 عصر
شما فقط تایپیک دوم من رو گفتید که فقط یک مثال ساده بود و همه موارد جزی جم میشه که آخر به جواب میرسیم .
من تو قبلی بهتون گفتم اگه من بخام کوئری شما رو پیاده سازی کنم به اون روش میکنم که خیلی خیلی سریعتر میشه خودتون اگه نگاه کنید متوجه می شید

us1234
چهارشنبه 21 خرداد 1393, 17:17 عصر
تیبل که در پست 17 ساخته شده در بهینه ترین حالت است و از نظر تکتنیک ساخت تیبل دیگه بهتر از این ممکن نیست !

ولی برای افت سرعت باید راهکار پیدا کنیم .
بهترین راه :
کش کردن .
کش کردن چندین نوع دارد .یک نوع ساده که اکثرا استفاده می کنند یک خروجی از دیتابیس را روی هارد نگه داری میکنند در این نوع کشها چون عملیات پردازشی mysql و تعداد کانکشن ها به دیتابیس کم شده و عملیات خواندن از فایل انجام میشود به مراتب سرعت اجرا می تواند بالا رود ( در هاستینگ های معتبر سرور mysql از سرور هاست جداست در این گونه موارد سروری که برای mysql در نظر گرفته اند از هارد های ssd استفاده می کند پس ممکن است کش کردن سرعت را کمتر نیز کند !!) .
نوع بعدی کش ها : کش در رم RAM نمونه بارز Memcached (http://en.wikipedia.org/wiki/Memcached). این گونه کش ها که نسبتا زمان کمتر از نوع اول ، کوئری را ذخیره می کنند ( زمان دست برنامه نویس است ولی عمدتا 1 دقیقا تا 1 ساعت در نظر گرفته میشود به دلایل خاص که اگر نیاز بود توضیح داده میشود ) ساختار این کش به دلیل استفاده از جدول هش و ذخیره در رم سرور سرعت را به مراتب خیلی خیلی بالا تر می برد .

کتابخانه های وجود دارند که به accelerators (http://en.wikipedia.org/wiki/List_of_PHP_accelerators)معروف هستند . کاربرد اینگونه شتاب دهنده ها پیچیده است و بهترین بازدهی را از سرور دارند . یک بخش مهم در یک accelerator کش است که استفاده از آن خیلی بهینه تر از کش ها دیگر است . بخصوص http://eaccelerator.net/

بعد از این توضیحات در خصوص سوال نحوه بهینه کردن تیبل بعد از join باید بگم که شما نتیجه پردازش شده ( یعنی عملیات تاریخ یا هر کار دیگه ای که قرار است با نتایج کوئری مذکور انجام شود ) را به صورت کش نگهداری کنید .

در کل تا معماری کد ها و سیستم شما مشخص نشود نمیشود راهکاری مناسبی پیشنهاد داد .

nazanin_asadi_1
چهارشنبه 21 خرداد 1393, 17:29 عصر
من الان همین جدولی که در پست 17 گفتم رو روی سرور هم ایجاد کردم و الان تعداد رکوردهاش رو با اجرای اون کوئری به 5 میلیون رسوندم الان بازه زمانیش برای رسیدن به آخرین صفحه از رکوردها (از داخل phpmyadmin) ما بین 3 تا 4 ثانیه هستش

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

هر چند باید این نکته رو هم در نظر داشت که هر که بامش بیش برفش بیشتر . اگه کسی تعداد رکوردهاش به 5 میلیون میرسه دیگه نباید روی هاست های اشتراکی بمونه (البته با توجه به کاربرانش ) باید بره سمت سرور مجازی بعد خود سرور و ...

اگه قرار بود فیس بوک روی هموس هاست بمونه که الان به اینجا نمی رسید

برای مثال من فکر کنم اگه به جای هاست اشتراکی از سرور مجازی استفاده کنم نتیجه حاصل شده به مراتب بهتر از این نتیجه ای خواهد بود که الان دارم

Restlesa
چهارشنبه 21 خرداد 1393, 18:32 عصر
سلام به همگی
میشه در رابطه با stored procedure یه توضیحی بدین ؟؟؟
با تشکر

under22
چهارشنبه 21 خرداد 1393, 18:46 عصر
سلام به همگی
میشه در رابطه با stored procedure یه توضیحی بدین ؟؟؟
با تشکر

وقتی از stored procedure استفاده می کنید علاوه بر اینکه خطر حمله sql injection صفر میشه وقتی برای بار دوم اون رو صدا می زنید دیگه نمیاد کوئری رو اجرا کنه بلکه دفعه اول اون رو داخل خود mysql کش میکنه و باعث میشه حدودا 45% سریعتر باشه .
اگه باز هم تو سرعت مشکل داشته باشید باید کش کنید کش تو PHP انواع زیادی سریعترینشون apc cache , memchache هست که واسه ساتی های خیلی بزرگ استفاده میشه .

Restlesa
چهارشنبه 21 خرداد 1393, 19:06 عصر
طریقه استفاده از stored procedure و memchache به چه صورته ؟؟؟

under22
چهارشنبه 21 خرداد 1393, 19:35 عصر
طریقه استفاده از stored procedure و memchache به چه صورته ؟؟؟
برای استفاده از stored procedure باید اون رو مثل یک فانکشن php تو خود Mysql تعریف کنید .
این کتاب آموزشش هست .
لینک (http://www.google.com/url?sa=t&rct=j&q=mysql%20stored%20procedure%20pdf&source=web&cd=1&ved=0CBwQFjAA&url=http%3A%2F%2Fwww.peregrinesalon.com%2Fwp-content%2Fuploads%2F2009%2F03%2Fmysql-stored-procedures.pdf&ei=9nWYU96hOsr00gXA0IDoCg&usg=AFQjCNE6uFgEQ7vSuq93kpy96q8JpXJgQQ&bvm=bv.68693194,d.d2k&cad=rja)
memcache اکثرا تو یک سرور جدا استفاده میشه ولی apc طبق مقایسه ها و الگوریتم هایی که داره از memcache سریعتر حدودا 3 برابر سریعتره . کلا سریعترین کشی هست که وجود داره .
برای استفاده از هر جفتشون باید تو سرورتون نصب باشه

Restlesa
چهارشنبه 21 خرداد 1393, 20:31 عصر
یه منبع آموزشی سراغ نداری برام قرار بدی ؟؟؟
بر فرض مثال memcache و یا apc بر روی سرور نصب هستن. حالا چه طوری باید ازشون استفاده کرد ؟؟؟ آیا کلاس خاصی برای اینکار وجود داره ؟؟؟

under22
چهارشنبه 21 خرداد 1393, 20:41 عصر
من اول بهتون apc کش رو پیشنهاد می کنم چون هم سریعتر و هم نیاز خیلی زیاد به رم نداره چون memcache خیلی رم میخواد .
دوم اینکه سعی کنید خودتن رو درگیر یادگیری یا نوشتن کلاسش نکنید وقتتون رو سعی کنید تا یک فریمورک PHP رو یاد بگیرید اون موقع شما فقط کش رو هر جا احتیاج داشته باشید بنویسید اون موقع فقط تو کانفیگ نوع کش رو عوض می کنید به همین راحتی .
اکثر هاست های اشتراکی apc , memcache رو فعال نمی کنن نمی کنن ولی هاست های بریتینا apc رو براتون فعال می کنن .
بهترین فریمورک هم برای یادگیری فعلا Yii هست . شما فقط به بازدهیش با apc و بدون apc نگاه کنید .
لینک (http://www.yiiframework.com/performance/)
شما اگه اصول رو رعایت کنید و کش هم استفاده کنید هیچ مشکلی پیش نمیاد . من خودم چون پروژه هام خیلی سنگین نیست از کش فایل استفاده می کنم که همه هاست ها ساپورت میکنه و بازدهی خوبی هم داره ولی نه مثل کش هایی که قبلا گفته بودم .

سعید صابری
چهارشنبه 21 خرداد 1393, 21:44 عصر
فکر کنم خواندن این تاپیک برای همه خالی از لطف نباشه
http://barnamenevis.org/showthread.php?396276-%D9%BE%D8%A7%DB%8C%DA%AF%D8%A7%D9%87-%D9%87%D8%A7%DB%8C-%D8%AF%D8%A7%D8%AF%D9%87-%D8%A7%DB%8C-%D8%B1%D8%A7%D8%A8%D8%B7%D9%87-%D8%A7%DB%8C-%DB%8C%D8%A7-%D8%BA%DB%8C%D8%B1-%D8%B1%D8%A7%D8%A8%D8%B7%D9%87-%D8%A7%DB%8C-%D8%9F-%D9%85%D8%B3%D8%A6%D9%84%D9%87-%D8%A7%DB%8C%D9%86-%D8%A7%D8%B3%D8%AA!

Restlesa
پنج شنبه 22 خرداد 1393, 00:37 صبح
من اول بهتون apc کش رو پیشنهاد می کنم چون هم سریعتر و هم نیاز خیلی زیاد به رم نداره چون memcache خیلی رم میخواد .
دوم اینکه سعی کنید خودتن رو درگیر یادگیری یا نوشتن کلاسش نکنید وقتتون رو سعی کنید تا یک فریمورک PHP رو یاد بگیرید اون موقع شما فقط کش رو هر جا احتیاج داشته باشید بنویسید اون موقع فقط تو کانفیگ نوع کش رو عوض می کنید به همین راحتی .
اکثر هاست های اشتراکی apc , memcache رو فعال نمی کنن نمی کنن ولی هاست های بریتینا apc رو براتون فعال می کنن .
بهترین فریمورک هم برای یادگیری فعلا Yii هست . شما فقط به بازدهیش با apc و بدون apc نگاه کنید .
لینک (http://www.yiiframework.com/performance/)
شما اگه اصول رو رعایت کنید و کش هم استفاده کنید هیچ مشکلی پیش نمیاد . من خودم چون پروژه هام خیلی سنگین نیست از کش فایل استفاده می کنم که همه هاست ها ساپورت میکنه و بازدهی خوبی هم داره ولی نه مثل کش هایی که قبلا گفته بودم .

تو برنامه ای که من دارم می نویسم از هیچ فریم ورک php استفاده نکردم و دستورات خام php هستش . حال اگه بخوام از کش apc استفاده کنم باید چی کار کنم ؟؟؟

Restlesa
پنج شنبه 22 خرداد 1393, 00:41 صبح
یه سوال دیگه برای فیلدهایی که تنها 5 عدد 1 تا 5 رو می گیرن از نوع enum استفاده بشه بهتر و بهینه تر یا از tinyint ؟؟؟ برای فیلدهایی که بصورت boolean هستن چه طور ؟؟؟

meysam7972
پنج شنبه 22 خرداد 1393, 10:23 صبح
بچه ها با سلام
میشه به سوال منم جواب بدین؟
میشه از طریق صفحات php اتصال به سرور ویندوزی کرد

nazanin_asadi_1
پنج شنبه 22 خرداد 1393, 10:33 صبح
بچه ها با سلام
میشه به سوال منم جواب بدین؟
میشه از طریق صفحات php اتصال به سرور ویندوزی کرد
سوال شما اصلا ربطی به این تایپیک نداره رعایت کنید خواهشان

درباره سوالت هم با php چطوری میخوای به سرور وصل بشی ؟ اصلا قضیه چیه سوالتو توی یه تایپیک جدید کامل توضیح بده اینجا دیگه کامنت نزار :قلب:

under22
پنج شنبه 22 خرداد 1393, 15:12 عصر
یه سوال دیگه برای فیلدهایی که تنها 5 عدد 1 تا 5 رو می گیرن از نوع enum استفاده بشه بهتر و بهینه تر یا از tinyint ؟؟؟ برای فیلدهایی که بصورت boolean هستن چه طور ؟؟؟
متاسفانه بنده نمی دونم که اگه دستی خودمو بخواهیم از apc استفاده کنیم به چه صورت هست ولی میتونی تو سایت خود Php.net بری بخونی .
برای انتخاب درست نوع فیلدت یه نگاه به لینک زیر بکن خودت متوجه میشی .
لینک (http://dev.mysql.com/doc/refman/5.7/en/storage-requirements.html)
در ضمن اگه چیزی که میخای ذخیره کنی به صورت رشته بود و طولش تقربا همیشه یکی بود و یکی یا دو تا حرف بالا پایین بود حتما از char استفاده کن . چون char طولش ثابته و متغییر نیست بخاطر همین یه خورده حجم دیتابیست زیاد میشه ولی در عوض سرعتت میره بالا تر نسبت به varchar

سعید صابری
پنج شنبه 22 خرداد 1393, 17:27 عصر
یه سوال دیگه برای فیلدهایی که تنها 5 عدد 1 تا 5 رو می گیرن از نوع enum استفاده بشه بهتر و بهینه تر یا از tinyint ؟؟؟ برای فیلدهایی که بصورت boolean هستن چه طور ؟؟؟


تست سرعت enum,tinyint,bit






Avg 100 iteration time, 10,000 inserts (lower better)


data type
myisam
memory
innodb


enum
0.9934
0.8971
tba


bit
1.009
0.9056
tba


tinyint
1.0335
0.8987
tba








Avg 100 iteration 10k ins Inserts/Second (higher better)


data type
myisam
memory
innodb


enum
10066.4385
11147.02932
tba


bit
9910.8028
11042.4028
tba


tinyint
9675.8587
11127.1837
tba