собственно, не флейма ради а пользы для:
mysql, табличка вида
table t1 (
`id_picture` int(11) NOT NULL auto_increment,
`public` tinyint(1) NOT NULL,
`activ` tinyint(1) NOT NULL default '1',
`date` datetime NOT NULL,
`album` int(11) NOT NULL,
`views` int(11) NOT NULL,
PRIMARY KEY (`id_picture`),
KEY `public` (`public`),
KEY `activ` (`activ`),
KEY `date` (`date`),
KEY `album` (`album`),
KEY `views` (`views`),
KEY `album_2` (`album`,`activ`,`public`),
KEY `date_2` (`date`,`album`,`public`,`activ`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ;
миллион записей. В 300 000 из них album равен 2.
Запрос вида
SELECT id_picture,user FROM pictures USE INDEX(date_2) WHERE album=2 and activ=1 and public=1 ORDER BY date DESC LIMIT 299900, 1
выполняется непомерно долго. Запрос вида
SELECT id_picture,user FROM pictures ORDER BY date DESC LIMIT 299900, 1
выполняется втрое быстрее, результат устраивает.
собственно, проблема понятна. Mysql, видимо, строит индекс так, что в данном случае после выборки по WHERE приходится сортировать по дате "вручную", т.е. невозможно использовать индексы. А там 300 000 строк. Ну она и старается, как может. По моему скромному мнению (я не специалист в создании СУБД ником боком), возможно можно попытаться строить индекс по другому и использовать данные индекса по дате чтобы сортировать результат. Я в этом не уверен.
Так вот, к чему разговор. Я сейчас постгрес ставлю. Хочу поглядеть чего там и как. Больше ничего поставить возможности нет. А результаты сравнения были бы интересны. Посему просьба: если у кого есть тестовая машинка с поднятым mysql, oracle, mssql, db2 etc, прошу провести тест, если есть возможность. За единицу измерения времени запроса предлагаю взять средний результат MySQL для 20 запросов и измерять в my.
mysql5.0.22
Если кому интересно - присоединяйтесь.
Спасибо.
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум MySQL: Странное поведение left join (2017)
- Форум [mysql] ORDER BY … DESC LIMIT 1 (2011)
- Форум MySQL full text search (2004)
- Форум Оптимизации 5 000 000 таблицы (2015)
- Форум MySQL vs. PostgreSQL holy war (2013)
- Форум вложенные запросы - mysql (2007)
- Форум MySQL, INSERT ... SELECT ... FROM DUAL (2012)
- Форум Какой запрос быстрее/оптимальнее (2021)
- Форум Синтаксис запросов MySQL. Строки в WHERE. (2014)
- Форум Как лучше select * from X where Z<A order by Z desc limit 1 в MySQL? (2004)