从一个类别中获取最新 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 个帖子的最佳方式是啥?的主要内容,如果未能解决你的问题,请参考以下文章