eprivalov
@eprivalov
Учусь

Как оптимизировать SQL-запрос?

Помогите оптимизировать SQL запрос, пожалуйста.

SELECT
					tx5_wdata.id AS map_id,
					tx5_wdata.fieldtype AS map_fieldtype,
					tx5_wdata.oasistype AS map_oasis,
					tx5_wdata.x AS map_x,
					tx5_wdata.y AS map_y,
					tx5_wdata.occupied AS map_occupied,
					tx5_wdata.image AS map_image,

					tx5_odata.conqured AS oasis_conqured,
					info_user_oasis.username AS oasis_user,
					info_user_oasis.tribe AS oasis_tribe,
					info_alliance_oasis.tag AS oasis_alli_name,

					tx5_vdata.wref AS ville_id,
					tx5_vdata.owner AS ville_user,
					tx5_vdata.name AS ville_name,
					tx5_vdata.capital AS ville_capital,
					tx5_vdata.pop AS ville_pop,

					tx5_users.id AS user_id,
					tx5_users.username AS user_username,
					tx5_users.tribe AS user_tribe,
					tx5_users.alliance AS user_alliance,

					tx5_alidata.id AS aliance_id,
					tx5_alidata.tag AS aliance_name

				FROM ((((((tx5_wdata
					LEFT JOIN tx5_vdata ON tx5_vdata.wref = tx5_wdata.id )
					LEFT JOIN tx5_odata ON tx5_odata.wref = tx5_wdata.id )
					LEFT JOIN tx5_users AS info_user_oasis ON info_user_oasis.id = tx5_odata.owner )
					LEFT JOIN tx5_alidata AS info_alliance_oasis ON info_alliance_oasis.id = info_user_oasis.alliance )
					LEFT JOIN tx5_users ON tx5_users.id = tx5_vdata.owner )
					LEFT JOIN tx5_alidata ON tx5_alidata.id = tx5_users.alliance )
			where tx5_wdata.id IN ($maparray)
			ORDER BY FIND_IN_SET(tx5_wdata.id,'$maparray2')
  • Вопрос задан
  • 2643 просмотра
Пригласить эксперта
Ответы на вопрос 4
@Lacaille
Данный запрос оптимизировать не надо, так как, несмотря на пугающий размер, структура его проста. Скорость его работы зависит от индексации полей, по которым проводится связь таблиц.
Все скобки после FROM можно убрать за ненадобностью.
Ответ написан
Комментировать
icelaba
@icelaba
Знаю и умею всё
DROP DATABASE yourdb
Нет базы, нет проблемы :-)

А если серьезно, то вам надо уменьшать количество JOIN, например сохраняя часть из них или все во временную табличку, тут зависит от того насколько часто основная таблица обновляется.
Например если время добавления-изменения записи не критично - то можно создавать временную табличку сразу после добавления изменения

Индексы по полям из ON надеюсь уже расставлены
Ответ написан
Sander_Li
@Sander_Li
Backend developer
1) Попробуй Analize База подскажет
2) Дефрагментируй таблицы (OPTIMIZE TABLE `t`)
3) Проверяй что происходит через explain, когда пробуешь свои варианты.
4) Убедись, что в запросе подставляются верные типы данных. Например `поле` = '1' и `поле` = 1 - результат один, но второй вариант быстрее.
Ответ написан
Комментировать
Satanpit
@Satanpit
Front-end developer
Можете попробовать сделать денормализацию и связать данные триггерами, если количество чтений значительно превышает количество записей.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы