主题:【求助】mysql中2个表2个条件怎么写来做选择? -- 铁手
Select A.aa,A.bb,A.dd From A where (A.aa=12345) or exists (select * from A,B where A.aa=B.aa and B.cc=23456)
你要选取A.aa=B.aa的部分,inner join
你要不仅选取A.aa=B.aa,而且还要B.aa里不包含的A.aa,left outer join
效率你可以不需要先考虑,效率决定于A表B表的数据量
我试了一下,好像UNION的速度并不比单一的SQL慢,特别当满足B.cc=23456的行在整个B表中的比率不大的时候。当然表A对aa,表B对aa和cc都要分别建立索引。
对UNION所选结果的排序也可能在内存中排,如果内存够多的话,可以加大MySQL DB 的 sort_buffer_size的值(/etc/my.cnf)。
你可以用下列语句对比一下:
EXPLAIN
SELECT A.aa,A.bb,A.dd
FROM A
WHERE A.aa=12345
UNION DISTINCT
SELECT A.aa,A.bb,A.dd
FROM A INNER JOIN B ON A.aa=B.aa
WHERE B.cc=23456
ORDER BY aa limit 0, 10
首先表A,表B都要对aa建索引
表B对cc建索应该对本语句帮助不大。
你可以用下列语句确认该语句会用到那些索引以及大体的效率:
EXPLAIN SELECT A.aa,A.bb,A.dd
FROM A LEFT JOIN B ON A.aa=B.aa
WHERE B.cc=23456 OR A.aa=12345
ORDER BY A.aa limit 0, 10
好像 mysql 对于数据量比较大的查询性能都不是非常突出。人们印象中mysql性能快,很大原因是从前 mysql 数据库当时没有完全实现和使用标准SQL。当mysql成为标准数据库以后,它也就没有跟从前相比于其它数据库系统更高的性能那样的高性能了。
另外 根据主铁的要求使用UNION Operator [ eBus ]可能真正是你想要的结果,只是union 的性能也会出现 in 关键字在数据量大是性能下降的问题,可能union的下降问题更突出
SQL一个基本的原则是:
Prefer outer joins to UNION operators
而且UNION ALL 是不排序的
Because of the presence of the keyword ALL, SQL will not perform a sort to remove possible duplicate rows.
如果还没有区别,用100万行的试,呵呵