最快得到MYSQL两个表的差集

Mysql里不外乎就是 子查询 和 连接 两种方式.

设第一个表为table1, 第二个为table2, table1包含table2.

sql为:

 1 //子查询
 2 select table1.id from table1
 3   where not exists
 4     (select 1 from table2
 5      where table1.id = table2.id
 6     );
 7
 8 //外连接
 9 select table1.id from table1
10   left join table2
11   on table1.id=table2.id
12 where table2.id is null;

高性能mysql里有类似的例子, 见 "When a correlated subquery is good" 一节. 它给出的数据, 外连接要快.

还有就是, 要最快, 那么最好只对 两张表的主键 做差集, 这样只过覆盖索引, 会快一些.

时间: 2024-11-09 03:20:58

最快得到MYSQL两个表的差集的相关文章

MySQL两种表存储结构MyISAM和InnoDB的性能比较测试

转载 http://www.jb51.net/article/5620.htm MySQL支持的两种主要表存储格式MyISAM,InnoDB,上个月做个项目时,先使用了InnoDB,结果速度特别慢,1秒钟只能插入10几条.后来换成MyISAM格式,一秒钟插入上万条.当时决定这两个表的性能也差别太大了吧.后来自己推测,不应该差别这么慢,估计是写的插入语句有问题,决定做个测试:测试环境:Redhat Linux9,4CPU,内存2G,MySQL版本为4.1.6-gamma-standard测试程序:

Mysql两张表相同ID匹配,输出到新表,删除旧表匹配

0x00:前言. 有两张表,一张表字段是ID-Email,另一张表字段是ID-PWD,想用SQL脚本把这两张表合并合并,因为有相同的ID才可以匹配. 0x01:示例. 一个字段ID:Email 另一个字段是ID:PWD 想要的输出就结果ID:Email:PWD 0x02:Mysql语句. 注意:因为MySQL为了安全,不允许一行执行两条语句(如:LINUX下用&&). 执行前将语句写入SQL脚本文件,文件后缀用.sql,tttt_test是数据库名. 以下是文本. CREATE TABLE

MySQL 两张表关联更新(用一个表的数据更新另一个表的数据)

有两张表,info1, info2 . info1: info2: 现在,要用info2中的数据更新info1中对应的学生信息,sql语句如下: UPDATE info1 t1 JOIN info2 t2 ON t1.name = t2.name SET t1.age = t2.age, t1.class = t2.class; 运行结果如下: 更新过的info1: 至于效率问题,之前我有三张表,都在40万左右.需要将 table2 中的两个字段(step1),table3 中的一个字段(ste

mysql 两个表合并查询 字段交换

项目七: 各部门工资最高的员工(难度:中等) 创建 Employee 表,包含所有员工信息,每个员工有其对应的 Id, salary 和 department Id. create table Employee( Id int auto_increment primary key, Name varchar not null, Salary int not null, DepartmentId int not null ); insert into Emploee (Name,Salary,De

mysql高效获取两张表共同字段的交集数据

问题: 例如下面两站表A,B.A表和B表分别有5-10w数据.A表结构如下:id bid name title publisher extraB表结构如下id bid name title publisher A出版社也为很多人出版了书籍,B出版社也为很多人出版了书籍,有sql语句找出这两个出版社为那些人 共同出版书籍,用innerjoin太慢,有没有什么更好的办法? 解答一: 由于不知道你表的索引情况,至于用join还是in和exists不太好说,理论上讲,exists最快.in次之.join

【转】mysql 触发器实现两个表的数据同步

mysql通过触发器实现两个表的同步 目前,在本地测试成功. 假设本地的两个数据库a和b,a下有表table1(id, val) b下有表table2(id, val) 假设希望当table1中数据更新,table2中数据同步更新. 代码: DELIMITER $$ CREATE /*[DEFINER = { user | CURRENT_USER }]*/ TRIGGER `a`.`触发器名` BEFORE UPDATE ON `a`.`table1` FOR EACH ROW BEGIN I

mysql数据库---同时插入两个表以上的数据

mysql数据库问题,如何同一个操作添加两个表(a表,b表),并把b表的id添加到a表字段中,b表id自动增长 在数据库中创建存储过程,比如存储过程的名字叫做 test在java中和正常使用sql的方法一样, sql = "call test(B1,B2)", B1和B2是假设你将要插入b表中的数据 假设b表的结构是(ID int auto_incremet, B1 int, B2 int)假设a表的结构是(ID int) CREATE test(B1 int, B2 int) #假设

关于mysql当中给数据量特别大的两个表做关联查询的时候解决查询速度很慢的解决方法

今天碰到了两个表做关联查询的mysql,这两个表的数据量都是特别大的,有一个表的数据是上亿条的数据,有一个是几百万的数据, 查询的速度是特别慢,然后我看了一下执行计划,下面是执行执行计划: 看到上面这个图这个数据量是特别大的,这个查询起来的肯定是非常慢的,而且他的类型都是ALL类型,也就是都是全表进行扫描的.然后在网上找资料,然后发现我们可以给关联的字段建索引. 于是我给关联字段建立了索引,然后就发生了下面的变化: 整个的行数就成不知道多少个数量级的情况在下降,整个的查询速度也是加快了额很多,现

(10)MySQL触发器(同时操作两张表)

什么是触发器 触发器是与表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合.触发器的这种特性可以协助应用在数据库端确保数据的完整性. 举个例子,比如你现在有两个表[用户表]和[日志表],当一个用户被创建的时候,就需要在日志表中插入创建的log日志,如果在不使用触发器的情况下,你需要编写程序语言逻辑才能实现,但是如果你定义了一个触发器,触发器的作用就是当你在用户表中插入一条数据的之后帮你在日志表中插入一条日志信息.当然触发器并不是只能进行插入操作,还能执行修改,删除 触发器的事