西西河

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

共:💬22 🌺13 新:
分页树展主题 · 全看首页 上页
/ 2
下页 末页
      • 家园 这个看来应该是正解了

        大致试了一下,好像是对的。有好几个回复里也都提到这个方式。不知道效率怎样。我的理解是,先LEFT JOIN,然后对这个 JOIN 后的结果做 WHERE 判断,A.aa=12345大概可以用 A中的 aa 的索引,但是 B.cc=23456 大概就不能用 B 中 cc的索引,而是对所得结果用 file sort?

        • 家园 应该还可以,取决于两个表的大小

          首先表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

        • 家园 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

    • 家园 why not use union?
      • 家园 主要是考虑到最后得到结果的排序后取部分

        一开始是觉得UNION是不是把两块内容返回后拼在一起。现在看来是混合的。后来是考虑到union后的结果需要排序的问题。

        主要是还要有个 order by A.aa LIMIT 10 这样的语句。如果 UNION 后的记录很多,这个 ORDER BY 应该是用 filesort 的方式,效率估计会比较低。

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


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

Copyright © cchere 西西河