Mysql 在“中使用订单索引”;选择。。从…起其中,(…)列的顺序为;

Mysql 在“中使用订单索引”;选择。。从…起其中,(…)列的顺序为;,mysql,Mysql,是否有任何方法使以下查询使用索引而不使用文件排序: SELECT c1 FROM table WHERE c2 IN (val_1, val_2, ..., val_n) ORDER BY c3 我猜机会不大,所以如果不可能,有没有办法让以下问题使用索引(或快速): 该表包含用户的评论: CREATE TABLE `comments` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `user_id` int(10) unsigned

是否有任何方法使以下查询使用索引而不使用文件排序:

SELECT c1 FROM table WHERE c2 IN (val_1, val_2, ..., val_n) ORDER BY c3
我猜机会不大,所以如果不可能,有没有办法让以下问题使用索引(或快速):

该表包含用户的评论:

CREATE TABLE `comments` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` int(10) unsigned NOT NULL,
  `comment` varchar(180) CHARACTER SET utf8 NOT NULL,
  `timestamp` int(11) unsigned NOT NULL)

  ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
我想按时间戳(上面的比较查询)顺序输出特定用户的注释(例如,用户_x跟随的用户)

我能想象的使这个查询快速的唯一方法是插入一个新变量,该变量对于单个用户的最后15个条目设置为1。因此,第一个查询每个用户最多只能得到15行,因此mysql必须排序的最大行数是15*n,其中n是从中选择注释的用户数

编辑:这就是解释输出的原因:

id  select_type table    type   possible_keys                   key                             key_len   ref   rows    Extra
1   SIMPLE      comments range  idx_comments_user_id_timestamp  idx_comments_user_id_timestamp  4         NULL  1113    Using where; Using index; Using filesort

您是否查看了Yes,但我还没有找到SELECT IN语句的示例。(但我越了解查询背后的逻辑,就越怀疑是否可以使用索引)。in语句中是否存在大量VAL?如果是这样,将它们放入另一个表(索引)并进行连接而不是使用in语句是否值得。VAL的数量由用户可以跟随的最大用户数定义(可能上限为100)。我认为保存每个用户的所有评论不是一个好主意,这是一个巨大的冗余数据量。我想我只会限制筛选条件的输出,这样文件排序就不必对太多的条目进行排序。在用户体验中,只要用户的数量不是很小,就不会注意到这一点的用户,并希望看到他们的许多(旧)条目。