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)。我认为保存每个用户的所有评论不是一个好主意,这是一个巨大的冗余数据量。我想我只会限制筛选条件的输出,这样文件排序就不必对太多的条目进行排序。在用户体验中,只要用户的数量不是很小,就不会注意到这一点的用户,并希望看到他们的许多(旧)条目。