Как я могу оптимизировать эту простую базу данных и запрос, используя php и mysql? - PullRequest
0 голосов
/ 11 декабря 2011

Я извлекаю ряд (например, лимит 72, 24) игр из базы данных, согласно которой проголосовали наиболее популярные.У меня есть отдельная таблица для отслеживания игровых данных и одна для отслеживания отдельных голосов за игру (оценка от 1 до 5, один голос на пользователя на игру).Игра считается «самой популярной» или «более популярной», если эта игра имеет наивысший средний рейтинг среди всех рейтинговых голосов за указанную игру.Игры с количеством голосов менее 5 не рассматриваются.Вот как выглядят эти таблицы (две таблицы «игры» и «голоса»):

games:
gameid(key)
gamename
thumburl

votes:
userid(key)
gameid(key)
rating

Теперь я понимаю, что есть нечто, называемое «индекс», которое может существенно ускорить мои запросы,предварительно запросив мои таблицы и составив отдельную таблицу индексов (я не знаю, на самом деле ... это только мое впечатление).

Я также читал, что mysql работает быстрее всего, когда несколько запросов могут быть сведены в одинболее длинный запрос (содержащий объединения и вложенные операторы выбора, я полагаю).

Однако в настоящее время я НЕ использую индекс, и я делаю несколько запросов для получения окончательного результата.

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

Спасибо.

Ответы [ 4 ]

1 голос
/ 11 декабря 2011

Ваш запрос, который вычисляет среднее значение для каждой игры, может выглядеть так:

SELECT gamename, AVG(rating)
FROM games INNER JOIN votes ON games.gameid = votes.gameid
GROUP BY games.gameid
HAVING COUNT(*)>=5 
ORDER BY avg(rating) DESC
LIMIT 0,25

У вас должен быть индекс gameid как для игр, так и для голосов.(если вы определили gameid как первичный ключ в настольных играх, это нормально)

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

Индекс - это ФИЗИЧЕСКАЯ СТРУКТУРА ДАННЫХ, которая используется для ускорения запросов типа поиска; это не просто стол за столом -> хорошо для концепции. Другая концепция заключается в том, как индексы работают в задней части вашего учебника (единственное отличие состоит в том, что в вашей книге ключ поиска может указывать на несколько страниц / совпадений, тогда как при индексировании ключ поиска указывает только на одну страницу / совпадение). Индекс определяется структурами данных, так что вы можете использовать индекс дерева B +, и есть даже хеш-индексы. Это оптимизация базы данных / запросов с физического / внутреннего уровня базы данных - я предполагаю, что вы знаете, что работаете на более высоких уровнях СУБД, что проще. Индекс коренится на внутренних уровнях, что делает оптимизацию запросов к БД гораздо более эффективной и интересной.

Я заметил из вашего вопроса, что вы еще даже не разработали запрос. Сначала сфокусируйтесь на запросе. Индексирование происходит после того, как на самом деле, в любом курсе Базы данных для выпускников или аспирантов, индексирование относится к ведению Базы данных и не обязательно к разработке.

Также Н.Б. Я видел довольно много людей, которые, как правило, говорили, что все первичные ключи должны быть индексами. Это неправда. Существует много случаев, когда индекс первичного ключа замедлял работу базы данных. На самом деле, если мы будем использовать только первичные индексы, то должны использовать хеш-индексы, поскольку они работают лучше, чем деревья B +!

Таким образом, не имеет смысла задавать вопрос для запроса и индекса. Сначала попросите помочь с запросом. Затем, учитывая ваши таблицы (реляционную схему) и SQL-запрос, тогда и только тогда я смогу посоветовать вам лучший индекс - помните его обслуживание. Мы не можем выполнять техническое обслуживание, если есть 0 развития.

С уважением,

N.B. Большинство вопросов, касающихся индексов на уровне последипломного образования многих компьютерных курсов, заключаются в следующем: мы даем студентам реляционную схему (т. е. ваши таблицы) и запрос, а затем задаем: критически предлагаем подходящий индекс для следующего запроса в таблицах - -> мы не можем задать такой вопрос, если у них нет запроса

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

Если у вас есть доступ к хранилищу InnoDB для ваших таблиц, вы можете создать внешние ключи для gameid в таблице votes, которая будет использовать индекс, созданный для вашего первичного ключа в games Таблица. Когда вы затем выполняете запрос, который объединяет эти две таблицы (например, ... INNER JOIN votes ON games.gameid = votes.gameid), он будет использовать этот индекс для ускорения процесса.

Ваше понимание индекса по существу правильно - он в основном создает отдельную таблицу поиска, которую он может использовать за кулисами при выполнении запроса.

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

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

Согласно документации MySQL, индекс создается при назначении первичного ключа на создание таблицы . Это стоит упомянуть, потому что не все функции СУБД работают таким образом.

Я думаю, что у вас есть правильная идея: таблица «голоса» служит связующим звеном между «играми» и «пользователем» для управления отношениями «многие ко многим». Просто убедитесь, что «ID пользователя» и «GameID» проиндексированы в таблице «голосов».

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