Есть таблица с товарами, которые имеют четко указанные аналоги.
Привязка аналогов планировалась производится по id, который auto_increment.
В таблице где-то 2 миллиона записей на сегодняшний день.
В таблице товары представлены в разнобой, без какой-либо сортировки. Что вызывает переполнение временной папки, потому что запрос с пагинацией постоянно сортирует по алфавиту выборку, и вообще говоря выборка не всегда просто взять пачку и вывести - иногда нужно из определенной категории вывести например. Причем вверху отобразить те которые в конкретной категории, а за ними - те которые в дочерних категориях.
Выдавать клиенту список планируется отсортированным по полю `name`, если правильно понимаю, то чтобы каждый запрос не приходилось пересортировывать всю таблицу - нужно по хорошему первичный ключ сразу поставить на `name`.
Но как тогда делать привязку похожих товаров, понимая что name это длинная может быть строка, а если я переключу первичный ключ, то auto_increment уже не сделать?
Вам надо почитать хорошие книги по реляционной теории, СУБД, а то у вас каша в голове. Для начала хотя бы почитайте, что такое первичный ключ — он вовсе не предназначен для сортировки и не гарантирует никакую сортировку.
Евгений, Для начала я хочу чтобы вы перестали всех учить жить. Рекомендация почитать не несет ничего кроме понтов. Есть проблема, она имеет решение. Решение можно найти путем почитать. Но это нерационально, если другой человек уже его нашел. Что, вы хотите мне его продать? В капитализме убийства тоже бывают. Это в вашей голове каша.
Григорий Васильков, Понты не при чем. Просто мне кажется, что оптимальный способ работы с базой данных такой: сначала получить теоретические знания, почитать, что такое таблицы, ключи, индексы. Затем начинать что-то реализовывать. Ваш вопрос показывает, что вы сначала начали что-то делать, не зная основ, и у вас появились какие-то совершенно неверные концепции, конкретно, что первичный ключ как-то влияет на упорядочивание записей в таблице.
Первичный ключ — это совершенно другая сущность, он нужен для других целей.
Думаю, что подобный метод разработки — экспериментированием вслепую вместо изучения основ - непродуктивен и порочен по своей сути, вот и все.
Понты всегда причем. Просто ты пока не осознал, что этого не нужно стесняться и потому не говоришь.
Те кому не нужны понты - те присоединяются к задаче и решают ее, им в кайф решение получить. Все кто учит жизни - у тех всегда понты причем. в 100% случаев, если будет угодно.
Добавлю Вам для понимания. Вам с преподавателем повезло - он Вам объяснил, что написано в книгах. А нас учили робота двигать по клеточкам, и для меня эта книга - что газета - смотрю книгу вижу фигу. Но это ведь значит что "программирование это не моё", или что там матричные человечки еще сегодня говорят?
Это не потому что я родился определенным нитаким или лентяем. Это потому что я не понимаю язык конкретно этих авторов. Это совершенно нормальная ситуация в мире где как только нужны деньги, сразу создается еще один новый язык "ни такой как все"
если правильно понимаю, то чтобы каждый запрос не приходилось пересортировывать всю таблицу
Боюсь, что неправильно вы понимаете. В общем случае первичный ключ не гарантирует никакую волшебную автоматическую сортировку. В некоторых движках такая сортировка действительно может быть, но вы не указали что именно у вас используется.
В некоторых движках можно делать автоинкремент не только по первичному ключу.
Действительно стоящая статья, думал очередная "житейская мудрость" со ставшего бесполезным хабра. Маркетологи сами для себя там пишут и такие же потом читают, экранировали деньги от всех умных людей.
==
Оказалось интересно. Было любопытно узнать, что индекс может быть понят почти как временная таблица со своей собственной сортировкой. И сделав грамотный составной индекс запрос будет отрабатывать мгновенно, т.к. вместо огромной таблицы он будет использовать индекс, где уже все сортировано как полагается.
Григорий Васильков, Стоит учитывать, что создание и хранение индексов тоже не бесплатная штука, и если переусердствовать можно получить увеличение нагрузки при вставке, например.
Благодарю.
В соседнем ответе посоветовали отличную статью
Я думал mysql использует индексы каким-то хитрым способом, оказалось что это почти тоже самое что временные таблицы. То есть нужно не один индекс добавить, а несколько составных, под каждый "тяжелый" запрос
Для правильного вопроса надо знать половину ответа
если правильно понимаю, то чтобы каждый запрос не приходилось пересортировывать всю таблицу - нужно по хорошему первичный ключ сразу поставить на `name`
Неправильно понимаете. Достаточно сделать индекс по полю `name`. Таблице не пересортировывается, просто записи выбираются по индексу.