powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Модель EAV (сущность - характеристики)
25 сообщений из 53, страница 2 из 3
Модель EAV (сущность - характеристики)
    #38528364
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
или даже так: ( http://sqlfiddle.com/#!2/a830f/1 )
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
create temporary table tmp (id_nm int, id_val int);
insert tmp values (4,13),(25,93);

SELECT message_id
FROM jos_md_catalog_message_criterions
join tmp t on t.id_nm=`id_criterions_name` and t.id_val=`id_criterions_values`
group by message_id
having count(*)=(select count(*) from tmp);

drop temporary table tmp;
...
Рейтинг: 0 / 0
Модель EAV (сущность - характеристики)
    #38528500
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сгенерил таблицу на 11000 характеристик для 2000 товаров, ваш запрос не желает индексы использовать...

А ты видишь в этом запросе слово WHERE ?
Запросы используют индексы, когда в WHERE что-то написано.

Я ж ему говорил, что так лучше. А он -- "удобно, удобно "


подскажите как их правильно создать тогда, индексы


Надо не индексы правильно создавать, а запросы правильно писать.
Индексы надо создавать на значение и тип свойства .
...
Рейтинг: 0 / 0
Модель EAV (сущность - характеристики)
    #38528632
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уточнение: защита от дублей (предполагается, что фильтруемые значения выбираются однократно)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
create temporary table tmp (id int auto_increment primary key, id_nm int, id_val int);
insert tmp (id_nm, id_val) values (4,13),(25,93);

SELECT message_id
FROM jos_md_catalog_message_criterions
join tmp t on t.id_nm=`id_criterions_name` and t.id_val=`id_criterions_values`
group by message_id
having count(distinct t.id)=(select count(*) from tmp);

drop temporary table tmp;
...
Рейтинг: 0 / 0
Модель EAV (сущность - характеристики)
    #38528669
folder-pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cygapb-007,

да индексы на этом вложенном запросе заработали.
но зависание на 62 секунды так и осталось)




...
Рейтинг: 0 / 0
Модель EAV (сущность - характеристики)
    #38528929
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
folder-pro ,

вам уже отвечали ранее 15425584 , что индексы не работают после группировки.

попробуйте добавить фильтр в запрос (перед группировкой)
...
Рейтинг: 0 / 0
Модель EAV (сущность - характеристики)
    #38528933
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можете так же сравнить обведенное рамкой с примером из 15424973
...
Рейтинг: 0 / 0
Модель EAV (сущность - характеристики)
    #38528974
folder-pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем наконец то заработало.
Не идеально конечно, но уже хоть что то.



вопрос остается открытым по последнему эксплайну, кто что скажет, можно ли как то улучшить ситуацию с работой по индексам?

например если взять основную таблицу в которой например будет 250 000 записей, и по 10 характеристик на один товар, получим перебор таблицы в которой 2 500 000 записей и джойн ее хоть и по PK к таблице в которой 250 000 записей. при этом еще и Using temporary; Using filesort
...
Рейтинг: 0 / 0
Модель EAV (сущность - характеристики)
    #38528982
folder-pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cygapb-007можете так же сравнить обведенное рамкой с примером из 15424973

Да да конечно я это заметил.

WHERE
(`id_criterions_name`,`id_criterions_values`) in (
(4,13),(25,93)
)

но вот кроме добавленного в эксплайн Using where; Using index

вместо Using index без этого предиката, я разницы пока не увидел или не догнал в чем она...
что там что там в строке rows 11500 записей, и для примера выше там будет 2 500 000...
и как с этим жить пока не понимаю.
php/.NET/VB я программист, а не SQL гуру, посему мне трудно дается это, прошу пояснить если не сложно.
...
Рейтинг: 0 / 0
Модель EAV (сущность - характеристики)
    #38528992
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
еще раз:

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


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

Хотя если не видно разницы - то и мне и тем более все равно
...
Рейтинг: 0 / 0
Модель EAV (сущность - характеристики)
    #38529008
folder-pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cygapb-007еще раз:

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


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

Хотя если не видно разницы - то и мне и тем более все равно


Другими словами, разница будет видна в скорости работы запроса когда там будет 2 500 000 записей? а не 12 000.




я понимаю что есть разница с where и без него, только вот не понимаю меняется ли последовательность обработки этого запроса или нет, и как это в эксплайн увидеть... Не вижу я ее :)
...
Рейтинг: 0 / 0
Модель EAV (сущность - характеристики)
    #38529123
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
folder-proНе вижу я ее :)explain.rows должно уменьшаться при наличии where
Впрочем, у ва всего 12к записей, может, оптимизатор посчитал выгодней прочитать их все, не дёргая ещё и индекс. Сделайте 120к записей и повторите эксперимент - rows должно отличаться.
Akina
Код: sql
1.
create index idx1 on eav(entity, attrib, val);

Если разных атрибутов будет много, то может быть, выгодней будет idx1 on eav(attrib, val, entity). Можно будет читать даже не весь индекс, а только часть.
...
Рейтинг: 0 / 0
Модель EAV (сущность - характеристики)
    #38529142
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglirЕсли разных атрибутов будет много, то может быть, выгодней будет idx1 on eav(attrib, val, entity). Можно будет читать даже не весь индекс, а только часть.Я демонстрирорвал только факт, что индекс МОЖЕТ ИСПОЛЬЗОВАТЬСЯ. Оптимизация его использования - это значительно более следующий этап.
...
Рейтинг: 0 / 0
Модель EAV (сущность - характеристики)
    #38529168
