Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / MySQL Новый топик    Ответить
 Помощь в оптимизации MySQL запроса  [new]
adrocket
Member

Откуда:
Сообщений: 24
Здравствуйте!

В связи с резким увеличением количества записей в таблице SQL запрос стал ооочень медленным, и вешает сервер.

Запрос(выполняется более 2-х минут): http://pastebin.com/FS7sScaG

И его EXPLAIN: https://www.dropbox.com/s/3w7cbiugkoxqh1h/explain.png?dl=0


Как я понимаю, все тормоза из-за того что не используется pripary key из таблицы users. А вот почему?
20 мар 15, 15:17    [17410329]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в оптимизации MySQL запроса  [new]
adrocket
Member

Откуда:
Сообщений: 24
Упростил запрос до минимума:

EXPLAIN EXTENDED SELECT SQL_NO_CACHE
objects.*,
users.*
FROM objects
JOIN users ON users.id = objects.user_id

Все равно users перебирается полностью, не используется никакой ключ.
20 мар 15, 15:22    [17410375]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в оптимизации MySQL запроса  [new]
adrocket
Member

Откуда:
Сообщений: 24
Сорри за pastebin.

Вот запрос:

EXPLAIN EXTENDED SELECT SQL_NO_CACHE
	objects.*,
	users.*
FROM objects 
JOIN users ON users.id = objects.user_id
20 мар 15, 15:26    [17410402]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в оптимизации MySQL запроса  [new]
adrocket
Member

Откуда:
Сообщений: 24
И вот EXPLAIN.

К сообщению приложен файл. Размер - 9Kb
20 мар 15, 15:27    [17410417]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в оптимизации MySQL запроса  [new]
ScareCrow
Member

Откуда: Белый город
Сообщений: 16042
вам правда нужны ВСЕ данные при условии "увеличением количества записей "?
20 мар 15, 15:53    [17410602]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в оптимизации MySQL запроса  [new]
Arhat109
Member

Откуда: из СССР
Сообщений: 3297
adrocket,

В последнем Иксплейне - используется, вполне себе ронмально. По ссылкам не ходил.
20 мар 15, 15:54    [17410618]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в оптимизации MySQL запроса  [new]
adrocket
Member

Откуда:
Сообщений: 24
ScareCrow,

Да, все данные нужны, так как происходит экспорт в XML фид.
20 мар 15, 15:57    [17410635]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в оптимизации MySQL запроса  [new]
adrocket
Member

Откуда:
Сообщений: 24
Arhat109,

Не понимаю, почему нормально, если не используется ключ для поиска, а вместо этого перебирается вся таблица?
20 мар 15, 15:58    [17410646]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в оптимизации MySQL запроса  [new]
Arhat109
Member

Откуда: из СССР
Сообщений: 3297
adrocket,

Там почти по-русски писано, что ключи (где можно) - используются. У вас нет никаких условий на users, поэтому и ALL. :)
20 мар 15, 16:02    [17410663]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в оптимизации MySQL запроса  [new]
adrocket
Member

Откуда:
Сообщений: 24
Arhat109,

Оу, видимо я подтупляю, простите :)

Я нашел еще 1 причину потенциальную, это 'GROUP BY' и как следствие используется временная таблица, которая, видимо дампится на диск ну и тп.

Мой полный запрос:

SELECT SQL_NO_CACHE
		a.*,
        i.object_id,
        u.phone, u.first_name AS first_name, u.email AS user_email, u.user_type,
        ag.name AS agency_name, ag.phone AS agency_phone, ag.email AS agency_email, ag.url AS agency_site,
    IFNULL(i.object_id, UUID()) AS unq_ancestor,
    GROUP_CONCAT(i.gen_name, '.jpg' SEPARATOR ';') AS image_name
FROM
    objects a
    LEFT JOIN object_images i ON a.id = i.object_id
         JOIN users  u ON u.id = a.user_id
    LEFT JOIN organizations ag ON ag.id = u.organization_id
WHERE
    a.object_status = 2
    AND a.object_type IN (1, 2, 3, 4)
GROUP BY a.id


Смысл в том что у каждого объекта могут быть картинки, и я из склеиваю через ';' в эту же строку.

Может подскажите, это оптимизируемо? :)
20 мар 15, 16:08    [17410705]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в оптимизации MySQL запроса  [new]
adrocket
Member

Откуда:
Сообщений: 24
Я конечно могу не группировать по object.id и тогда у меня будут повторяться строки из object в выборке, обрабатывать это уже в коде, но кто-то мне это не нравится. Ведь SQL такая мощная вещь, и структура БД у меня вроде более или менее валидная..
20 мар 15, 16:22    [17410819]     Ответить | Цитировать Сообщить модератору
Все форумы / MySQL Ответить