Структура таблицы MySQL

S1
На сайте с 13.03.2008
Offline
49
1051

Подскажите, какая структура таблицы будет более оптимальной с точки зрения производительности(в разы):


ID bigint(20) Primary key
appID bigint(20) index
optionID tinyint(2) index
optionValue tinyint(2) index

Запросы будут вида:

SELECT appID FROM `table` WHERE (optionID = 1 AND optionValue IN(1,2,3)) AND (optionID = 2 AND optionValue IN(1,2,3)) AND (optionID = 3 AND optionValue IN(1,2,3));

и

SELECT * FROM `table` WHERE appID = 975;

Выборка будет включать до 15 пар optionID optionValue. Будет более чем 1 500 000 записей.

или такая структура:


appID bigint(20) Primary key
option_1 tinyint(2) index
option_2 tinyint(2) index
option_3 tinyint(2) index
option_4 bit(1) index
option_5 bit(1) index
option_6 bit(1) index

Тут соответственно такой запрос:

SELECT appID FROM `table` WHERE option_1 IN(1,2,3) 1 AND option_2 = IN(1,2,3) AND option_3 = IN(1,2,3);

и

SELECT * FROM `table` WHERE appID = 975;

В данном варианте количество колонок с option_ >= 15. Будет больше 100 000 записей.

Железо такое: двухядерный Athlon 3,5Ггц, 2Gb.

Дизайн сайтов (UI/UX), логотипов, баннеров и прочего... (/ru/forum/770062)
edogs software
На сайте с 15.12.2005
Offline
775
#1
Select appID FROM `table` WHERE (optionID = 1 AND optionValue IN(1,2,3)) AND (optionID = 2 AND optionValue IN(1,2,3)) AND (optionID = 3 AND optionValue IN(1,2,3));

Хотите выбрать товар у которого будут 3 свойства с заданными значениями? Это вряд ли сработает, ведь where работает по строке. optionID у Вас не может быть 1 ... and 2... and 3 в одной строке

А если Вы поставите optionid=1 ... or optionid=2 ... , то сделаете выборку в которой будет хоть одно свойство, но не обязательно будут другие.

В принципе это решаемо подзапросами... но Вы все равно огребете проблему, когда захотите добавить в выборку запросы вида "цвет не красный".

И в целом этот вариант будет не только сложноватый, но и как следствие тормозной неслабо.

Второй вариант лучше и по скорости и по простоте, особенно если параметров не сильно много. Правда вместо bit лучше использовать enum или set (при чем set поможет упаковать даже много параметров, если они все околобитового значения).

А если во втором варианте в таблице Вы оставите только те значения по которым идет поиск (полный список параметров храня в таблице с первой структурой), то это будет самый шикарный - третий вариант.

p.s.: кстати известные тормоза битрикса не в последнюю очередь из-за использования "по умолчанию" первого варианта структуры, что они попытались исправить "инфоблоками 2.0", правда не особо удачно.

Разработка крупных и средних проектов. Можно с криптой. Разумные цены. Хорошее качество. Адекватный подход. Продаем lenovo legion в спб, дешевле магазинов, новые, запечатанные. Есть разные. skype: edogssoft
S1
На сайте с 13.03.2008
Offline
49
#2

Благодарю. Можно поподробнее по "третьему" варианту. Я заранее не знаю по каким параметрам будет выборка т.к. это пользовательский запрос.

Вы оставите только те значения по которым идет поиск (полный список параметров храня в таблице с первой структурой)

Как это реализовать?

edogs software
На сайте с 15.12.2005
Offline
775
#3
smart1k:
Благодарю. Можно поподробнее по "третьему" варианту. Я заранее не знаю по каким параметрам будет выборка т.к. это пользовательский запрос.
Как это реализовать?

Если данные у Вас как Вы написали, т.е. 100,000 товаров и всего 6 свойств (исходя из структуры 2 таблицы), то даже все свойства не будут проблемой на Вашем конфиге. Особенно учитывая что больше половины свойств у Вас битовые. Размер таблицы будет крошечный и проблемы представлять не будет.

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

По поводу всех остальных ситуаций абстрактно не ответить, нужно смотреть на статистику товаров, их типы, важность параметров и т.д..

S1
На сайте с 13.03.2008
Offline
49
#4
А если говорить в общем обычно юзер не может искать по абсолютно всем параметрам, в поисковую форму выводят ограниченное количество - вот по ним и делают поисковую таблицу.

Теперь понятно. Ну да, в форме будет около шести обязательных параметров и еще около 10 опциональных. Только обязательные будут помещены в поисковую таблицу.

Правда вместо bit лучше использовать enum или set (при чем set поможет упаковать даже много параметров, если они все околобитового значения).

Ячейки исключительно со значениями 1,0

EC
На сайте с 29.11.2010
Offline
73
#5

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

потому как правило параметры нужны или для того что бы показать на странице товара (материал, цвет...) или для поиска - что происходит не так часто как вы думаете.

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

S1
На сайте с 13.03.2008
Offline
49
#6
Я бы сделал отдельную таблицу параметров, и в ней бы искал

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

потому как правило параметры нужны или для того что бы показать на странице товара

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

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий