• 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
جایگزین برای GROUP BY
#1
سلام
دارم روی یه سیستم خبر / وبلاگ کار میکنم. جدیدا بهش آپشن مولتی کتیگوری اضافه کردم. برای این کار یه جدول ساختم و شماره خبر و شاخه رو توش ذخیره میکنم. به این صورت که اگه یه خبر مثلا توی ۵ تا شاخه باشه پنج ردیف جدید به اون جدول اضافه میشه.

برای خروجی گرفتن از اون جدول برای اینکه خروجی آی دی خبر یکتا باشه همچین کوئری نوشتم

[undefined=undefined]
SELECT `story` FROM `news_link` WHERE (`topic` IN (1, 2) AND `status` = 1) GROUP BY `story` ORDER BY `publish` DESC, `id` DESC LIMIT 10[/undefined]

برای تست حدود ۵۰۰۰۰ تا خبر رو به صورت رندم توی شاخه های مختلف وارد کردم و اون جدول لینک که اطلاعات شاخه - خبر توشه حدود ۸۵۰۰۰ ردیف داره. وقتی از کوئری بالا برای گرفتن نتایج استفاده میکنم زمان اجرا کوئری 0.1211 است و وقتی GROUP BY `story رو حذف میکنم این زمان تا حد 0.0005 ثانیه افت پیدا میکنه.

پیشنهادی دارید که چطوری این کوئری رو اجرا کنم که زمان کمتری ببره و بهینه تر بشه؟

ساختار اون جدوله هم اینه
[undefined=undefined]
CREATE TABLE `news_link` (
`id` int (10) unsigned NOT NULL auto_increment,
`story` int(10) unsigned NOT NULL,
`topic` int(10) unsigned NOT NULL,
`publish` int(10) unsigned NOT NULL,
`status` tinyint(1) unsigned NOT NULL,
`author` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `story` (`story`),
KEY `topic` (`topic`),
KEY `publish` (`publish`),
KEY `status` (`status`),
KEY `author` (`author`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;[/undefined]
  پاسخ
تشکر شده توسط :
#2
order by rand() بزن
  پاسخ
تشکر شده توسط :
#3
این خروجی رندم نمیده؟
  پاسخ
تشکر شده توسط :
#4
ببخشید من کلاً گیج شدم فکر کردم میخوای خروجی رندم بگیری Blush
اینو امتحان کن
کد:
SELECT DISTINCT `story` FROM `news_link` WHERE (`topic` IN (1, 2) AND `status` = 1)  ORDER BY `publish` DESC, `id` DESC LIMIT 10
  پاسخ
تشکر شده توسط : voltan
#5
دستت درد نکنه ! DISTINCT کارم رو راه انداخت
  پاسخ
تشکر شده توسط :
#6
زمان اجراش چقدر بود ؟
  پاسخ
تشکر شده توسط :
#7
خیلی کمتر چیزی حدود 0.0010 ثانیه. الان روی یه جدول با حدود ۹۵۰۰ ردیف داره تست میگیرم زمانی حدود 0.0007 داره.
  پاسخ
تشکر شده توسط :


پرش به انجمن:


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