【发布时间】:2010-11-06 19:06:17
【问题描述】:
我的表结构如下:
+----------+------------------------+------+-----+------------------------------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+------------------------+------+-----+------------------------------------------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| body | varchar(200) | NO | | Hey now! | |
| flags | int(10) unsigned | NO | | 0 | |
| views | int(10) unsigned | NO | | 1 | |
+----------+------------------------+------+-----+------------------------------------------+----------------+
并且我想选择“仅标记未超过其总视图 5% 且已被查看至少 5 次的行。”
这是我的查询:
SELECT id,body
FROM tablename
WHERE id NOT IN (
SELECT id
FROM tablename
WHERE flags/views * 100 > 5.0
AND views > 5
ORDER BY id DESC
)
ORDER BY id DESC
LIMIT 6
我认为选择“标记超过总视图 30% 的每一行”将产生大量开销,尤其是当表增长到非常多的行时。有人可以帮我优化一下吗?
我还在考虑创建一个“flag_score”列,并在每次标记某些内容时更新它,这样我就可以在 flag_score 列上进行选择,而不是在选择中进行数学运算(并为自己节省额外的选择查询)。这听起来像是一个好方法吗?非常感谢。
编辑:我遇到的另一个问题是,如果我只是做类似的事情:
SELECT *
FROM tabelname
WHERE flags/views * 100 > 5.0
AND views > 5
ORDER BY id DESC
LIMIT 5
...如果 5 个帖子中有 4 个被标记,它只会返回 1 行!我希望语句返回 5 行。
【问题讨论】:
标签: database-design mysql query-optimization spam-prevention