比较Mysql中的行以查看其他表中不存在哪些值的最快方法

时间:2012-11-15 04:17:39

标签: php mysql sql database

我有两个表,一个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天才能完成,我需要比较这样的表,并且它会产生 我等着得到结果并重新开始工作,我想知道最好的方式和比较最快的方法是什么。

任何帮助表示赞赏。

1 个答案:

答案 0 :(得分: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);