ограничение размера запроса MySQL ruby ​​/ mysql - PullRequest
1 голос
/ 18 апреля 2009

Я надеюсь, что это подходящее место, чтобы задать мой вопрос.

Мой запрос MySQL в настоящее время выглядит так

@records = Record.find(:all, :select => "`records`.id, records.level as level,
  (SELECT (count( b.id ) + 1)
  FROM records as a, records as b
  WHERE a.id =  records.id and b.skill > a.skill and b.created_at ='#{vandaag}' ) as ranktoday,
  (SELECT (count( a1.id ) + 1)
  FROM records as a1, records as b1
  WHERE a1.id =  timestamp1.id and b1.skill > a1.skill and b1.created_at ='#{timestamp1}' ) as ranktimestamp1,
  records.skill as skill, worlds.title as world, chars.name as name, vocs.voc as vocation, timestamp1.skill as timestamp1",
  :conditions => ["`s1`.title = :skill AND `records`.created_at = :vandaag ", {:skill => params[:id], :vandaag => vandaag, :timestamp1 => timestamp1}],
  :joins => "
  LEFT OUTER JOIN `skilltypes` as `s1` ON `s1`.id = `records`.skilltype_id
  LEFT OUTER JOIN `records` as `timestamp1` on `timestamp1`.character_id = `records`.character_id and `timestamp1`.created_at = '#{timestamp1}'
  LEFT OUTER JOIN `characters` as `chars` ON `chars`.id = `records`.character_id
  LEFT OUTER JOIN `vocations` as `vocs` ON `vocs`.id = `chars`.vocation_id
  LEFT OUTER JOIN `worlds` ON `worlds`.id = `chars`.world_id",
  :limit => "500",
  :order => "`records`.skill DESC"

Для меня это довольно длинный запрос, и я боюсь, что все эти объединения вызывают мои проблемы.
И если я прав, оператор order заставляет mysql объединять все записи с таблицами, и после этого получают только первые 500 вместо того, чтобы сначала упорядочивать записи, ограничивая, а затем начав присоединяться к ним. Вы понимаете?

И проблема не была бы такой большой, если бы у меня было только 1000 записей, но в настоящее время я получаю 380000 записей, и ежедневно я получаю еще 21000 записей.

Мой реальный вопрос: как мне узнать, лучше ли разделять объединения в разных запросах mysql?
Или мой запрос mysql просто беспорядок и работает над вашими смехотворцами и заставляет меня выглядеть как дурак?

Я застрял здесь, так как время загрузки ужасно.

Привет, Риккерт

Edit: И у меня есть индексы на characters.world_id, characters.vocation_id, records.character_id, records.skilltype_id, records.skill, records.world_id, которые, я думаю, должно быть достаточно Greetz, Rikkert

Ответы [ 3 ]

1 голос
/ 04 мая 2009

Я определенно не эксперт MySQL, но по своему опыту я обнаружил, что использование sub-SELECT может быть источником некоторых проблем с производительностью.

Я стараюсь избегать их использования, но это не всегда возможно.

Эта SO имеет дополнительную информацию, которая может оказаться полезной:

MySQL, вопрос выбора производительности?

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

0 голосов
/ 19 мая 2009

Во-первых, похоже, что вы не используете активную запись, как задумано. Позвольте ему управлять ассоциациями между таблицами для вас. Я предполагаю, что, скорее всего, есть способ получить необходимую информацию, не прибегая к такому ручному созданию SQL. Извиняюсь, если я просто выбираю что-то, что вы отредактировали для своего примера.

Во-вторых, используйте EXPLAIN, чтобы понять, как mysql выполняет ваш запрос.

Планировщик запросов Mysql очень прост и часто удивляет людей, которые привыкли к Oracle и т. Д. В онлайновых документах mysql есть хорошая информация о том, как Mysql использует индексы.

Распространенным шаблоном для оптимизации сложных запросов является снятие нормализации: использование наблюдателя для ведения второй таблицы именно той информации, которую вы хотите (в основном материализованное представление).

0 голосов
/ 18 апреля 2009

Мой первый вопрос: настроены ли у вас индексы? В любом месте вашего запроса, в котором вы проводите сравнение, вам, вероятно, следует настроить индекс для соответствующих столбцов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...