Database design 最优化的选择方式;旗杆;使用where&;mysql数据库的限制
我有以下表格结构:Database design 最优化的选择方式;旗杆;使用where&;mysql数据库的限制,database-design,mysql,query-optimization,spam-prevention,Database Design,Mysql,Query Optimization,Spam Prevention,我有以下表格结构: +----------+------------------------+------+-----+------------------------------------------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------+-----
+----------+------------------------+------+-----+------------------------------------------+----------------+
| 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中进行计算(并保存额外的select查询)。这听起来是个好办法吗?非常感谢
编辑:我遇到的另一个问题是,如果我只是做以下事情:
SELECT *
FROM tabelname
WHERE flags/views * 100 > 5.0
AND views > 5
ORDER BY id DESC
LIMIT 5
。。。如果5个帖子中有4个被标记,它将只返回1行!我想让语句返回5行。数学不是很昂贵,所以只要你的条目少于,比如说,100000条,你就可以这样做,不用担心 根据您自己的建议,您可以随时缓存条件:
UPDATE tablename
SET is_over_30_percent = (flags/views * 100 > 5.0)
WHERE id='id_of_updated_entry'
它的优点是,您可以将索引放在*上,它的值大于30%,因此查询根本不需要任何性能
记住在更新的条目*的*id上加上一个组合索引*和日期和id,这样索引就可以用于选择和排序(按顺序排序很昂贵)。我想说缓存是一种合理的方法,但这一切都取决于系统中的读/写情况。如果人们一直在标记,那么每次都需要更新标记分数值,因此您的昂贵操作将频繁发生
另外,我不确定您是否会获得性能提升,但您可以使用flag/views>0.05来保存每个查询的乘法运算,尽管我不认为这一部分会那么昂贵。哦,顺便说一句:如果您担心性能,请尽量避免子选择。如果必须使用程序语言,请使用程序语言。MySQL在优化方面非常差。谢谢!我认为order by相当昂贵,但我不确定。那么,作为布尔值(又称tinyint)存储是否超过30%?听起来是个好主意!我只是想存储实际分数(即5分、10分或0分等),但如果它只是一个布尔值,则看起来更干净!谢谢确切地如果你不需要分数,为什么要存储它。它只是一个缓存,所以你可以随时在以后更改它,如果你需要实际的分数。太棒了,因为当它被标记时,我无论如何都会进行更新,那就好了。谢谢。我想这有点待定,但我不认为他们会太疯狂。谢谢你保存乘法运算。不会受伤的!