推 streetbad: 1.JOIN能用inner就尽量不用left...JOIN内尽量避免使用06/23 10:27
→ streetbad: 子查询 尤其又是资料笔数多的时候 另外JOIN内如真无可06/23 10:28
→ streetbad: 可避免要用到子查询 建议增加字段的限缩 有用的再挑出06/23 10:29
→ streetbad: 来 避免使用*06/23 10:29
→ streetbad: 2.WHERE条件内 string的查询 避免使用like+or 可以改用06/23 10:30
→ streetbad: union试试看06/23 10:30
→ streetbad: 3.开执行计画看看是否有使用正确索引 耗用资源主要是在06/23 10:30
→ streetbad: 哪段语法上面 建立相对应的索引 A.key的部分也可以建06/23 10:31
→ streetbad: 立全文检索试试看 这样条件内可以尝试使用全文检索06/23 10:31
→ streetbad: 另外回答最后面的问题 两个条件查询的结果不会一样06/23 10:33
→ streetbad: 上述为个人实务上处理经验..有误请再提出指教Orz 06/23 10:39
推 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