MySQL可以处理1亿多行吗?

时间:2014-04-25 20:17:09

标签: php mysql bigdata

我经营一家中小型汽车网站,我们正在尝试记录访问车辆详细信息页面的次数。我们通过哈希,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;
}

问题:

  1. MySQL可以处理这么多行吗?
  2. 有没有人发现此代码有任何问题,是否有更好的方法可以做到这一点?
  3. 查询这些数据会是什么样的?
  4. 最大的问题是,一旦这个表增长,上面的php函数将如何执行。如果/当该表有几百万+行时,该表将如何执行。任何人都可以提供一些见解吗?

1 个答案:

答案 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”页面的访问者总数,可以使用多列索引轻松完成。