gzhegow
@gzhegow
aka "ОбнимиБизнесмена"

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

Есть таблица с товарами, которые имеют четко указанные аналоги.
Привязка аналогов планировалась производится по id, который auto_increment.
В таблице где-то 2 миллиона записей на сегодняшний день.

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

Выдавать клиенту список планируется отсортированным по полю `name`, если правильно понимаю, то чтобы каждый запрос не приходилось пересортировывать всю таблицу - нужно по хорошему первичный ключ сразу поставить на `name`.

Но как тогда делать привязку похожих товаров, понимая что name это длинная может быть строка, а если я переключу первичный ключ, то auto_increment уже не сделать?

Или как-то можно выкрутиться?

Спасибо.
  • Вопрос задан
  • 269 просмотров
Решения вопроса 1
Stalker_RED
@Stalker_RED
если правильно понимаю, то чтобы каждый запрос не приходилось пересортировывать всю таблицу
Боюсь, что неправильно вы понимаете. В общем случае первичный ключ не гарантирует никакую волшебную автоматическую сортировку. В некоторых движках такая сортировка действительно может быть, но вы не указали что именно у вас используется.

В некоторых движках можно делать автоинкремент не только по первичному ключу.

Почитайте про индексы, в том числе составные. Первая ссылка из гугла по запросу "составные индексы mysql" https://ruhighload.com/post/%D0%A0%D0%B0%D0%B1%D0%...
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Вы можете в уже существующую таблицу добавить поле ID с auto_increment и он автоматически будет сгенерирован для всех товаров.

-> ADD id INT NOT NULL AUTO_INCREMENT,
-> ADD PRIMARY KEY (id);

Полная инструкция тут.
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
если правильно понимаю, то чтобы каждый запрос не приходилось пересортировывать всю таблицу - нужно по хорошему первичный ключ сразу поставить на `name`

Неправильно понимаете. Достаточно сделать индекс по полю `name`. Таблице не пересортировывается, просто записи выбираются по индексу.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы