2012-06-18 4 views
0

Рассмотрите таблицу products, которая содержит информацию о продукте, включая ее категорию. Один продукт может принадлежать нескольким категориям, поэтому я сохраняю его как список идентификаторов категорий, разделенный запятыми.MYSQL разделенные запятыми идентификаторы против отдельной таблицы

Я знаю, что это не нормализованный подход.

Может ли любой эксперт MYSQL сказать мне, какой подход будет быстрее для выбора продуктов определенной категории.

Очевидно, что мы должны ПРИСОЕДИНЯЙТЕСЬ products стол и products_category_relation стол, если принять нормализованный подход.

И

В моем подходе мы должны написать как запрос, чтобы найти продукты (предположим, что мы ищем идентификатор категории 10)

SELECT p.* 
FROM products p 
WHERE p.category like '10' 
OR p.category like '10,%' 
OR p.category like '%,10' 
OR p.category like '%,10,%' 

Может ли один скажите мне, если этот подход быстрее или подход JOIN будет быстрее?

Я знаю о нормализации. Я знаю о других рисках, связанных с моим подходом. Но в моем случае это не имеет значения. Итак, я обеспокоен скоростью.

Любое теоретическое объяснение относительно его скорости или практического результата испытаний приветствуется.

UPDATE

Я использую MyISAM двигатель таблица продукт имеет первичный ключ product_id индекс полнотекстовый на category колонке таблицы products

ответ

2

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

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

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

+0

«Это также потребует больше места на диске, так как номера, как правило, более дорогие, когда сохраняются как» @EmilVikstrom, я думаю, что это верно для больших чисел. обычно идентификатор категории не превышает 3 символов. – Imdad

+1

Imdad, в этом случае используйте 'UNSIGNED SMALLINT', который использует 2 байта и имеет диапазон от' 0' до '65535'. –

+0

Насколько ваш ответ кажется лучше других. +1 – Imdad

1

принять нормализованный подход.

Вы не указали много информации о связанных таблицах, ключах и индексах, установленных на этих таблицах и используемом вами двигателе, но JOIN будет быстрее почти в любом случае (намного быстрее, чем like -mess).

+0

проверить обновление пожалуйста – Imdad

5

Пробуйте использовать FIND_IN_SET Функция.

SELECT * FROM `products` WHERE FIND_IN_SET('10',`category`)>0; 

Вы можете сравнить результаты против нормированного подхода, но это, безусловно, будет более надежной, чем несколько LIKE положений

+0

+1 для FIND_IN_SET – Imdad

+0

Он более надежный и работает нормально, но, говоря о производительности, это все еще медленнее, чем отдельная таблица – CodeBrauer

Смежные вопросы