انجمن ایران پی اچ پی
جایگزین برای GROUP BY - نسخه قابل چاپ

+- https://forum.iranphp.org - انجمن ایران پی اچ پی
+-- انجمن: پایگاه داده/Database (/Forum-%D9%BE%D8%A7%DB%8C%DA%AF%D8%A7%D9%87-%D8%AF%D8%A7%D8%AF%D9%87-Database)
+--- انجمن: MySQL, MsSQL, PgSQL, SQLite, MongoDb (/Forum-MySQL-MsSQL-PgSQL-SQLite-MongoDb)
+--- موضوع: جایگزین برای GROUP BY (/Thread-%D8%AC%D8%A7%DB%8C%DA%AF%D8%B2%DB%8C%D9%86-%D8%A8%D8%B1%D8%A7%DB%8C-GROUP-BY)



جایگزین برای GROUP BY - voltan - ۱۳۹۱ آذر ۳ ۰۲:۵۸ عصر

سلام
دارم روی یه سیستم خبر / وبلاگ کار میکنم. جدیدا بهش آپشن مولتی کتیگوری اضافه کردم. برای این کار یه جدول ساختم و شماره خبر و شاخه رو توش ذخیره میکنم. به این صورت که اگه یه خبر مثلا توی ۵ تا شاخه باشه پنج ردیف جدید به اون جدول اضافه میشه.

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

[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]


RE: جایگزین برای GROUP BY - Reza - ۱۳۹۱ آذر ۳ ۱۱:۰۹ عصر

order by rand() بزن


RE: جایگزین برای GROUP BY - voltan - ۱۳۹۱ آذر ۳ ۱۱:۵۱ عصر

این خروجی رندم نمیده؟


RE: جایگزین برای GROUP BY - Reza - ۱۳۹۱ آذر ۴ ۰۲:۲۱ صبح

ببخشید من کلاً گیج شدم فکر کردم میخوای خروجی رندم بگیری Blush
اینو امتحان کن
کد:
SELECT DISTINCT `story` FROM `news_link` WHERE (`topic` IN (1, 2) AND `status` = 1)  ORDER BY `publish` DESC, `id` DESC LIMIT 10



RE: جایگزین برای GROUP BY - voltan - ۱۳۹۱ آذر ۴ ۱۱:۲۸ صبح

دستت درد نکنه ! DISTINCT کارم رو راه انداخت


RE: جایگزین برای GROUP BY - Reza - ۱۳۹۱ آذر ۴ ۰۳:۳۷ عصر

زمان اجراش چقدر بود ؟


RE: جایگزین برای GROUP BY - voltan - ۱۳۹۱ آذر ۴ ۰۴:۵۱ عصر

خیلی کمتر چیزی حدود 0.0010 ثانیه. الان روی یه جدول با حدود ۹۵۰۰ ردیف داره تست میگیرم زمانی حدود 0.0007 داره.