php& mysql:针对数据库检查大型数组的最有效方法

时间:2012-12-21 16:40:43

标签: php mysql performance multidimensional-array comparison

我有一大堆数据存储在一个多维数组中。示例结构如下:

Array
(
    [1] => Array
        (
            [0] => motomummy.com
            [1] => 1921
            [2] => 473
        )
    [4] => Array
        (
            [0] => kneedraggers.com
            [1] => 3051
            [2] => 5067
        )
)

我在mysql数据库中也有一个表currently包含~80K域名。这个列表每月可能增加~10K +域名。目标是将Array [] [0](域名)与mysql数据库进行比较,并返回一个保留值的数组(但密钥保存重要)只包含唯一值。

请注意,我只想比较第一个索引, NOT 整个数组。

假设初始多维数组的大小很大(超过10万到1000万个结果的可能性)。获取未包含在数据库中的数据的最佳方法是什么?

我现在正在做的只是将数据存储到数组中,从数据库中获取完整的域列表,然后使用以下函数,将初始数组中的每个值与数据库数组进行比较。这显然是非常缓慢和低效的。

// get result of custom comparison function
$clean = array_filter($INITIAL_LIST, function($elem) {
$wordOkay = true;

// check every word in "filter from database" list, store it only if not in list           
    foreach ($this->domains as $domain) {
        if (stripos($elem[0], $domain) !== false) {
            $wordOkay = false;
            break;
        }
    }

    return $wordOkay;
});

在这一点上,一些伪代码甚至实际代码会非常有用。

1 个答案:

答案 0 :(得分:2)

使用DBMS!这是为了这样的东西。

  • 创建临时表temp {id(填充数组索引);网址(填充网址)}

  • 用数组的数据填充

  • 理想情况下,在temp.url

  • 上创建一个索引
  • 查询数据库:

    SELECT * FROM `temp` LEFT JOIN `urls`
    WHERE urls.url = temp.url AND urls.url IS NULL;
    

    (表urls是您现有的数据)