Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Выбор индекса для заранее не определенного запроса
 
 автор: Igorek   (23.11.2012 в 13:50)   письмо автору
 
 

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

  Ответить  
 
 автор: Sfinks   (23.11.2012 в 15:16)   письмо автору
 
   для: Igorek   (23.11.2012 в 13:50)
 

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

  Ответить  
 
 автор: Igorek   (23.11.2012 в 16:48)   письмо автору
 
   для: Sfinks   (23.11.2012 в 15:16)
 

я не про организацию хранения. здесь все просто - одна таблица, описывающая одну сущность с большим кол-вом параметров, но их фиксированное число N.
Наиболее частой задачей, выполняемой применительно к этой таблице, будет выборка по этим параметрам. Соответственно, хотелось бы избежать фулл скана таблицы, но т.к. комбинация этих параметров может быть любой, то я не представляю какой или какие надо создать для поиска индексы.
Т.е. имеем например поля f1,f2,f3,f4.
Если пользователь выбрал все 4 параметра для поиска, то запрос будет вида:
WHERE f1 = value1 AND f2 = value2 AND f3 = value3 AND f4 = value4

тогда прекрасно подойдет составной индекс по всем четырем полям.
Но если пользователь выбрал только f2 и f4, то для запроса:
WHERE  f2 = value2 AND f4 = value4

этот индекс уже не будет использован.

  Ответить  
 
 автор: Sfinks   (24.11.2012 в 02:18)   письмо автору
 
   для: Igorek   (23.11.2012 в 16:48)
 

Это я все понял.
Не важно, что полей фиксированное количество.
Предложенная структура вам все равно подойдет.
У вас есть таблица objects:
id | name | field1 | field2 | field3

Замените на 3 таблицы:
objects:
obj_id | obj_name

fields:
field_id | field_name

vals:
obj_id | field_id | value

У вас будет всего несколько индексов.
Да, запросы будут сложные, но быстрые.

  Ответить  
 
 автор: igorek   (26.11.2012 в 08:39)   письмо автору
 
   для: Sfinks   (24.11.2012 в 02:18)
 

Интересно, хотя честно говоря смущает, что все параметры будут типа varchar, т.к. значения будут хранится в одном поле vals.value. Контроля значений на уровне БД уже не будет.
Да и, наверное, я бы убрал таблицу fields, а в таблице vals поле field_id сделал типа ENUM (т.к. кол-во полей фиксированное). Хоть какое-то упрощение структуры

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования