Php 如果我知道数据库查询只会偶尔返回结果,那么最有效的方法是什么?
我正在努力研究如何在我的网站上实现一项新的功能。我的网站允许人们下载一组成员上传的东西。新功能将允许组中的一名成员成为无法下载上载内容的“超级”用户。所以现在我的问题(或多或少)是- 我想我会在“members”表中存储成员的“super”状态,因此在执行查询之前,我可能会查找它以获取超级成员的成员idPhp 如果我知道数据库查询只会偶尔返回结果,那么最有效的方法是什么?,php,mysql,session-variables,Php,Mysql,Session Variables,我正在努力研究如何在我的网站上实现一项新的功能。我的网站允许人们下载一组成员上传的东西。新功能将允许组中的一名成员成为无法下载上载内容的“超级”用户。所以现在我的问题(或多或少)是- 我想我会在“members”表中存储成员的“super”状态,因此在执行查询之前,我可能会查找它以获取超级成员的成员id $all_group_members = SELECT members FROM groups WHERE group_id = $groupid $super_member = SELECT
$all_group_members = SELECT members FROM groups WHERE group_id = $groupid
$super_member = SELECT memberid FROM members WHERE memberid IN ($all_group_members) AND super_status = 1
然后将查询修改为-
SELECT * FROM uploads WHERE group = $groupid AND uploader ! = $super_member
但是,组中可能并不总是有超级成员,因此我的问题是是否有更有效的方法来实现这一点,例如将超级成员ID存储在会话cookie中?将超级用户id存储在组表中怎么样?仍然需要执行查询-
SELECT super_user FROM groups WHERE groupid = $group_id
但至少少了一个问题
我知道只有5%的时间会有一个超级用户,所以95%的时间会被浪费掉。也许会话cookie可以存储一个组\u has\u super\u user变量
还有其他我不知道的方法吗
谢谢我想,其他群成员无法从我的群中下载任何东西。因此,只需在上传中添加一个可下载字段,并将其设置为
- 1,如果简单成员已上载,或
- 0,如果超级成员具有
SELECT * FROM uploads WHERE group = $groupid AND downloadable != 0
此外,如果成员身份正在更改(例如,其他人获得超级权限),则应在组中重新计算这些标志
不要忘记为groupid+downloadable(或downloadable+groupid)创建索引(或将主键设置为主键) +1但答案不完整,因为没有一些描述词。请解释一下将主键设置为groupid+downloadable好吗?为什么这很重要?感谢如果不创建密钥,SQL server必须进行完整的表扫描:它会检查每条记录的条件。为表编制索引时,SQL server会创建一些索引文件(您看不到),用于按排序顺序而不是随机顺序列出记录。因此,使用索引,SQL server可以快速找到第一条匹配记录,并在找到第一条不匹配记录时停止扫描。你可以自己试试:把联系人的名字按随机顺序列成一个列表,另一个按字母顺序列成一个列表,然后试着在两种情况下找到一个人:全表扫描和二进制搜索。哪个更快?
CREATE TABLE uploads (id, user_id, …)
CREATE TABLE groups (id, …)
CREATE TABLE group_users (group_id, user_id, is_super, …)
SELECT u.*
FROM group_users gu
JOIN uploads u
ON u.user_id = gu.user_id
WHERE gu.group_id = $group_id
AND gu.is_super = 0
SELECT * FROM uploads WHERE group = $groupid AND downloadable != 0