1

我有两张表,一张是 300 万行,另一张是 200,000 行,我想检查较小的一个特定行中的所有值是否存在于较大的一个中,如果不存在,那么我想标记它们以便我可以识别它们和对它们做一些工作。

到目前为止尝试过,

1) SELECT EXISTS(SELECT 1 FROM table_bigger WHERE some_condition in table_smaller);

2)$something = SELECT somthing FROM 'table_smaller'

然后在 PHP$something中使用 " 检查是否存在于更大的表中select count(*) from bigger_table where something="$something";

这两种方法至少需要 1 天才能完成,我需要像这样比较表格,这让我等待得到结果并重新开始工作,我想知道这样比较的最佳方法和最快方法是什么。

任何帮助表示赞赏。

4

1 回答 1

0

您可以做的是直接比较表,但这样做会导致对两个表进行全表扫描。确保您在要比较的特定列上有索引,以最大限度地减少扫描表所花费的时间。

下面的查询将包含不存在的行。(也许在 Redis 中缓存?)在 PHP 中进行必要的处理,然后根据结果构造一个满足您需求的查询/过程。

从 table_large 中检索不具有与 table_small 匹配的值的行

SELECT field_large FROM table_large WHERE field_large NOT IN (SELECT field_small FROM table_small)

结果值为 2 和 3。

上述示例的示例表结构

CREATE TABLE IF NOT EXISTS `table_large` (
    `field_large` int(1) unsigned NOT NULL AUTO_INCREMENT,
    PRIMARY KEY (`field_large`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;

CREATE TABLE IF NOT EXISTS `table_small` (
    `field_small` int(1) unsigned NOT NULL AUTO_INCREMENT,
    PRIMARY KEY (`field_small`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;

INSERT INTO `table_large` (`field_large`) VALUES (1), (2), (3);
INSERT INTO `table_small` (`field_small`) VALUES (1);
于 2012-11-15T04:37:46.940 回答