Приветы!
Ребят, скажите какой выход видите в такой ситуации:
есть таблица (30к записей), в таблице есть поля "deleted" и "approved". Когда выводим посты обычным юзерам пост должен быть не удален и зааппрувлен, запрос что-то типа:
SQL |
SELECT ... FROM `posts` WHERE `deleted` = 0 AND `approved` = 1 |
SQL |
SELECT SQL_NO_CACHE * FROM `posts` WHERE `approved` = 1 AND `deleted` = 0 LIMIT 0, 10; |
SQL |
SELECT SQL_NO_CACHE * FROM `posts` WHERE `approved` = 1 AND `deleted` = 0 ORDER BY `post_id` DESC LIMIT 0, 10; |
Цитата (Alchemist @ 20.06.2009 - 15:34) |
а что EXPLAIN говорит ? |
SQL |
EXPLAIN SELECT SQL_NO_CACHE * FROM `posts` WHERE `approved` = 1 AND `deleted` = 0 LIMIT 0, 10 |
Код |
id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE posts ref approved approved 2 const,const 30280 |
SQL |
EXPLAIN SELECT SQL_NO_CACHE * FROM `posts` WHERE `approved` =1 AND `deleted` =0 ORDER BY `post_id` LIMIT 0, 10 |
Код |
id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE posts ref approved approved 2 const,const 30245 Using where; Using filesort |
Цитата (HardWoman @ 20.06.2009 - 15:37) |
А сколько всего значений может принимать deleted и approved ? Если каждый 0 и 1, то может имеет смысл сделать один столбец и 4 значения? 00, 01,11, 10 (1,2,3,4) тогда условие будет одно? |
SQL |
SELECT SQL_NO_CACHE * FROM `posts` WHERE `approved` = 1 ORDER BY `post_id` LIMIT 0, 10 |
SQL |
EXPLAIN SELECT SQL_NO_CACHE * FROM `posts` WHERE `approved` = 1 AND `deleted` = 0 ORDER BY `post_id` LIMIT 0, 10 |
Цитата |
может применить только один индекс на запросе |
Цитата |
1 SIMPLE posts ref approved approved 2 const,const 30245 Using where; Using filesort |
Цитата (Alchemist @ 20.06.2009 - 21:00) |
какой нафик filesort ?!!! при сортировке по одному параметру, да еще являющемуся PRIMARY KEY никакого файлсорта быть не должно ! |
Цитата (Alchemist @ 20.06.2009 - 16:00) |
попробуй сделать OPTIMIZE TABLE, а потом ANALYZE TABLE. Если не поможет, сбрось индексы, выставь по новой, и опять оптимизируй. |
Код |
id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE links_posts ref approved approved 1 const 30675 Using where; Using filesort |
Цитата (Alchemist @ 20.06.2009 - 16:00) |
ЗЫ: О, вот что я еще подумал: убери составной индекс с полей и сделай два раздельных. |
SQL |
EXPLAIN SELECT SQL_NO_CACHE * FROM `posts` WHERE `approved` =1 AND `deleted` =0 ORDER BY `post_id` LIMIT 0, 10 |
Код |
id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE links_posts ref approved,deleted deleted 1 const 30368 Using where; Using filesort |
Цитата (kirik @ 20.06.2009 - 21:04) |
1SIMPLElinks_postsrefapproved,deleteddeleted1const30368Using where; Using filesort |
SQL |
ORDER BY `post_id`, `approved` DESC, `deleted`; |
Цитата (Alchemist @ 20.06.2009 - 21:09) |
glock18, если сортировка больше чем по одному полю - filesort неизбежен. |
Цитата |
Когда выводим посты обычным юзерам пост должен быть не удален и зааппрувлен |
Цитата (Alchemist @ 20.06.2009 - 16:09) |
кинь сюда дамп таблички, поиграюсь у себя... |
SQL |
CREATE TABLE `posts` ( `post_id` mediumint(8) unsigned NOT NULL auto_increment, `original_id` mediumint(8) unsigned NOT NULL default '0', `author` mediumint(8) unsigned NOT NULL, `title` varchar(100) NOT NULL, `category` varchar(50) NOT NULL, `genre` varchar(255) NOT NULL, `description` text NOT NULL, `release` smallint(4) unsigned NOT NULL, `studio` varchar(50) NOT NULL, `director` varchar(50) NOT NULL, `starring` text NOT NULL, `other` text NOT NULL, `password` varchar(100) NOT NULL, `front_cover` tinyint(1) unsigned NOT NULL default '0', `screenshot` tinyint(1) unsigned NOT NULL default '0', `back_cover` tinyint(1) unsigned NOT NULL default '0', `views` mediumint(8) unsigned NOT NULL default '0', `rate_num` mediumint(8) unsigned NOT NULL default '0', `rate_sum` mediumint(8) unsigned NOT NULL default '0', `comments` smallint(5) unsigned NOT NULL default '0', `approved` tinyint(1) unsigned NOT NULL default '0', `deleted` tinyint(1) unsigned NOT NULL default '0', `on_top` tinyint(1) unsigned NOT NULL default '0', `time_add` int(10) unsigned NOT NULL, `edit_date` int(10) unsigned NOT NULL default '0', `editor_id` mediumint(8) unsigned NOT NULL default '0', `backup` tinyint(1) NOT NULL default '0', PRIMARY KEY (`post_id`), KEY `on_top` (`on_top`), KEY `category` (`category`), KEY `title` (`title`(20)), KEY `approved` (`approved`), KEY `deleted` (`deleted`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; |
Цитата (HardWoman @ 20.06.2009 - 16:17) |
Для других групп пользователей топик может быть доступен на удаление? |
SQL |
EXPLAIN SELECT SQL_NO_CACHE * FROM `posts` WHERE `approved` =1 AND `deleted` =0 ORDER BY `post_id` LIMIT 0, 10 |
Код |
1 SIMPLE posts index NULL PRIMARY 3 NULL 30696 Using where |
Цитата (HardWoman @ 20.06.2009 - 16:31) |
А почему бы не сделать отдельную таблицу? На удаленные топики? |
Цитата (Alchemist @ 20.06.2009 - 16:33) |
ну собсно я хотел это первым номером проверить |
Цитата |
Вот ерунда... Получается что поля, которые не могут исключить сразу много строк вообще не стоит в индекс вносить?.. |
Цитата (kirik @ 20.06.2009 - 23:31) |
Выходит что в этом случае индексы только мешают? |
Цитата (HardWoman @ 20.06.2009 - 16:41) |
такие индексы беспонтовые и как теперь видно и вредные |