【问题标题】: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)

【问题讨论】:

    标签: php mysql


    【解决方案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

      【讨论】:

        猜你喜欢
        • 2016-12-25
        • 2011-03-14
        • 2014-05-11
        • 1970-01-01
        • 1970-01-01
        • 2014-07-19
        • 1970-01-01
        • 2020-10-19
        • 1970-01-01
        相关资源
        最近更新 更多