从多个类别中选择文章的表现

时间:2016-03-03 09:35:58

标签: mysql

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`);

我的测试:

QUERY1

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

QUERY2

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

QUERY3

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

query4

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 正在使用索引,因为执行时间远低于其他时间。

问题:

  1. 已创建有索引,已更新没有索引,为什么 query3 query4 获得了保存执行时间?
  2. 如何让 query3 使用索引,或者如何提高 Query3 的性能?

2 个答案:

答案 0 :(得分:1)

根据这个MySQL document,MySQL不能使用索引进行排序,如果"查询在索引的非连续部分使用ORDER BY"。这就是" in"子句。

如果您的ID列是自动递增的整数,并且created是指创建记录的日期,则您可以通过ID进行排序。这将实现我相信你想要做的事情,但它当然是一个黑客......

答案 1 :(得分:0)

你正在使用"创建"是您不能用作字段名称的表格关键字。 但
从文章中选择标题,其中category_id在(1,3,7,12,234,333,456)中按created DESC限制0,20排序 要么 从文章中选择art.title作为艺术,其中art.category_id在(1,3,7,12,234,333,456)中排序art.created DESC limit 0,20

试试这是工作