1

在我的一个网站中,我有一个简单的 php/mysql 函数,它使用以下代码查看 ip 是否在我的数据库中:

$ip = $_SERVER['REMOTE_ADDR'];
$user = mysql_query("SELECT * FROM users WHERE ip = '$ip' ");
if(mysql_num_rows($user) == 0){
echo 'IP is not banned';
}

昨天这个文件有大约 1,700,000 次点击(浏览量),我在一个共享主机上,在未来几天这个文件可能会被加载大约 3,000,000 次,cpu 使用会有什么问题,数据库有大约 30k 行:id,ip?

4

2 回答 2

2

虽然我认为 CPU 使用率不会有问题,但如果您只需要知道用户是否存在,请按照建议添加限制 1。

如果这是查询表的主要方式;ip如果您还没有索引,请考虑向该列添加索引。它将减少执行该查询的 CPU 和读取操作。

于 2013-01-19T10:49:07.143 回答
1

@driis 所说的概括起来是:1. 将查询限制为一个 2. 索引 ip 列但是,如果您需要更快的结果,您应该考虑将查询/表缓存到内存(例如 memcached),但这肯定是更多的工作。

你提到每天有 300 万个查询。根据@Rick Bradshaw 的数字(30 毫秒无限制,约 15 毫秒平均有限制),由于仅此查询,数据库负载平均约为 1,这很重要。

一天 30 毫秒 * 3 百万/秒 = 1,04(平均而言,这在高峰时段可能很糟糕)

一天 15 毫秒 * 3 百万/秒 = 0,52(这也不小)

在这种情况下,我建议对您的系统进行一些具体的测量。在不知道任何更具体的信息索引列的情况下听起来是个好主意。

于 2013-01-19T11:29:24.250 回答