folder-pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglirfolder-proНе вижу я ее :)explain.rows должно уменьшаться при наличии where
Впрочем, у ва всего 12к записей, может, оптимизатор посчитал выгодней прочитать их все, не дёргая ещё и индекс. Сделайте 120к записей и повторите эксперимент - rows должно отличаться.
Akina
Код: sql
1.
create index idx1 on eav(entity, attrib, val);

Если разных атрибутов будет много, то может быть, выгодней будет idx1 on eav(attrib, val, entity). Можно будет читать даже не весь индекс, а только часть.



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

Огромное всем спасибо за помощь!
...
Рейтинг: 0 / 0
Модель EAV (сущность - характеристики)
    #38529176
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
folder-pro, ну всё-таки попробуйте (name,value,id). Только не на 12к записей. Хотя если name достаточно редкое, то можно и так попробовать.
...
Рейтинг: 0 / 0
Модель EAV (сущность - характеристики)
    #38529182
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglirfolder-pro, ну всё-таки попробуйте (name,value,id). Только не на 12к записей. Хотя если name достаточно редкое, то можно и так попробовать.группировка предполагает предварительную сортировку по id, поэтому вряд ли id в конце индекса будет эффективнее... хотя решать оптимизатору
...
Рейтинг: 0 / 0
Модель EAV (сущность - характеристики)
    #38529196
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cygapb-007,

этот индекс - для случая, когда where отбирает относительно мало дынных. Проще ведь прочитать 100 записей из индекса, чем весь индекс :)
...
Рейтинг: 0 / 0
Модель EAV (сущность - характеристики)
    #38529413
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglirCygapb-007,

этот индекс - для случая, когда where отбирает относительно мало дынных. Проще ведь прочитать 100 записей из индекса, чем весь индекс :)А, в смысле - покрывающий индекс (on (name, val) include (mess_id))... Согласен, этот индекс может оказаться эффективнее.

Хотя фильтрация индекса все равно может оказаться эффективнее отбора фрагментов индекса и сортировки результата...
...
Рейтинг: 0 / 0
Модель EAV (сущность - характеристики)
    #38529417
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cygapb-007, может. Тут уже ТСу самому смотреть надо.
...
Рейтинг: 0 / 0
Модель EAV (сущность - характеристики)
    #38529791
folder-pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir,

догенерил данных до 14к товаров
и 69к характеристик

...
Рейтинг: 0 / 0
Модель EAV (сущность - характеристики)
    #38529803
folder-pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglirfolder-pro, ну всё-таки попробуйте (name,value,id). Только не на 12к записей. Хотя если name достаточно редкое, то можно и так попробовать.

удалил все индексы

создал
id, id_criterions_name, id_criterions_values

вместо 0,047 сек
стало 0,015 сек

в rows остались теже 69000
к тому же Using where; Using temporary; Using filesort
вместо Using where; Using index;
...
Рейтинг: 0 / 0
Модель EAV (сущность - характеристики)
    #38529838
folder-pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cygapb-007,

еще бы синтаксис знать того что вы предложили...

ALTER TABLE `jos_md_catalog_message_criterions` ADD INDEX
`ggg` USING BTREE ( ON ( `id_criterions_name`, `id_criterions_values` ) include(message_id) )

в чем ошибка тут?
...
Рейтинг: 0 / 0
Модель EAV (сущность - характеристики)
    #38529847
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
folder-proCygapb-007,

еще бы синтаксис знать того что вы предложили...

ALTER TABLE `jos_md_catalog_message_criterions` ADD INDEX
`ggg` USING BTREE ( ON ( `id_criterions_name`, `id_criterions_values` ) include(message_id) )

в чем ошибка тут?Предложил не я :),
include() - это вообще из MS SQL, в MySQL такого нет.
Покрывающий индекс (для этого запроса) в MySQL - (`id_criterions_name`, `id_criterions_values`, `message_id`)
...
Рейтинг: 0 / 0
Модель EAV (сущность - характеристики)
    #38529886
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Маленькая ремарка:
если в запросе есть поля, отсутствующие в индексе, то для получения их значения применяется операция KeyLookup - выборка недостающих данных из таблицы по первичному ключу.

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

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

Пример из MS SQL:
...
Рейтинг: 0 / 0
Модель EAV (сущность - характеристики)
    #38529906
folder-pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cygapb-007,

перепробовал кучу комбинаций и перестановок...

варианты которые юзает мускуль
message_id, id_criterions_name, id_criterions_values

даже удалил PK на всякий случай (чтобы не грешили на него в операциях группировки и т.п.)
...
Рейтинг: 0 / 0
Модель EAV (сущность - характеристики)
    #38529921
folder-pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дамп таблицы

http://clip2net.com/s/6CcIHY
...
Рейтинг: 0 / 0
25 сообщений из 53, страница 2 из 3
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Модель EAV (сущность - характеристики)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]