CREATE TABLE IF NOT EXISTS `articles` (
`id` int(11) NOT NULL,
`category_id` int(11) NOT NULL,
`title` varchar(100) NOT NULL,
`created` int(11) NOT NULL,
`updated` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
ALTER TABLE `articles`
ADD PRIMARY KEY (`id`), ADD KEY `category_id` (`category_id`,`created`);
我的测试:
SELECT sql_no_cache * FROM `articles` WHERE category_id=1 order by created limit 0,15
平均时间:0.0003
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE articles ref category_id category_id 4 const 1029 Using where
SELECT sql_no_cache * FROM `articles` WHERE category_id=1 order by updated limit 0,15
平均时间:0.0019
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE articles ref category_id category_id 4 const 1029 Using where; Using filesort
SELECT sql_no_cache * FROM `articles` WHERE category_id in (1,2,3) order by created limit 0,15
平均时间:0.0018
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE articles range category_id category_id 4 NULL 1105 Using where; Using filesort
SELECT sql_no_cache * FROM `articles` WHERE category_id in (1,2,3) order by updated limit 0,15
平均时间:0.0018
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE articles range category_id category_id 4 NULL 1105 Using where; Using filesort
我的最终需求是 query3 。
但是从测试中我认为只有 query1 正在使用索引,因为执行时间远低于其他时间。
答案 0 :(得分:1)
根据这个MySQL document,MySQL不能使用索引进行排序,如果"查询在索引的非连续部分使用ORDER BY"。这就是" in"子句。
如果您的ID列是自动递增的整数,并且created是指创建记录的日期,则您可以通过ID进行排序。这将实现我相信你想要做的事情,但它当然是一个黑客......
答案 1 :(得分:0)
created
DESC限制0,20排序
要么
从文章中选择art.title作为艺术,其中art.category_id在(1,3,7,12,234,333,456)中排序art.created
DESC limit 0,20
试试这是工作