Dol*_*lbz 5 mysql sql union query-optimization
假设我有一系列逐渐变得更加昂贵的查询.我可以加入所有这些联盟,但我只对前十名结果感兴趣,所以我添加一个限制.查询看起来像这样:
(SELECT col1, col2 FROM table WHERE colx = 'x')
UNION
(SELECT col1, col2 FROM table WHERE colx LIKE '%x%')
UNION
(SELECT col1, col2 FROM table WHERE colx LIKE '%x%' AND unindexedcol LIKE '%y%')
LIMIT 10
Run Code Online (Sandbox Code Playgroud)
我知道这不能保证是MySQL文档所述的第一个查询的前10名
UNION默认生成一组无序行
但在实践中,似乎结果是按顺序选择1,然后选择2等,直到达到限制.
那么MySQL是否按顺序执行查询并在达到限制时停止?如果没有那么什么是更好的方法来执行这种查询样式,其中只需要一小部分结果,并且优先考虑较便宜的查询以最小化执行时间?
我做了一个测试来证明 MySQL 不会优化这种查询:首先我执行这个查询:
select @a1 := 0;
select @a2 := 0;
(SELECT id, @a1:=@a1+1 FROM companies)
UNION
(SELECT id, @a2:=@a2+1 FROM invoices)
LIMIT 10;
Run Code Online (Sandbox Code Playgroud)
然后我观察 @a1 和 @a2 变量的值:
select @a1 as a1, @a2 as a2;
Run Code Online (Sandbox Code Playgroud)
在我的测试中,它们是a1 = 81和a2 = 467。因此联合查询的单选不受限制。
| 归档时间: |
|
| 查看次数: |
803 次 |
| 最近记录: |