我已经设置了我的新闻脚本,因此它会显示最新的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)
答案 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语句用于在表中创建索引。 索引允许数据库应用程序快速查找数据;没有阅读整个表格。