Разница между 2 запросами объединения - PullRequest
0 голосов
/ 30 мая 2011

В чем разница между следующими 2 запросами? (Они оба дают одинаковые результаты)

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

Ответы [ 3 ]

3 голосов
/ 30 мая 2011

В первой версии есть другой набор временных таблиц, который бесполезен и в данном конкретном случае является бесполезной тратой ресурсов.
Все следующее приведет к тому же результату:

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
0 голосов
/ 30 мая 2011

Единственное отличие, которое я вижу, состоит в том, что в верхнем компоненте подзапросов UNION названы.Очевидно, что поскольку вторая версия не содержит ошибок, MySQL не требует имен подзапросов в этой конструкции.Кстати, вы проверяли, что эта версия быстрее, чем соответствующий одиночный запрос, используя OR?

0 голосов
/ 30 мая 2011

Первый запрос включает дополнительный набор SELECT * FROM (sub-query).Оптимизатору потребуется немного больше времени, чтобы разобраться в этом.

Функционально между запросами нет реальной разницы.Второе проще и потому предпочтительнее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...