从类别中获取最新5个帖子的最佳方式?

时间:2013-09-20 06:09:28

标签: php mysql

我已经设置了我的新闻脚本,因此它会显示最新的5个帖子(与当前查看的帖子相同的类别 - 不包括当前查看的帖子)。

我的SQL看起来像这样:

SELECT title, sid, url, category
FROM news 
WHERE category = ? AND sid <> ? ORDER BY sid DESC LIMIT 5

以下是查询的EXPLAIN:

+----+-------------+----------+------+------------------+----------+---------+-------+------+-------------+
| id | select_type | table    | type | possible_keys    | key      | key_len | ref   | rows | Extra       |
+----+-------------+----------+------+------------------+----------+---------+-------+------+-------------+
|  1 | SIMPLE      | news     | ref  | PRIMARY,category | category | 98      | const |  154 | Using where |
+----+-------------+----------+------+------------------+----------+---------+-------+------+-------------+
1 row in set (0.00 sec)

我想知道的是 - 有没有办法优化我的查询,所以它不必扫描这么多行来获得5个结果?

修改

类别索引的结果:

mysql> EXPLAIN EXTENDED SELECT title, sid, url, category FROM news WHERE category = ? AND sid <> ? ORDER BY sid DESC LIMIT 5\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: news
         type: ref
possible_keys: PRIMARY,category
          key: category
      key_len: 98
          ref: const
         rows: 156
     filtered: 100.00
        Extra: Using where
1 row in set, 1 warning (0.00 sec)

结果没有类别索引:

mysql> EXPLAIN EXTENDED SELECT title, sid, url, category FROM news WHERE category = ? AND sid <> ? ORDER BY sid DESC LIMIT 5\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: news
         type: index
possible_keys: PRIMARY
          key: PRIMARY
      key_len: 2
          ref: NULL
         rows: 5
     filtered: 7420.00
        Extra: Using where
1 row in set, 1 warning (0.00 sec)

3 个答案:

答案 0 :(得分:3)

编辑:此答案不起作用

根据下面的@ Mayhem的评论,按降序指定列索引不会做任何事情,但可能将来做某事。这在version 5.7中甚至是正确的。我认为这有助于保持这一点,因为人们可能认为使用DESC实际上做了一些事情。

原始答案

如果您在sid上按降序创建索引(顺序很重要),则应在ORDER BY子句中使用该索引,并大量改进结果。

create语句应如下所示:

CREATE INDEX IX_news_category_sid
    ON news (category, sid DESC)

答案 1 :(得分:0)

您可以为最新的表创建另一个表。当你有超过1000万行时,这非常方便。只需为实际表创建一个用于插入和删除的触发器,这样您将始终拥有更新记录,并且只有您想要的行数。

答案 2 :(得分:0)

请参阅此网站了解Table Indexing这会大大提高您的搜索量。

CREATE INDEX语句用于在表中创建索引。 索引允许数据库应用程序快速查找数据;没有阅读整个表格。

link:http://www.w3schools.com/sql/sql_create_index.asp