Ваши несколько индексов не должны замедлять ваши обновления.
Вам нужны два индекса, чтобы и ваше обновление, и выбор работали хорошо. Я думаю, у вас никогда не было обоих одновременно.
UPDATE wtb_device_auths SET auth= :auth WHERE device_id_fk= :device_id_fk
Вам нужен индекс на device_id_fk
, чтобы это обновление работало хорошо. И независимо от его индекса он должен быть объявлен внешним ключом.
SELECT device_id_fk
FROM wtb_device_auths AS dv
WHERE (dv.auth= :auth OR dv.old_auth= :auth)
LIMIT 1
Вам нужен один объединенный индекс на auth, old_auth
, чтобы этот запрос работал хорошо.
Отдельные auth
и old_auth
индексы также должны работать хорошо, если не будет слишком много дубликатов. MySQL объединит результаты по индексам , и это объединение должно быть быстрым ... если не совпадает много строк.
Если вы также ищете только old_auth
, добавьте index для old_auth
.
И, как уже отмечали другие, запрос select
может вернуть одно из нескольких соответствующих устройств с совпадающим auth или old_auth. Это наверное плохо. Если auth
и old_auth
предназначены для идентификации устройства, добавляет уникальное ограничение .
В качестве альтернативы вам необходимо реструктурировать данные. Несколько столбцов, содержащих одно и то же значение, помечены красным флагом. Это может привести к увеличению количества индексов, а также ограничить количество версий, которые вы можете хранить. Вместо этого используйте только одну аутентификацию на строку и разрешите каждому устройству иметь несколько строк.
create table wtb_device_auths (
id serial primary key,
device_id bigint not null references wtb_devices(id),
auth text not null,
created_at datetime not null default current_timestamp,
index(auth)
);
Теперь вам нужно искать только один столбец.
select device_id from wtb_device_auths where auth = ?
Теперь одно устройство может иметь много Строки wtb_device_auths. Если вам нужна текущая авторизация для устройства, найдите новейшую.
select device_id
from wtb_device_auths
where device_id = ?
order by created_at desc
limit 1
Поскольку каждое устройство будет иметь только несколько аутентификаций, вероятно, это будет достаточно быстро с одним индексом device_id
; сортировка нескольких строк для устройства будет быстрой.
Если нет, вам может понадобиться дополнительный комбинированный индекс, такой как created_at, device_id
. Это включает в себя поиск и сортировку только по created_at
, а также поиск и сортировку запросов по created_at
и device_id
.