2

我已经设置了我的新闻脚本,因此它将显示最新的 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)
4

3 回答 3

3

编辑:这个答案不起作用

根据下面@Mayhem 的评论,按降序指定列索引没有任何作用,但将来可能会有所作为。在5.7 版本中也是如此。我认为这对于保持这一点很有用,因为人们可能会认为 usingDESC确实做了一些事情。

原始答案

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

创建语句应如下所示:

CREATE INDEX IX_news_category_sid
    ON news (category, sid DESC)
于 2013-09-20T06:11:05.633 回答
0

please refer to this website for Table Indexing this improves your search a lot.

The CREATE INDEX statement is used to create indexes in tables. Indexes allow the database application to find data fast; without reading the whole table.

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

于 2013-09-20T06:18:32.870 回答
0

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

于 2013-09-20T06:13:46.917 回答