Mysql сложность на выбор по-разному - PullRequest
3 голосов
/ 06 декабря 2010

В нашей компании у нас есть простая система тикетов для внутренних запросов
(например, регистрация Mac, активация почты и т. Д.)
, о которых позаботится sysman.
Основная структура такова:

билеты за столом

  • uid (целое число)
  • .Did_by (строка)
  • выдано_on (дата / время)
  • ticket_type (строка)

таблица ticket_params

  • uid (целое число)
  • ticket_uid (целое число, не иностранноеключ)
  • параметр (строка)
  • параметр_контент (строка)

Билет, в зависимости от цели, может иметь разные параметры.
Запросдля MAC-адреса есть "mac_1", "mac_2", "expiry", "model" and "comment" параметр.

Мы хотели запрос, который дает все эти данные.Мой коллега по работе придумал это:

select tickets.uid, tickets.issued_by,tickets.issued_on,
(select parameter_content from ticket_parameters where parameter="Model" and
ticket_uid=tickets.uid) "model",
(select parameter_content from ticket_parameters where parameter="Comments"
and ticket_uid=tickets.uid) "comments",
(select parameter_content from ticket_parameters where parameter="mac_1" and
ticket_uid=tickets.uid) "mac1",
(select parameter_content from ticket_parameters where parameter="mac_2" and
ticket_uid=tickets.uid) "mac2",
(select parameter_content from ticket_parameters where parameter="Expiry"
and ticket_uid=tickets.uid) "Expiry" from tickets;

, проведя некоторое исследование и потратив некоторое время, затем сказал мне: «Посмотрите, как сложен этот запрос для такой простой задачи! Можете ли вы сделать лучше?»

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

select
  tickets.uid,
  tickets.issued_by,
  tickets.issued_on,
  f.parameter_content as Model,
  e.parameter_content as Comments,
  b.parameter_content as mac_1,
  d.parameter_content as mac_2,
  c.parameter_content as Expiry
from
  tickets,
  ticket_parameters as b,
  ticket_parameters as c,
  ticket_parameters as d,
  ticket_parameters as e,
  ticket_parameters as f
where
    tickets.uid=b.ticket_uid AND b.parameter='mac_1'
  AND
    c.ticket_uid=tickets.uid AND c.parameter='Expiry'
  AND
    d.ticket_uid=tickets.uid AND d.parameter='mac_2'
  AND
    e.ticket_uid=tickets.uid AND e.parameter = 'Comments'
  AND
    f.ticket_uid=tickets.uid AND f.parameter = 'Model'
  ;

Результаты оба верны, НО мне потребовалось 2 секунды для запуска (на 1000входной билет), а у моего напарника заняло 47 секунд.На первый взгляд, для меня не было никакой разницы, и я так и не смог выяснить, почему такая разница.

Итак, каково ваше мнение?И, кроме того, где я могу найти документацию по этой проблеме?

1 Ответ

2 голосов
/ 06 декабря 2010

EXPLAIN EXTENDED ... покажет вам различия в пути доступа к данным, которые создали запросы.

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

EDIT

Вотсписок ограничений для 5.0

...