使用PHP在MySQL中查找帐户名最有效的方法是什么

使用PHP在MySQL中查找帐户名最有效的方法是什么,php,mysql,sql,Php,Mysql,Sql,我已经用php和MySQL编写了一个基本的web应用程序,它使用查询字符串来查找各种信息。例如:xxxxxxx.com/?profile=1245 非常基本的,第一次开发的web应用类型 我想创建不同的帐户,每个帐户都有自己的数据集。我想通过使用子域来区分这些帐户。例如:username.xxxxxxxx.com?profile=4527 我在Apache配置中设置了一个catchall,将所有子域转移到我的主域,然后我可以使用php将该子域拉出,如下所示: 现在,我的问题是: 在我看来(我对

我已经用php和MySQL编写了一个基本的web应用程序,它使用查询字符串来查找各种信息。例如:
xxxxxxx.com/?profile=1245

非常基本的,第一次开发的web应用类型

我想创建不同的帐户,每个帐户都有自己的数据集。我想通过使用子域来区分这些帐户。例如:
username.xxxxxxxx.com?profile=4527

我在Apache配置中设置了一个catchall,将所有子域转移到我的主域,然后我可以使用php将该子域拉出,如下所示:

现在,我的问题是:

在我看来(我对这一切都很陌生),对我需要在每个页面上执行的每个查询执行基于字符串的搜索将是缓慢而低效的。例如,必须查找
选择*其中username=sampleuser和profile=2745

但这是真的吗?最有效的方法是什么?使用子域的web应用程序通常如何处理这类事情


非常感谢大家。使用子域不是很有效。当你看SEO的时候。您有许多具有相同内容的域和站点

我希望你的案子能重写一下

www.xxxxx.com/username
然后可以将用户名重写到脚本中。问题是,当您为每个用户创建一个新的子域时,这可能是一个问题。有可能是用户缓存了DNS请求,访问该站点需要很多时间

第二,您应该尽可能少地查询数据库。在会话中保存用户名或ID

$_SESSION['username'] = 'username';
然后,您可以进行查询以从数据库中获取信息

编辑:当您需要更高的性能时,您应该查看MongoDB或使用Memcache来存储/缓存内容。

使用子域的web应用程序通常如何处理这类事情

通常,每个子域都在web引擎(apache/IIS)中使用重写模块之类的东西映射到特定的IP地址或特定的根。所以blog.*子域可能指向WordPress应用程序的根

在您的情况下,这听起来似乎不适用,除非您为每个用户提供了一组不同的页面。也就是说,如果它们都有一个“帐户详细信息”页面,并且只有数据不同,那么子域将发挥作用的唯一地方就是查询或您生成的URL

在你的例子中,你有什么是概念上的动态路线。通常,您只需查询一个表来确定要提供哪些内容。在您的情况下,与其说是内容,不如说是数据。有时,路由会使用组织良好的数据结构全局缓存在内存中进行查找,在您的情况下,通过用户名进行查找,该用户名返回用户表的主键。然后,在不查询用户表的情况下,您就拥有了通过外键引用该用户的数据的筛选条件。因此,如果导航到“Likes”页面,您可以“从Likes中选择*fromUserKey=$userKeyFromLookup”。您可能希望为查找选择一个允许O(1)查找的内存中数据结构。即,恒定时间查找

在我看来(我对这一切都很陌生),表演 我需要在每个页面上对每个查询进行基于字符串的搜索 这将是缓慢和低效的。例如,必须向上查找 选择*其中username=sampleuser和profile=2745

配置文件ID对每个用户都是唯一的吗?如果是这样,那么查询中不需要用户名。仅配置文件ID就可以为您提供唯一的响应。如果有人访问用户名。。如果没有配置文件ID,那么您要做的第一件事就是获取配置文件ID,然后重定向到同一页面,但现在URL中有该参数,以便在该配置文件ID的上下文中完成所有其他导航


我同意Stony的观点,我想你会发现夸克有动态子域。我会把用户名放在URL中。

好吧,你可以在
username
上添加一个索引到你的表中……谢谢。我肯定会这么做的。但即使这样做了,如果有1000行或更多行(只是抛出了一个大数字),这还会很快吗?到目前为止,我所做的一切都是在50行或更少行的表上进行的,所以效率并没有那个么重要。这些子域之间是否共享用户数据?不,子域之间不会共享数据。即使有数百万行,字符串索引也应该非常快。如果有疑问,您可以生成一个大得离谱的随机表,并对其性能进行基准测试。我打算建议在会话中缓存用户名(可能是身份验证的一部分),但我猜在他的情况下,其他用户会浏览到这些页面。我猜是某种社交网站。所以用户Bob可能正在浏览someOtherUser.blah.com,它需要查找其他用户,而不是Bob,因为Bob在会话缓存中,而不是其他用户。这是正确的。但您可以创建一个变量,例如“aktUsername”或“profileUsername”。但在您的情况下,您可以在顶部一次性解析它。但是AaronLS说,为每个用户建立子域并不是一个好主意。只有用户Bob才能编辑Bob.blah.com,但全世界都可以查看Bob.blah.com。一个容易想到的比较是Tumblr。如果你在那里创建了一个帐户,你可以创建所有发布到yourname.tumblr.com的内容。只有你可以发布内容,但每个人都可以查看。还有一些其他的可能性可以缓存整个MySQL查询,或者你可以进行整页缓存。并缓存整个站点。那么在定义的时间内您就不需要这些请求了。@a.J.Bohac:这不应该是editig的解决方案;D编辑时您需要身份验证,这可以保存在会话中。否则你会有很多错误:D更正。。。但是我有很多