Я использую общеизвестный алгоритм reddit «hot» на моих «столбах» таблицы. Теперь этот горячий столбец представляет собой десятичное число, подобное этому: «XXXXX, XXXXXXXX»
Я хочу, чтобы этот столбец был индексом, потому что, когда я заказываю «горячим», я хочу, чтобы запрос был как можно быстрее. Однако я новичок в индексах. Нужен ли уникальный индекс?
Если он должен быть уникальным, будет ли это работать и быть эффективным?
$table->unique('id', 'hot');
Если это не должно быть уникальным, будет ли это правильным подходом?
$table->index('hot');
Последний вопрос: может ли следующий запрос использовать индекс?
Post::orderBy('hot', 'desc')->get()
Если нет, как мне его изменить?
Большое спасибо!
Не делайте это UNIQUE, если вам не требуется ограничение, в котором вы не можете вставлять дубликаты.
По-разному, ключ UNIQUE
– это две вещи: INDEX
(для быстрого поиска) и «ограничение» (чтобы дать ошибку при попытке вставить дубликат).
ORDER BY hot DESC
может использовать INDEX(hot)
(или UNIQUE(hot)
). Я говорю «может», а не «будет», потому что есть другие проблемы, когда Оптимизатор может решить не использовать индекс. (Не видя фактического запроса и не зная больше о наборе данных, я не могу быть более конкретным).
Если id
является PRIMARY KEY
, то ни одно из них не имеет никакого значения: INDEX(id, hot)
; UNIQUE(id, hot)
. Подмена порядка столбцов имеет смысл. Или просто INDEX(hot)
.
Оговорка: EXPLAIN
не говорит, используется ли индекс для ORDER BY
, только для WHERE
. С другой стороны, EXPLAIN FORMAT=JSON
дает более подробную информацию. Попробуй это.
(Да, столбцы DECIMAL
могут быть проиндексированы.)