MySQL: Могу ли я выполнить левое соединение и извлечь только одну строку из таблицы соединений?

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

CREATE TABLE `tickets` (
  `id` int(11) unsigned NOT NULL DEFAULT '0',
  `date_submitted` datetime DEFAULT NULL,
  `date_closed` datetime DEFAULT NULL,
  `first_name` varchar(50) DEFAULT NULL,
  `last_name` varchar(50) DEFAULT NULL,
  `email` varchar(50) DEFAULT NULL,
  `description` text,
  `agent_id` smallint(5) unsigned NOT NULL DEFAULT '1',
  `status` smallint(5) unsigned NOT NULL DEFAULT '1',
  `priority` tinyint(4) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `date_closed` (`date_closed`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `solutions` (
  `id` int(10) unsigned NOT NULL,
  `ticket_id` mediumint(8) unsigned DEFAULT NULL,
  `date` datetime DEFAULT NULL,
  `hours_spent` float DEFAULT NULL,
  `agent_id` smallint(5) unsigned DEFAULT NULL,
  `body` text,
  PRIMARY KEY (`id`),
  KEY `ticket_id` (`ticket_id`),
  KEY `date` (`date`),
  KEY `hours_spent` (`hours_spent`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Когда пользователь отправляет билет, он попадает в раздел «Билеты». Таблица. Затем, когда агенты прорабатывают проблему, они записывают действия, которые они предприняли. Каждая запись входит в раздел «Решения». Таблица. Другими словами, у билетов есть много решений.

Цель замедленного запроса - извлечь все поля из & quot; tickets & quot; таблица, а также последняя запись из «Решения» Таблица. Это запрос, который я использовал:

SELECT tickets.*,
    (SELECT CONCAT_WS(" * ", DATE_FORMAT(solutions.date, "%c/%e/%y"), solutions.hours_spent, CONCAT_WS(": ", solutions.agent_id, solutions.body))
    FROM solutions
    WHERE solutions.ticket_id = tickets.id
    ORDER BY solutions.date DESC, solutions.id DESC
    LIMIT 1
) AS latest_solution_entry
FROM tickets
WHERE tickets.date_closed IS NULL
OR tickets.date_closed >= '2012-06-20 00:00:00'
ORDER BY tickets.id DESC

Вот пример того, что "latest_solution_entry" поле выглядит так:

6/20/12 * 1337 * 1: I restarted the computer and that fixed the problem. Yes, I took an hour to do this.

В PHP я разделил & lt; latest_solution_entry & quot; поле и отформатируйте его правильно.

Когда я заметил, что страница, на которой выполняется запрос, замедлиласьway вниз, я выполнил запрос без подзапроса, и это было очень быстро. Я тогда побежалEXPLAIN на исходный запрос и получил это:

+----+--------------------+-----------+-------+---------------+-----------+---------+---------------------+-------+-----------------------------+
| id | select_type        | table     | type  | possible_keys | key       | key_len | ref                 | rows  | Extra                       |
+----+--------------------+-----------+-------+---------------+-----------+---------+---------------------+-------+-----------------------------+
|  1 | PRIMARY            | tickets   | index | date_closed   | PRIMARY   | 4       | NULL                | 35804 | Using where                 |
|  2 | DEPENDENT SUBQUERY | solutions | ref   | ticket_id     | ticket_id | 4       | helpdesk.tickets.id |     1 | Using where; Using filesort |
+----+--------------------+-----------+-------+---------------+-----------+---------+---------------------+-------+-----------------------------+

Поэтому я ищу способ сделать мой запрос более эффективным, но при этом достичь той же цели. Есть идеи?

Ответы на вопрос(4)

Ваш ответ на вопрос