我经营一家中小型汽车网站,我们正在尝试记录访问车辆详细信息页面的次数。我们通过哈希,md5,当前车辆的品牌,型号和拉链来做到这一点。然后我们保留一个vehicle_count total并在散列匹配时递增它。
运行数字后,似乎有大约50个品牌,每个品牌有大约50个品牌,我们的位置数据库有大约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;
}
问题:
最大的问题是,一旦这个表增长,上面的php函数将如何执行。如果/当该表有几百万+行时,该表将如何执行。任何人都可以提供一些见解吗?
答案 0 :(得分:1)
你也可以完全避免哈希。
CREATE TABLE `vehicle_visits` (
`make` varchar(100) DEFAULT NULL,
`model` varchar(100) DEFAULT NULL,
`zip_code` char(7) DEFAULT NULL,
`vehicle_count` int(11) DEFAULT NULL,
UNIQUE KEY `make_model_zip` (`make`,`model`,`zip_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
这避免了多个UNIQUE值。您可以使用真实世界值来创建UNIQUE标识符,而不是“ID”和“Hash”。请注意MySQL如何使用3列来形成唯一索引。
注意:要减小索引的大小,可以减小make和model列的大小。除非你当然希望有100个角色的品牌和型号名称。如果您担心大小,还可以使用每个列的前缀创建索引。
编辑:将哈希列添加为索引方法
作为复合索引的替代方法,您可以引入一列 根据其他专栏的信息“散列”。如果这 列很短,相当独特,索引,可能更快 而不是许多列上的“宽”索引。 http://dev.mysql.com/doc/refman/5.0/en/multiple-column-indexes.html
您需要进行一些实际测试,以了解哪种方法更快。由于数据显示大约50个品牌和50个模型,因此查找主要涉及zip_code列。指数顺序也有所不同。此外,使用诸如make(10),model(10),zip(7)之类的前缀创建索引会创建长度为27的索引。另一方面,md5列将为32。
哈希方法可能有助于查找,但它真的有助于实际应用吗?此表似乎跟踪访问者,并且很可能会对其执行分析。索引将有助于SUM()操作(取决于索引的顺序)。例如,如果我想查找“Honda”或“Honda Civic”页面的访问者总数,可以使用多列索引轻松完成。