Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Возможно ли оптимизировать этот зарпос? / 4 сообщений из 4, страница 1 из 1
23.07.2015, 00:14:59
    #39014054
motoroller1983
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможно ли оптимизировать этот зарпос?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
SELECT `m`.`id`, DATE_FORMAT(`date`, '%e %M %Y, %H:%i') AS `datePrint`,
				`m`.`from_id`, `m`.`to_id`, `m`.`from_type`, `m`.`to_type`, 
							
			(SELECT COUNT(*) AS `new` FROM `messages` AS `m1` 
				WHERE `m1`.`status` = 0		
				AND `m1`.`from_id` IN (`m`.`from_id`) 
				AND `m1`.`from_type` IN (`m`.`from_type`)) AS `new`,
			
			(CASE `m`.`to_type`
				WHEN -1 THEN 'Администрация'
				WHEN 0 THEN (SELECT CONCAT(`name`, ' [пользователь] ', '[id: ', `id`, ']') FROM `owners` WHERE id = `m`.`to_id`)
				WHEN 1 THEN (SELECT CONCAT(`title`, ' [организация] ', '[id: ', `id`, ']') FROM `companies` WHERE id = `m`.`to_id`)
			END) AS `toUser`,
			
			(CASE `m`.`from_type`
				WHEN -1 THEN 'Администрация'
				WHEN 0 THEN (SELECT CONCAT(`name`, ' [пользователь] ', '[id: ', `id`, ']') FROM `owners` WHERE id = `m`.`from_id`)
				WHEN 1 THEN (SELECT CONCAT(`title`, ' [организация] ', '[id: ', `id`, ']') FROM `companies` WHERE id = `m`.`from_id`)
			END) AS `fromUser`
			
			FROM `messages` AS `m`
			
			WHERE `m`.`date` = (SELECT MAX(`m1`.`date`) FROM `messages` AS `m1` WHERE 
					`m1`.`to_id` IN (`m`.`from_id`, `m`.`to_id`)
					AND `m1`.`from_id` IN (`m`.`from_id`, `m`.`to_id`)
					AND `m1`.`from_type` IN (`m`.`from_type`, `m`.`to_type`)
					AND `m1`.`to_type` IN (`m`.`from_type`, `m`.`to_type`))



Есть вот такой вот запрос, который выводит смотрите картинку.

Скажите можно ли его как-то оптимизировать, даже при лимите 30 записей очень тупит
...
Рейтинг: 0 / 0
23.07.2015, 00:36:50
    #39014066
motoroller1983
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможно ли оптимизировать этот зарпос?
Причем тормоза добавляет вот эта конструкция:

Код: sql
1.
2.
3.
4.
5.
WHERE `m`.`date` = (SELECT MAX(`m1`.`date`) FROM `messages` AS `m1` WHERE 
					`m1`.`to_id` IN (`m`.`from_id`, `m`.`to_id`)
					AND `m1`.`from_id` IN (`m`.`from_id`, `m`.`to_id`)
					AND `m1`.`from_type` IN (`m`.`from_type`, `m`.`to_type`)
					AND `m1`.`to_type` IN (`m`.`from_type`, `m`.`to_type`))
...
Рейтинг: 0 / 0
23.07.2015, 01:42:17
    #39014074
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможно ли оптимизировать этот зарпос?
автор`m1`.`to_id` IN (`m`.`from_id`, `m`.`to_id`)
чё правда?
...
Рейтинг: 0 / 0
23.07.2015, 03:19:07
    #39014091
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможно ли оптимизировать этот зарпос?
motoroller1983,

1. почитайте здесь 7543220 . Вы делаете Т3-С2 -- вполне
разумное решение.

2. Проблема, насколько можно предположить без ЕХПЛАИН,
в то что подзапрос в WHERE работает без индексов.

3. Построить индекс на 4 поля чтоб он работал на несколько IN --
мне кажется не получится (могу ошибаться)

4. Булее кузяво будет построить еше одну колонку с
идентификатором диалога. Нужен ИД который однозначно определит
вашу групировку по
Код: sql
1.
2.
3.
4.
5.
WHERE 
					`m1`.`to_id` IN (`m`.`from_id`, `m`.`to_id`)
					AND `m1`.`from_id` IN (`m`.`from_id`, `m`.`to_id`)
					AND `m1`.`from_type` IN (`m`.`from_type`, `m`.`to_type`)
					AND `m1`.`to_type` IN (`m`.`from_type`, `m`.`to_type`))



например, заполняйте новую колонку таким выражением в момент создания новой записи:

Код: sql
1.
2.
3.
4.
5.
6.
Concat(
  LEAST(from_id, to_id), '-',
  GREATEST(from_id, to_id),'-',
  LEAST(from_type, to_type), '-',
  GREATEST(from_type, to_type)
)



тогда подзапрос будет выглядеть так:

Код: sql
1.
2.
3.
4.
5.
WHERE `m`.`date` = 
(
SELECT MAX(`m1`.`date`) 
FROM `messages` AS `m1` 
WHERE m1.dialog_id = m.dialog_id)



ну и конечно индекс по dialog_id.

5. по ссылке есть и другие варинаты.

6. если в таблице будут два сообшения в одном диалоге
с одинаковым ДАТЕ, то запрос вернет две строчки.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Возможно ли оптимизировать этот зарпос? / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]