五千年(敝帚自珍)

主题:【求助】mysql中2个表2个条件怎么写来做选择? -- 铁手

共:💬22 🌺13
全看树展主题 · 分页首页 上页
/ 2
下页 末页
家园 exists?

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)

家园 left outer join / inner join

你要选取A.aa=B.aa的部分,inner join

你要不仅选取A.aa=B.aa,而且还要B.aa里不包含的A.aa,left outer join

效率你可以不需要先考虑,效率决定于A表B表的数据量

家园 UNION的速度好像并不慢

我试了一下,好像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的下降问题更突出

家园 关于 UNION 和 ALL

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.

家园 建议用10万行以上的table来试

如果还没有区别,用100万行的试,呵呵

全看树展主题 · 分页首页 上页
/ 2
下页 末页


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河