• 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
خورد کردن اطلاعات
#1
سلام

داشتم دیتابیس چند سایت رو بررسی میکردم به نکته جالبی بر خوردم. ( به طور خاص یه سیستم انجمن و یه سیستم خبر )

در ماژول انجمن جدولی هست که پست ها داخل اون ذخیره میشه. این جدول حدود ۲۰۰ مگ حجم داشت که چیزی در حدود ۱۷۰ مگ از اون مربوط به متن پست ها بود و ۳۰ مگ دیگه مربوط به عنوان و آی دی و ... بود.

حدول اخبار هم همینطور بود حدود ۶۵ مگ اطلاعات متن خبر و ۱۵ مگ اطلاعات دیگه مثل عنوان و ...

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

به نظرتون بهتر نیست به جای یه جدول برای پست های انجمن یا خبر دو جدول داشت. یکی همه اطلاعات پست منهای متن اصلی و دگیری متن اصلی و یه آی دی

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

ممنون
  پاسخ
تشکر شده توسط :
#2
توی myisam این معنی میده ولی توی innodb نه. چون به صورت pool ذخیره می کنه و اطلاعات در یک یا چند فایل ذخیره میشه.
فقط توی کوئریتون که دارین درخواست میدین فیلدهایی رو که نیاز ندارین رو نیارین
  پاسخ
تشکر شده توسط : ali786
#3
سلام

ممنون که راهنمایی کردین. من این اطلاعات روی برای توسعه یه سری ماژول در یک سی ام اس میخواستم ( زوپس انجین ) . الان که چک کردم دیدم فرمت جدول های دیتابیس innodb هستش. پس با این حساب نیازی به تفکیک جدول ها نیست و فقط کافیه توی کوئری اون اطلاعات که لازمه بیارم

یا دقیق تر هر چیزی که قرار نیست ازش استفاده کنم توی کوئری مربوطه نیارم تا راندمان کار بالاتر بره

درسته؟

ممنون
  پاسخ
تشکر شده توسط :
#4
بله درسته
  پاسخ
تشکر شده توسط :
#5
خیلی ممنون
  پاسخ
تشکر شده توسط :
#6
برای اینکه خودم دقیقتر متوجه بشم اینو میپرسم. من یه دیتابیس دارم با این ساختار :

