Два запроса, которые почти одинаковы, но они не загружаются даже быстро - PullRequest
0 голосов
/ 27 ноября 2018

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

Когда я выполняю первый запрос, чтобы найти владельца автомобиля, требуется около,1 секунда

SELECT aid FROM owned_vehicles INNER JOIN users ON users.identifier = owned_vehicles.owner WHERE vehicle LIKE '%04IBQ509%' LIMIT 1

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

aid
11

Но когда я использую тот же запрос на другом номерном знаке, загрузка данных занимает более 30 секунд (обнаружена эта проблема, когда пользователи жаловались на время загрузки и сообщение о тайм-ауте).)

SELECT aid FROM owned_vehicles INNER JOIN users ON users.identifier = owned_vehicles.owner WHERE vehicle LIKE '%85RAF179%' LIMIT 1

Через более 30 секунд это приведет к 5475.Как может случиться так, что этой новой машине требуется гораздо больше времени для загрузки?

Пытаясь решить эту проблему, я выполнил эти запросы как в HeidiSQL (MySQL GUI), так что это также приводит к странным временам выполнения

Я попытался создать индекс столбца транспортного средства, чтобы ускорить его.Но это не делает различий.

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

1 Ответ

0 голосов
/ 27 ноября 2018

Вы выполняете LIKE с подстановочным знаком % в начале.Это исключает использование какого-либо указателя на колонке транспортного средства.Если вы уберете % в начале номера транспортного средства, а затем добавите индекс к этому столбцу, вы увидите значительно улучшенную производительность.Конечно, это меняет природу запроса, но, как есть, вы выполняете сканирование таблицы на таблице owned_vehicles, которая не будет устойчивой для запроса, который выполняется с какой-либо регулярностью в вашей игре.

Увидев комментарии выше, кажется, что ваш столбец автомобиля на самом деле является данными JSON.Вы должны переосмыслить способ хранения.Если вам нужно очень быстро запросить транспортные средства с регистрационным номером, вам нужно извлечь эту регистрацию в другой столбец, проиндексировать ее и отфильтровать через этот столбец.Попытка фильтрации на основе LIKE строки JSON - это не то, для чего предназначена СУБД.Помимо всего прочего, вы не можете быть уверены, что передаваемые вами строки не будут совпадать с другим свойством (кроме регистрации) в строке JSON.

...