powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Поиск оптимального решения для следующего запроса
12 сообщений из 12, страница 1 из 1
Поиск оптимального решения для следующего запроса
    #38500644
kinglion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какие существуют наиболее оптимальные решения с точки зрения производительности/скорости для следующего запроса?
Прошу предлагать Ваши любые замечания и предложения, как его можно оптимизировать.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
SELECT t1.field1,
	t1.field2,
	(SELECT t2.field3 FROM t2 WHERE t2.fk = t1.pk ORDER BY t2.date DESC, t2.pk DESC LIMIT 1) AS MostRecentField3,
	(SELECT t2.field4 FROM t2 WHERE t2.fk = t1.pk ORDER BY t2.date DESC, t2.pk DESC LIMIT 1) AS MostRecentField4
FROM t1
	INNER JOIN t3 ON t3.fk = t1.pk
WHERE ...



На данный момент есть следующие варианты:
- Каждый раз пересчитывать MostRecentField3 и MostRecentField4 при вставке и обновлении выбранной строки в таблице на основе данных из другой таблицы.
- Использовать запрос как есть.
- Возможно удастся применить OVER(). Нужно проанализировать данные в таблицах и попробовать построить такой запрос.
- Варианты предложенные сообществом.

Данный код должен работать в MySQL v.5.1.50.
Переход на другую версия БД планируется, но задачу необходимо реализовать минимальными усилиями для указанной версии MySQL.
...
Рейтинг: 0 / 0
Поиск оптимального решения для следующего запроса
    #38500649
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kinglionВозможно удастся применить OVER()Вы с ораклом не попутали?

Сколько всего записей в таблице t2 и в ней сколько уникальных значений поля fk ?
К скольки из них происходит "обращение" в целом запросе в среднем?
...
Рейтинг: 0 / 0
Поиск оптимального решения для следующего запроса
    #38500668
kinglion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Связи таблиц:
t1 и t2 - один ко многим
t1 и t3 - один к одному

В данной версии MySQL нет возможности использовать OVER(), но есть библиотека, которая подключается дополнительно и делает что-то похожее на OVER() из MSSQL (Oracle). Но производительность этой библиотеки очень низкая. :)

Принимаю любые предложения и замечания.
Надеюсь на помощь сообщества в оптимизации этого запроса.
...
Рейтинг: 0 / 0
Поиск оптимального решения для следующего запроса
    #38500677
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kinglionПринимаю любые предложения и замечания.
Надеюсь на помощь сообщества в оптимизации этого запроса.Тогда ответьте, пожалуйста, на вопросы.
...
Рейтинг: 0 / 0
Поиск оптимального решения для следующего запроса
    #38500738
bochkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kinglion Какие существуют наиболее оптимальные решения с точки зрения производительности/скорости для следующего запроса?
Прошу предлагать Ваши любые замечания и предложения, как его можно оптимизировать.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
SELECT t1.field1,
	t1.field2,
	(SELECT t2.field3 FROM t2 WHERE t2.fk = t1.pk ORDER BY t2.date DESC, t2.pk DESC LIMIT 1) AS MostRecentField3,
	(SELECT t2.field4 FROM t2 WHERE t2.fk = t1.pk ORDER BY t2.date DESC, t2.pk DESC LIMIT 1) AS MostRecentField4
FROM t1
	INNER JOIN t3 ON t3.fk = t1.pk
WHERE ...



На данный момент есть следующие варианты:
- Каждый раз пересчитывать MostRecentField3 и MostRecentField4 при вставке и обновлении выбранной строки в таблице на основе данных из другой таблицы.
- Использовать запрос как есть.
- Возможно удастся применить OVER(). Нужно проанализировать данные в таблицах и попробовать построить такой запрос.
- Варианты предложенные сообществом.

Данный код должен работать в MySQL v.5.1.50.
Переход на другую версия БД планируется, но задачу необходимо реализовать минимальными усилиями для указанной версии MySQL.
нормальный запрос, если индексы работают
...
Рейтинг: 0 / 0
Поиск оптимального решения для следующего запроса
    #38500770
Диклевич Александр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно еще так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT t1.field1,
	t1.field2,
	t2.field3 AS MostRecentField3,
	t2.field4 AS MostRecentField4
FROM t1
JOIN t3 ON t3.fk = t1.pk
JOIN t2 ON t2.fk = t1.pk
WHERE ...
        AND NOT EXISTS(SELECT t22.* FROM t2 t22 WHERE t22.date > t2.date AND NOT EXISTS(SELECT t23.* FROM t2 t23 WHERE t23.pk > t22.pk))
...
Рейтинг: 0 / 0
Поиск оптимального решения для следующего запроса
    #38500949
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SELECT t1.field1,
  t1.field2,
  t2.MostRecentField3,
  t2.MostRecentField4
FROM t1
JOIN(
  SELECT 
    t2.field3 AS MostRecentField3,
    t2.field4 AS MostRecentField4
  FROM t2 WHERE t2.fk = t1.pk 
  ORDER BY t2.date DESC, t2.pk DESC 
  LIMIT 1
  )t2
JOIN t3 ON t3.fk = t1.pk
WHERE ...
...
Рейтинг: 0 / 0
Поиск оптимального решения для следующего запроса
    #38500950
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ой сорь, наврал))
...
Рейтинг: 0 / 0
Поиск оптимального решения для следующего запроса
    #38500954
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в MS SQL придумали CROSS APPLY для таких целей, а в MySQL, наверное, только как в старттопике...
...
Рейтинг: 0 / 0
Поиск оптимального решения для следующего запроса
    #38502088
kinglion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftВы с ораклом не попутали?
нет
miksoftСколько всего записей в таблице t2 и в ней сколько уникальных значений поля fk ?
t2 может содержать одну или несколько записей связанных с одной записью из t1.
miksoftК скольки из них происходит "обращение" в целом запросе в среднем?
Выбирается примерно к 0.1-0.5% записей при указании различных фильтров в WHERE.
Фильтр применяется к таблице t1.
...
Рейтинг: 0 / 0
Поиск оптимального решения для следующего запроса
    #38502095
kinglion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Диклевич Александрможно еще так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT t1.field1,
	t1.field2,
	t2.field3 AS MostRecentField3,
	t2.field4 AS MostRecentField4
FROM t1
JOIN t3 ON t3.fk = t1.pk
JOIN t2 ON t2.fk = t1.pk
WHERE ...
        AND NOT EXISTS(SELECT t22.* FROM t2 t22 WHERE t22.date > t2.date AND NOT EXISTS(SELECT t23.* FROM t2 t23 WHERE t23.pk > t22.pk))



Поля MostRecentField3 и MostRecentField4 могут выбираться из одной строки в таблице или из разных, поэтому этот вариант запроса не обеспечивет нужной функциональности.
...
Рейтинг: 0 / 0
Поиск оптимального решения для следующего запроса
    #38502165
kinglion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kinglionДиклевич Александрможно еще так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT t1.field1,
	t1.field2,
	t2.field3 AS MostRecentField3,
	t2.field4 AS MostRecentField4
FROM t1
JOIN t3 ON t3.fk = t1.pk
JOIN t2 ON t2.fk = t1.pk
WHERE ...
        AND NOT EXISTS(SELECT t22.* FROM t2 t22 WHERE t22.date > t2.date AND NOT EXISTS(SELECT t23.* FROM t2 t23 WHERE t23.pk > t22.pk))



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


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