使用PHP操作MySQL中超过1500万条记录的方法?

5
我有一个包含1500万条记录的用户表,当我执行注册功能时,我希望检查用户名是否已经存在。我对用户名列进行了索引,并且当我运行查询“select count(uid) from users where username='webdev'”时,屏幕一直显示空白,最终挂起。我是在本地主机上使用php 5和mysql 5进行操作的。请建议一些处理这种情况的技巧。
那么,在我们的本地机器上,mongodb是处理此过程的好选择吗?
谢谢, Nithish.

我不太理解你的错误,但是你在“用户名”上有索引吗…那肯定会有帮助 :) - Justin Jenkins
1
运行此查询,然后编辑问题并附上结果:explain select count(uid) from users where username='webdev' - sberry
2
参考资料,我们有一个用户表格,拥有超过4000万行数据,并且每次注册发生时,我们几乎都执行相同的查询。如果表格正确地建立索引和设计,查询应该只需要几分之一秒的时间。 - sberry
一个select语句是相当无用的,它不能保证任何唯一性。你需要一个唯一约束(也称为唯一索引)。 - Frank Heikens
你们在本地主机上检查过这个查询吗?现在有点好了,但如果我再比较一个AGE字段和用户名,那么又会卡住 :( - Nithish
MongoDB是避免未来出现这种情况的解决方案吗? - Nithish
4个回答

6
如果你只是想检查它是否存在,尝试不使用count。只需简单的select username from users where username='webdev' LIMIT 1可能更快。
此外,如果还没有这样做,请将列类型更改为varchar。不要使用text类型。它会慢得多。

不是真的,count(*)或count(username)不会减慢速度。 - ajreal
1
@ajreal,但是LIMIT 1可以加快速度 :) - shamittomar
4
@ajreal,是的,但OP写道:“我希望检查用户名是否已存在”。为此,使用LIMIT 1进行检查是可以的。不是吗?如果我在这里漏掉了什么,请纠正我。 - shamittomar
2
@shamittomar:嗯,如果硬盘不是问题的话,我认为在这种情况下使用char比使用varchar更好。我运行一个类似的网站,用户名通常不会超过40个字符,很少超过25-30个字符。所以我建议在用户名字段上设置一个40个字符或其他限制(或找到现有的最高限制),并将列类型更改为char(<thatno>)...为什么呢?因为如果使用varchar,指针需要在检查之前计算每个用户名的长度。 - Anush Prem
你们在本地主机上检查过这个查询了吗?现在有点好了,但是如果我再加上一个AGE字段和用户名一起比较,并且限制为1,那么又会卡住 :( - Nithish
显示剩余2条评论

2

这可能是一个无关紧要的问题,但为了测试并查看用户名是否已存在,我会发出以下查询(在shamittomar的查询上稍作修改):

SELECT DISTINCT `username` FROM `users` WHERE `username` = 'webdev';

默认情况下,这将返回“username”列中“webdev”的唯一实例;如果您添加更多参数,则可能会改变结果。例如,如果您运行

SELECT DISTINCT `user_id`, `username` FROM `users` WHERE `username` = 'webdev';

它将返回“用户ID”和“用户名”的所有唯一组合。

2

你可以做的一件事是将用户名的索引从index更改为unique,这将使搜索速度更快,正如shamittomar所说,在结尾处添加limit 1,即使只有该值已存在才会有帮助。


一个唯一索引是OP所需要的,SELECT语句永远无法保证任何唯一性。 - Frank Heikens

0

你的用户名是唯一的,所以在查询中必须设置1的限制,这样会更快。

select count(uid) from users where username='webdev' limit 1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接