SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 19.01.2010 09:34:54

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 849

SELECT в скобках (AS) быстрее, чем SELECT без скобок

Я тут решил проверить, одинаково ли быстро выполняются запросы вида

SELECT * FROM tbl

и
SELECT * (SELECT * FROM tbl) AS t


и выяснил, что с скобками где-то на 15% медленнее (это в моём случае).
Отчего это? Ведь на характер запроса скобки не влияют (те же ключи и т.п.)

Неактивен

 

#2 19.01.2010 09:38:59

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: SELECT в скобках (AS) быстрее, чем SELECT без скобок

Очень даже влияют (см. EXPLAIN для обоих запросов). Во втором случае имеет место подзапрос. То есть выполняется запрос в скобках, а затем внешний запрос. Оптимизация подзапросов в настоящее время, в основном, не реализовано, то есть оптимизатор не понимает, что запрос на самом деле один.

Неактивен

 

#3 19.01.2010 09:45:47

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 849

Re: SELECT в скобках (AS) быстрее, чем SELECT без скобок

Ну, например, я получил замедление для случая, когда никакие индексы не используются. Т.е. поздапрос оптимизировать, в общем, не нужно.
Или имеется в виду, что запрос надо фактически выполнить два раза? (тогда непонятно, почему замедление на 15%, а не на 100%)

Неактивен

 

#4 19.01.2010 09:48:11

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: SELECT в скобках (AS) быстрее, чем SELECT без скобок

Подзапрос выполняется и его результат помещается во временную таблицу. Внешний запрос обращается к данной временной таблице (это быстрее, чем к таблице на диске).

Неактивен

 

#5 19.01.2010 09:49:25

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 849

Re: SELECT в скобках (AS) быстрее, чем SELECT без скобок

А я тестировал для MEMORY-таблиц smile
Может быть, он там как-то уже более разобран..

Неактивен

 

#6 19.01.2010 09:59:55

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: SELECT в скобках (AS) быстрее, чем SELECT без скобок

Это может быть не буквально временная таблица, а внутреннее представление данных (хранится может как в памяти, так и на диске, в зависимости от объема - EXPLAIN об этом не говорит). Кстати, для больших таблиц, EXPLAIN выполняется долго - это еще одна недооптимизация.

mysql> explain select * from `17_5`\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: 17_5
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 44004106
        Extra:
1 row in set (0.00 sec)

mysql> explain SELECT * FROM (SELECT * FROM `17_5`) AS t\G
*************************** 1. row ***************************
           id: 1
  select_type: PRIMARY
        table: <derived2>
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 44004106
        Extra:
*************************** 2. row ***************************
           id: 2
  select_type: DERIVED
        table: 17_5
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 44004106
        Extra:
2 rows in set (37.27 sec)
 

Неактивен

 

#7 19.01.2010 10:39:48

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 849

Re: SELECT в скобках (AS) быстрее, чем SELECT без скобок

Я так понимаю, что EXPLAIN выполняется также, как и запрос, просто данные не пересылаются.. (это предположение такое)

Неактивен

 

#8 19.01.2010 10:42:34

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: SELECT в скобках (AS) быстрее, чем SELECT без скобок

LazY написал:

Я так понимаю, что EXPLAIN выполняется также, как и запрос, просто данные не пересылаются.. (это предположение такое)

Обычно EXPLAIN не выполняет запрос, но видимо он выполняет все подзапросы.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson