将用户注释存储在数据库中

时间:2017-01-14 21:53:50

标签: php mysql database-design

我在使用MySql时遇到了一些性能问题。选择与特定URL id相关的注释的查询大约需要1.5~2秒才能完成。

评论表

CREATE TABLE `comments` (
    `id`                INT UNSIGNED NOT NULL AUTO_INCREMENT,
    `url_id`            INT UNSIGNED NOT NULL,
    `user_id`           INT UNSIGNED NOT NULL,
    `published`         TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `votes_up`          SMALLINT UNSIGNED NOT NULL DEFAULT 0,
    `votes_down`        SMALLINT UNSIGNED NULL DEFAULT 0,
    `text`              TEXT,

    PRIMARY KEY (id),
    INDEX (url_id),
    INDEX (user_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

我已插入100.000条评论,并执行了此查询:SELECT * FROM comments WHERE url_id = 33 ORDER BY published ASC LIMIT 0,5

这是正常的吗?一个简单的查询需要大约2秒才能完成?我应该为评论的文本创建一个单独的表吗?

Youtube,Facebook等有数百万(或数十亿)的评论,他们如何快速得到该对象的评论(视频,帖子等)?

要恢复我的问题:

  1. 我不再担心性能并坚持这一点,当网站达到一定数量的用户活动时,我开始担心这一点。
  2. 如果我需要担心这个,我的表格结构有什么问题?我需要更改什么才能缩短查询的完成时间?
  3. 更新

    explain输出:

    +----+-------------+----------+------+---------------+----------+---------+-------+------+-----------------------------+
    | id | select_type | table    | type | possible_keys | key      | key_len | ref   | rows | Extra                       |
    +----+-------------+----------+------+---------------+----------+---------+-------+------+-----------------------------+
    |  1 | SIMPLE      | comments | ref  | url_id        | url_id   | 4       | const |  549 | Using where; Using filesort |
    +----+-------------+----------+------+---------------+----------+---------+-------+------+-----------------------------+
    

1 个答案:

答案 0 :(得分:2)

这里的问题是mysql每个表只使用一个索引。这就是为什么您published上的索引未被使用的原因。您的解释显示它使用索引来标识要返回的行,这使得RDBMS无法使用索引进行排序。

您应该做的是在(user_id,published)

上创建综合索引