کد:
CREATE TABLE `{story}` (
  `id` int(10) NOT NULL auto_increment,
  `title` varchar(255) NOT NULL,
  `subtitle` varchar(255) NOT NULL,
  `alias` varchar(255) NOT NULL,
  `topic` int(10) NOT NULL,
  `type` varchar(25) NOT NULL default 'story',
  `short` text NOT NULL,
  `text` text NOT NULL,
  `keywords` varchar(255) NOT NULL,
  `description` varchar(255) NOT NULL,
  `important` tinyint(1) NOT NULL,
  `default` tinyint(1) NOT NULL,
  `status` tinyint(1) NOT NULL,
  `inlist` tinyint(1) NOT NULL,
  `create` int (10) NOT NULL,
  `update` int (10) NOT NULL,
  `publish` int (10) NOT NULL,
  `expire` int (10) NOT NULL,
  `author` int(10) NOT NULL,
  `link` varchar(255) NOT NULL,
  `source` varchar(255) NOT NULL,
  `order` int(10) NOT NULL,
  `hits` int(10) NOT NULL,
  `image` varchar(255) NOT NULL,
  `imagedesc` varchar(255) NOT NULL,
  `path` varchar(255) NOT NULL,
  `comments` int(10) unsigned NOT NULL,
  `allow_comments` tinyint(1) NOT NULL default '1',
  PRIMARY KEY (`id`),
  KEY `idxstoriestopic` (`topic`),
  KEY `title` (`title`),
  KEY `create` (`create`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

بعد یه کوئری میزنم به این شکل :

کد:
SELECT `news_story`.* FROM `news_story` ORDER BY `publish` DESC LIMIT 10

اگه کوئری رو به این شکل تغییر بدم آیا بهینه تر شده یا نه؟
کد:
SELECT `news_story`.`id`, `news_story`.`title`, `news_story`.`alias`, `news_story`.`type` FROM `news_story` ORDER BY `publish` DESC LIMIT 10

دو تا سوال دیگه هم دارم. اول اینکه به نظرتون راهی هست این کوئری بهینه تر از این که الان هست بشه؟
دوم اینکه این سی ام اس بر پایه زند ( نسخه ۲ ) داره نوشته میشه و اون لیمیت ۱۰ هم برای پیج نو ! آیا کلاس پیج نو زد با توجه به اینکه توی خودش تعداد برای هر صفحه رو تنظیم میکنیم آیا نیاز به لیمیت توی کوئری داره؟

من از همین جدول بالا با حدود ۱۰۰۰۰ رکورد هر دو تای این کوئری ها رو گرفتم و تفاوت خاصی بین زمان اجرا ندیدم. توی تست های مختلف زمانی بین 0.0170 تا 0.0250 ثانیه طول میکشید
  پاسخ
تشکر شده توسط :
#7
Xoops ؟ ZF2 ? مطمئنین؟
بله کوئری بهتر شده
در مورد سوال آخری من نفهمیدم چی گفتین؟
  پاسخ
تشکر شده توسط :
#8
خود زوپس که نه ! زوپس انجین : https://github.com/xoops/engine & http://xoopsengine.org که قرار بود در اصل به عنوان نسخه ۳ زوپس منتشر بشه ولی بین توسعه دهنها یه مقدار اختلاف پیش اومد و الان جداگانه داره توسعه پیدا میکنه با توجه به توسعه لاکپشتی زوپس ۲.۶ احتمال داره بعدا با هم ادغام بشن مجددا ( البته این نسخه قدیمیه با زند ۱ ولی نسخه جدید در حد آلفا تا چند هفته دیگه آماده میشه و اینجا قرار میگیره )

توی سوال دوم منظور این بود که هنگامی که از کلاس Paginator زند استفاده میشه آیا لازمه برای کوئری که قرار روی نتیجش Paginator اعمال بشه هم LIMIT تعریف کرد یا همون LIMIT که خود Paginator اعمال میکنه کافیه ؟

یه نمونه اگه بخوام بگذارم همچین چیزی :

کد:
$paginator = Xoops_Zend_Paginator::factory($select);
      $paginator->setItemCountPerPage($limit);
      $paginator->setCurrentPageNumber($page);

$select نتیجه کوئری بالاست.
  پاسخ
تشکر شده توسط :
#9
در مورد سوال قبلیت:

در ادامه مطلب admin، روش دوم بهتره، ولی نیازی به تکرار نام جدول نیست: news_story.test news_story.test2...

یه گزینه ای هم هست بنام sql_cache و sql_no_cache که بعد از دستور select استفاده میشه - سیستم کش کوئری خود mysql هستش - از این هم می تونی استفاده کنی(اطلاع دقیقتری ندارم ازش)

فیلد های عددی """مثبت""" جدولت رو هم می تونی با گزینه unsigned بهینه تر کنی: unsigned tinyint یا unsigned int...

مشخصات جدولت رو هم کامل بزار و پیشفرض رهاش نکن. مثلاً:
engine = 'innodb' row_format = default auto_increment = 0 default character set = 'utf8' collate = 'utf8_general_ci';

بعضی از فیلد ها رو که مطمعنی همیشه طول ثابت دارن می تونی char بزاری بجای varChar - و collate ش رو هم bin قرار بده

در آخر اگر می تونی فیلد های این جدول رو تفکیک کن(یک جدول جدا بساز) تا جداول و بخش ها دیگه سایت هم بتونن ازش استفاده کنن - مثل type/category/commenting/keyword/description...
وبلاگ: Yousha.Blog.ir


 کد کمتر => خطای کمتر => قابل فهمتر => خوانایی بالاتر => نگهداری بهتر

  پاسخ
تشکر شده توسط :
#10
راستش من کوئری رو به صورت یه تابع توی یه کلاس مودل به این شکل مینویسم :

کد:
public function Story_GetAdminList($order ,$limit)
    {
        return $this->select()->from($this ,array('id' ,'title' ,'alias' ,'type'))->order($order)->limit($limit);
    }

اون news_story.test news_story.test2 رو خود سیستم میسازه. احتمالا باید کلاس مربوط به ساخت این کوئری رو ادیت کرد. ( که البته من فقط میتونم پیشنهادش رو بدم )

ولی مواردی که در مورد ساختار جدول گفتید درسته و سعی میکنم توی تمام دیتابیس ها اعمالش کنم.
  پاسخ
تشکر شده توسط :


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان