问题描述
|
以下两个查询有什么区别? (它们都产生相同的结果)
select *
from (
select * from (
select *
from PHPpos_items
where name like \'AB10LA2%\' and deleted = 0
order by `name` limit 16
) t
union
select * from (
select *
from PHPpos_items
where item_number like \'AB10LA2%\' and deleted = 0
order by `name` limit 16
) t
union
select * from (
select *
from PHPpos_items
where category like \'AB10LA2%\' and deleted = 0
order by `name` limit 16
) t
) as top_rows
order by `name` limit 16
与
select *
from (
(select *
from PHPpos_items
where name like \'AB10LA2%\' and deleted = 0
order by `name` limit 16)
union
(select *
from PHPpos_items
where item_number like \'AB10LA2%\' and deleted = 0
order by `name` limit 16)
union
(select *
from PHPpos_items
where category like \'AB10LA2%\' and deleted = 0
order by `name` limit 16)
) as top_rows
order by `name` limit 16
解决方法
第一个版本具有另一组临时表,在这种特定情况下,这是无用的并且浪费资源。
以下所有内容将产生相同的结果:
SELECT * FROM T1;
SELECT * FROM (SELECT * FROM T1);
SELECT * FROM (SELECT * FROM (SELECT * FROM T1));
...
...
到无穷远 :-)
在您的特定情况下,这就足够了:
select *
from phppos_items
where
(name like \'AB10LA2%\' OR item_number like \'AB10LA2%\' OR category like \'AB10LA2%\')
and deleted = 0
order by `name` limit 16
, 第一个查询嵌入了额外的SELECT * FROM (sub-query)
集。优化器将需要更长的时间来解决它。
从功能上讲,查询之间没有真正的区别。第二个更简单,因此更可取。
, 我看到的唯一区别是在顶部,命名了“ 5”的子查询组件。显然,由于第二个版本没有错误,因此MySQL在此构造中不需要子查询名称。顺便说一句,您是否测试过此版本比使用OR
的相应单个查询更快?