Никогда не видел этого раньше. Выполняя тот же запрос, 1 заставляет индекс. Без индекса результаты неверны (в неправильном порядке), с индексом результаты находятся в правильном порядке. Только проблема с использованием индекса заключается в том, что по какой-то причине он медленнее. Индекс на comment_id и user_idс индексом, возвращает другой результат
без индекса:
SELECT DISTINCT topic_id FROM comments
WHERE user_id=9384
AND (status = 1 or status = 0)
ORDER BY comment_id DESC LIMIT 15
с индексом:
SELECT DISTINCT topic_id FROM comments force index(index_comment_user)
WHERE user_id=9384
AND (status = 1 or status = 0)
ORDER BY comment_id DESC LIMIT 15
Любые идеи? Я действительно хочу получить правильный порядок, не замедляя запрос. Я бы сделал так, чтобы индекс сделал это.
Вот структура SQL.
CREATE TABLE `db`.`comments` (
`comment_id` int(10) unsigned NOT NULL auto_increment,
`old_comments_id` mediumint(8) unsigned default NULL,
`user_id` mediumint(8) unsigned default NULL,
`content` text character set latin1,
`status` tinyint(3) unsigned default NULL,
`added_date` datetime default NULL,
`category_id` tinyint(3) unsigned default NULL,
`helpful` tinyint(3) unsigned default NULL,
`modified_date` datetime default NULL,
`topic_id` mediumint(8) unsigned default NULL,
`last_mod_user_id` mediumint(8) unsigned default NULL,
PRIMARY KEY USING BTREE (`comment_id`),
KEY `Index_user_id` (`user_id`),
KEY `Index_added_date` (`added_date`),
KEY `Index_comments_status` USING BTREE (`status`),
KEY `Index_user_activity` USING BTREE (`comment_id`,`user_id`),
KEY `Index_user_activity2` USING BTREE (`user_id`,`topic_id`),
KEY `Index_question_id` USING BTREE (`topic_id`,`status`),
KEY `Index_user_activity3` (`user_id`,`status`,`topic_id`,`comment_id`)
) ENGINE=InnoDB AUTO_INCREMENT=2040237 DEFAULT CHARSET=utf8;
Является ли MySQL требователен порядка столбцов в индексе - то есть, если вы создаете индекс на user_id , column_id вместо этого поможет? – Rup
Просьба также показать точное определение таблицы. – Tomalak
sql table structure добавлено – David