【发布时间】:2014-06-11 16:57:02
【问题描述】:
我经营一个中小型汽车网站,我们正在尝试记录访问车辆详细信息页面的次数。我们通过散列、md5、当前车辆的品牌、型号和 zip 来做到这一点。然后我们保留一个vehicle_count 总数,如果哈希匹配,则增加它。
运行这些数字后,似乎有大约 50 个品牌,每个品牌有大约 50 个型号,我们的位置 db 有大约 44,000 个唯一的邮政编码。大约 1 亿 + 潜在的唯一哈希
这是创建表:
CREATE TABLE `vehicle_detail_page` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`vehicle_hash` char(32) NOT NULL,
`make` varchar(100) NOT NULL,
`model` varchar(100) NOT NULL,
`zip_code` char(7) DEFAULT NULL,
`vehicle_count` int(6) unsigned DEFAULT '1',
PRIMARY KEY (`id`),
UNIQUE KEY `vehicle_hash` (`vehicle_hash`),
KEY `make` (`make`),
KEY `model` (`model`),
KEY `zip_code` (`zip_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
这是插入/更新表格的 PHP 代码:
public function insertUpdate($make, $model, $zip)
{
// set table
$table = self::TABLE;
// create hash
$hash = md5($make.$model.$zip);
// insert or update count
try
{
$stmt = $this->db->conn->prepare("INSERT INTO $table
(vehicle_hash,
make,
model,
zip_code)
VALUES
(:vehicle_hash,
:make,
:model,
:zip_code)
ON DUPLICATE KEY UPDATE
vehicle_count = vehicle_count + 1;");
$stmt->bindParam(':vehicle_hash', $hash, PDO::PARAM_STR);
$stmt->bindParam(':make', $make, PDO::PARAM_STR);
$stmt->bindParam(':model', $model, PDO::PARAM_STR);
$stmt->bindParam(':zip_code', $zip, PDO::PARAM_STR);
$stmt->execute();
} catch (Exception $e)
{
return FALSE;
}
return TRUE;
}
问题:
- MySQL 可以处理这么多行吗?
- 有没有人发现这段代码有什么问题,有没有更好的方法来做到这一点?
- 查询这些数据会是什么样子?
最大的问题是,一旦这个表增长,上面的 php 函数将如何执行。如果/当该表有几百万行以上时,该表将如何执行。谁能提供一些见解?
【问题讨论】:
-
有足够的服务器能力和足够的耐心,MySQL 可以处理任何事情......只是速度不是很快
-
What will querying the data be like?出于对总督的爱,不要忘记WHERE子句 -
MySQL 完全有能力处理这个问题,但你为什么不正确地规范化制造和模型呢?
-
1) RTFM: dev.mysql.com/doc/refman/5.0/en/table-size-limit.html 2) 为什么要存储值的哈希值?为什么不只是将 (make,model,zip,visit_count) 作为普通字段的普通表? 3)查询什么?大概是
select ...。 -
您是否考虑过改用 Google Analytics?它运行迅速 - 是一个行业标准 - 是免费的,可以做你想做的事。