作者JYHuang (夏天到了,冷不起来了说)
看板Database
标题Re: [SQL ] JOIN TABLE时WHERE的用法会影响效能吗?
时间Thu Jun 23 20:57:49 2016
1F:推 streetbad: 1.JOIN能用inner就尽量不用left...JOIN内尽量避免使用06/23 10:27
2F:→ streetbad: 子查询 尤其又是资料笔数多的时候 另外JOIN内如真无可06/23 10:28
3F:→ streetbad: 可避免要用到子查询 建议增加栏位的限缩 有用的再挑出06/23 10:29
4F:→ streetbad: 来 避免使用*06/23 10:29
5F:→ streetbad: 2.WHERE条件内 string的查询 避免使用like+or 可以改用06/23 10:30
6F:→ streetbad: union试试看06/23 10:30
7F:→ streetbad: 3.开执行计画看看是否有使用正确索引 耗用资源主要是在06/23 10:30
8F:→ streetbad: 哪段语法上面 建立相对应的索引 A.key的部分也可以建06/23 10:31
9F:→ streetbad: 立全文检索试试看 这样条件内可以尝试使用全文检索06/23 10:31
10F:→ streetbad: 另外回答最後面的问题 两个条件查询的结果不会一样06/23 10:33
11F:→ streetbad: 上述为个人实务上处理经验..有误请再提出指教Orz 06/23 10:39
12F:推 rockchangnew: 都是Like '%%' 根本不会用索引06/23 13:50
感谢streetbad版友的提醒
目前的写法大致是如此,
A资料库有33万比资料,B大约有10万比。
两个资料都有f1,f2这些栏位没有建索引,经由key栏位关联。
要搜寻A,B中f1或f2符合val值的资料
而且只显示B最新的一笔
目前的写法是如此,大概两秒左右就能跑出资料了
不过上头似乎还是觉得有点慢 XD
我用分析工具,有三个时间会比较慢
send data 0.29 sec
send data 0.29 sec 猜测是要UNION两个资料的sql
send data 0.8 sec 然後这把汇集的资料再SELECT这一段
这种情形应该常见不是很罕见,
猜想应该还会有更好的方法,只是一时还想不太出来啊。
SELECT W.* FROM
(
SELECT W.*,O.* FROM W
LEFT JOIN (
SELECT Key,f1,f2,f3 FROM (
SELECT Key,f1,f2,f3 FROM O
WHERE O.Key <> '' AND (O.f1='val' OR O.f2='val')
) as O
Order by O.f3 desc limit 1
) as O
ON W.key = O.key
WHERE W.key <> '' AND (W.f1='val' OR W.f2='val')
UNION
SELECT W.*,O.* FROM W
LEFT JOIN (
SELECT Key,f1,f2,f3 FROM (
SELECT key,f1,f2,f3 FROM O
WHERE O.key <> '' AND (O.f1='val' OR O.f2='val')
) as O
Order by O.f3 desc limit 1
) as O
ON W.key = O.key
WHERE W.key <> '' AND (O.f1='val' OR O.f2='val')
) as W
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 111.255.152.9
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Database/M.1466686672.A.A6F.html
13F:推 streetbad: 如不介意是可释出一点栏位内容资讯及条件还有欲产出的 06/24 00:10
14F:→ streetbad: 结果比较方便提供协助 06/24 00:10
15F:推 streetbad: 另外多层SELECT的动作还有LEFT JOIN子查询的部份 可以 06/24 00:13
16F:→ streetbad: 朝先塞到temp table的方向 字串的条件看起来也是可再 06/24 00:13
17F:→ streetbad: 调整 目前应该主要是这三块在拖速度 06/24 00:13