Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database design 最优化的选择方式;旗杆;使用where&;mysql数据库的限制_Database Design_Mysql_Query Optimization_Spam Prevention - Fatal编程技术网

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分等),但如果它只是一个布尔值,则看起来更干净!谢谢确切地如果你不需要分数,为什么要存储它。它只是一个缓存,所以你可以随时在以后更改它,如果你需要实际的分数。太棒了,因为当它被标记时,我无论如何都会进行更新,那就好了。谢谢。我想这有点待定,但我不认为他们会太疯狂。谢谢你保存乘法运算。不会受伤的!