我在使用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等有数百万(或数十亿)的评论,他们如何快速得到该对象的评论(视频,帖子等)?
要恢复我的问题:
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 |
+----+-------------+----------+------+---------------+----------+---------+-------+------+-----------------------------+
答案 0 :(得分:2)
这里的问题是mysql每个表只使用一个索引。这就是为什么您published
上的索引未被使用的原因。您的解释显示它使用索引来标识要返回的行,这使得RDBMS无法使用索引进行排序。
您应该做的是在(user_id,published)