PDA

View Full Version : حرفه ای: این جدول می تونه تا 250،000 رکورد رو ذخیره کنه و بدون کاهش سرعت سایت کار کنه؟



i-php-i
دوشنبه 15 دی 1393, 02:04 صبح
برای بخش اخبار یه سایت خبری از این ساختار استفاده کردم، البته تعداد فیلها بیشتر هستن ولی اصل جدول همین هست

آیا این جدول که از نوع MyISAM هست به همین شکل می تونه تا 250،000 خبر رو ذخیره کنه و بدون اینکه سرعت سایت کاهش پیدا کنه (هنگام نمایش خبر و صفحه بندی) به کار خودش ادامه بده؟

همونطور که می بینید این جدول از این فیلدها تشکیل شده:
PRIMARY: کلید اولیه
news_title: عنوان خبر
news_text: متن خبر
menu_id: آی دی دسته بندی خبر
is_active: وضعیت فعال یا غیر فعال بودن خبر




CREATE TABLE IF NOT EXISTS `news_tb` (
`PRIMARY` int(10) unsigned NOT NULL AUTO_INCREMENT,
`news_title` varchar(150) COLLATE utf8_unicode_ci NOT NULL,
`news_text` longtext COLLATE utf8_unicode_ci NOT NULL,
`menu_id` varchar(15) COLLATE utf8_unicode_ci NOT NULL,
`is_active` tinyint(1) NOT NULL,
`register_time` int(10) NOT NULL,
PRIMARY KEY (`PRIMARY`),
KEY `menu_id` (`menu_id`,`is_active`),
KEY `register_time` (`register_time`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;

beh3000
دوشنبه 15 دی 1393, 08:51 صبح
250000 رکورد که چیزی نیست برای mysql ایندکس هم که دارید ... مشکلی پیش نمیاد ... من یک سوال بپرسم از دوستان : sqlite ده میلیون رکورد رو جواب میده ؟ ساختار جدول هم به این شکله


CREATE TABLE blog_stat(
id INTEGER,
ip CHAR(20),
dt DATE DEFAULT (datetime('now','localtime')),
screen CHAR(20),
text text
);


اون فیلد تکست توش حداکثر 200 کاراکتر قرار میگیره ... کل جدول همینه

us1234
دوشنبه 15 دی 1393, 11:54 صبح
250000 رکورد که چیزی نیست برای mysql ایندکس هم که دارید ... مشکلی پیش نمیاد ... من یک سوال بپرسم از دوستان : sqlite ده میلیون رکورد رو جواب میده ؟ ساختار جدول هم به این شکله


CREATE TABLE blog_stat(
id INTEGER,
ip CHAR(20),
dt DATE DEFAULT (datetime('now','localtime')),
screen CHAR(20),
text text
);


اون فیلد تکست توش حداکثر 200 کاراکتر قرار میگیره ... کل جدول همینه

اینسرت کردن به هر تعداد ( در عمل به اندازه کل حجم هارد سرور ) هیچ مشکلی پیش نمیاد .

تمامی مشکلات موقع سلکت پیش می آید .

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

rezaonline.net
دوشنبه 15 دی 1393, 12:43 عصر
به جای longtext از text استفاده کن .

i-php-i
دوشنبه 15 دی 1393, 14:19 عصر
250000 رکورد که چیزی نیست برای mysql ایندکس هم که دارید ... مشکلی پیش نمیاد ... من یک سوال بپرسم از دوستان : sqlite ده میلیون رکورد رو جواب میده ؟ ساختار جدول هم به این شکله
لطفا توی این سوال یه سوال دیگه نپرسید



به جای longtext از text استفاده کن .



دلیلش چیه؟

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

beh3000
دوشنبه 15 دی 1393, 19:01 عصر
لطفا توی این سوال یه سوال دیگه نپرسید


من معذرت میخوام ازتون خواستم تاپیک جدید باز کنم ولی چون دوتا سوال شبیه به هم بود گفتم همین جا بپرسم , در مورد سوال شما هم پاسخی داده بودم ولی اگه بازم حقوقتون رعایت نشده معذرت میخوام ...

در مورد سوال شما همیشه بهتر ه که کوچکترین نوع داده ای که بیشترین تقاضای ما رو پاسخگو هست انتخاب کنیم ... اگه فکر میکنید داده هاتون همشون کمتر از 65535 کاراکتر هستند از نوع text تعیین کنید اگه فکر میکنید امکان داره از اون بیشتر بشه تا 16 میلیون کاراکتر میتونید نوع داده تون رو mediumtext تعیین کنید ولی اگه بازم فکر میکنید بیشتر از این میشه !!!! longtext تعیین کنید که میتونه تا 4 میلیارد کاراکتر رو تو خودش جا بده




اینسرت کردن به هر تعداد ( در عمل به اندازه کل حجم هارد سرور ) هیچ مشکلی پیش نمیاد .

تمامی مشکلات موقع سلکت پیش می آید .

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

در این جدول میخوام select انجام بدم بدون join بر حسب تاریخ ... مثلا با یک select تعداد رکردهای بازگشتی شاید 5000 تا باشه ... امکانش کمه که انقد رکورد بازگشت بده ولی امکانش هست دیگه ... زمان سلکت کردنش هم مثلا اگه توی یک ثانیه جواب بده برام مشکلی نداره

us1234
سه شنبه 16 دی 1393, 10:57 صبح
در این جدول میخوام select انجام بدم بدون join بر حسب تاریخ ... مثلا با یک select تعداد رکردهای بازگشتی شاید 5000 تا باشه ... امکانش کمه که انقد رکورد بازگشت بده ولی امکانش هست دیگه ... زمان سلکت کردنش هم مثلا اگه توی یک ثانیه جواب بده برام مشکلی نداره

خوب اولین نکته که باید رعایت کنید کم کردن تابع های mysql که استفاده می کنید .
مثلا اگر به جای datetime('now','localtime') فیلد را int در نظر بگیرید و با تابع time در پی اچ پی کار کنید سرعت بالاتر خواهد بود .
برای سلکت کردن بر اساس زمان هم اول تایم استامپ را در php درست کنید و با عملیات های < و > بازه درست را پیدا کنید .
همین عملیات کلی فشار بیهوده که باید موتور mysql برای عملیاتهای تاریخ انجام دهید کم میکند .

5000 رکورد را برای چه کاری نیاز دارید ؟ این تعداد را لیمیت کنید به 100 الی 500 رکورد و هر بار سیک کنید روی رکورد های بعدی.

یک سلکت در phpmyadmin بزنید و زمان را ببیند چقدر بر میگردانه و از قسمت status نگاه کنید آخرین سلکت حجمش چقدر بوده و چند درصد سی پی یو را اشغال کرده .

i-php-i
جمعه 26 دی 1393, 03:33 صبح
سوال مهمتر اینکه شما برای صفحه بندی این جدول از چه limit استفاده می کنید یا از where . ظاهر اگر از limit استفاده کنیم کل جدول رو توی حافظه ذخیره می کنه و سرعت سایت میاد پایین و باید از where استفاده کرد اما من نمی دونم چطور باید این کار رو انجام بدم. شما برای صفحه بندی چنین جدولی از چه روشی استفاده می کنید؟

abolfazl-z
جمعه 26 دی 1393, 16:41 عصر
http://www.iheavy.com/2013/06/19/3-ways-to-optimize-for-paging-in-mysql/
http://explainextended.com/2009/10/23/mysql-order-by-limit-performance-late-row-lookups/

http://dev.mysql.com/doc/refman/5.6/en/limit-optimization.html