Что не так с этим запросом MYSQL - PullRequest
0 голосов
/ 29 декабря 2011

У меня следующий SQL-запрос, кажется, он работает нормально, но я обеспокоен тем, что мой сайт растет, он может работать не так, как ожидалось, я хотел бы сказать, насколько эффективен и действенен этот запрос на самом деле:

select * from articles where category_id=XX AND city_id=XXX GROUP BY user_id ORDER BY created_date DESC LIMIT 10;

По сути, я пытаюсь достичь - получить самые новые статьи по create_date, ограниченному 10, статьи должны выбираться только при соблюдении следующих критериев:

  1. Идентификатор города должен равняться данному значению
  2. Идентификатор категории должен равняться данному значению
  3. Только одна статья на пользователя должна быть возвращена
  4. Статьи должны быть отсортированы по дате, и должны быть возвращены только 10 самых последних статей

Ответы [ 2 ]

0 голосов
/ 29 декабря 2011

У вас есть предложение GROUP BY, которое содержит только один столбец, но вы извлекаете все имеющиеся столбцы, не агрегируя их. Понимаете ли вы, что значения, возвращаемые для столбцов, не указанных в GROUP BY и не агрегированных , не гарантированы ?

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

Итак, я бы по крайней мере изменил предложение ORDER BY на что-то вроде этого:

ORDER BY MAX(created_date)

или это:

ORDER BY MIN(created_date)
0 голосов
/ 29 декабря 2011

некоторые потенциальные улучшения (для лучшей производительности запросов):

  • убедитесь, что у вас есть индекс для всех запрашиваемых столбцов
    примечание: проверьте, действительно ли вам нужен индекс для всех столбцов, потому что этоимеет отрицательную производительность, когда BD должен построить индекс.-> для более подробной информации посмотрите здесь: http://dev.mysql.com/doc/refman/5.1/en/optimization-indexes.html
  • SELECT * выберет все столбцы таблицы.ВЫБЕРИТЕ только те, которые вам действительно нужны ...
...