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

Posted

技术标签:

【中文标题】从一个类别中获取最新 5 个帖子的最佳方式是啥?【英文标题】:Best way to get the latest 5 posts from a category?从一个类别中获取最新 5 个帖子的最佳方式是什么? 【发布时间】:2013-09-20 06:09:28 【问题描述】:

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

我的 SQL 看起来像这样:

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

这里是查询的解释:

+----+-------------+----------+------+------------------+----------+---------+-------+------+-------------+
| 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)

【问题讨论】:

【参考方案1】:

编辑:此答案无效

根据下面@Mayhem 的评论,按降序指定列索引没有任何作用,但可能 将来会有所作为。在version 5.7 中也是如此。我认为这对于保持这一点很有用,因为人们可能会认为使用 DESC 实际上会有所作为。

原答案

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

create 语句应如下所示:

CREATE INDEX IX_news_category_sid
    ON news (category, sid DESC)

【讨论】:

如何在“order by”子句中使用该索引? 查询优化器会自行选择使用索引,您无需指定任何内容。 查询优化器仍然选择“类别”索引而不是其他任何索引。当我执行“FORCE INDEX”(作为测试)时,它现在需要使用新索引扫描 300 多行。 我仍然遇到同样的问题:/(非常感谢您的帮助) - 它仍然想使用类别索引,当我使用“FORCE INDEX”时,它需要扫描 150 行。 我弄清楚了为什么它不起作用:“一个 index_col_name 规范可以以 ASC 或 DESC 结尾。这些关键字被允许用于未来扩展以指定升序或降序索引值存储。目前,它们已被解析但被忽略;索引值始终按升序存储"【参考方案2】:

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

【讨论】:

【参考方案3】:

请参阅此网站以获取 Table Indexing 这会大大提高您的搜索效率。

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

链接:http://www.w3schools.com/sql/sql_create_index.asp

【讨论】:

以上是关于从一个类别中获取最新 5 个帖子的最佳方式是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在移动应用程序中持续从服务器获取更新的最佳方式是啥?

类别集合的最佳设计

显示每个类别的最新帖子的下拉导航菜单

从特定的 Wordpress 类别中提取帖子

从 Wordpress 中自定义帖子类型的类别中获取 ACF 文本字段值

雄辩的从所有类别中获得 4 个帖子