|
|
|
Модель EAV (сущность - характеристики)
|
|||
|---|---|---|---|
|
#18+
или даже так: ( http://sqlfiddle.com/#!2/a830f/1 ) Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2014, 14:58:25 |
|
||
|
Модель EAV (сущность - характеристики)
|
|||
|---|---|---|---|
|
#18+
сгенерил таблицу на 11000 характеристик для 2000 товаров, ваш запрос не желает индексы использовать... А ты видишь в этом запросе слово WHERE ? Запросы используют индексы, когда в WHERE что-то написано. Я ж ему говорил, что так лучше. А он -- "удобно, удобно " подскажите как их правильно создать тогда, индексы Надо не индексы правильно создавать, а запросы правильно писать. Индексы надо создавать на значение и тип свойства . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2014, 16:21:14 |
|
||
|
Модель EAV (сущность - характеристики)
|
|||
|---|---|---|---|
|
#18+
Уточнение: защита от дублей (предполагается, что фильтруемые значения выбираются однократно) Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2014, 17:40:32 |
|
||
|
Модель EAV (сущность - характеристики)
|
|||
|---|---|---|---|
|
#18+
Cygapb-007, да индексы на этом вложенном запросе заработали. но зависание на 62 секунды так и осталось) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2014, 17:59:49 |
|
||
|
Модель EAV (сущность - характеристики)
|
|||
|---|---|---|---|
|
#18+
folder-pro , вам уже отвечали ранее 15425584 , что индексы не работают после группировки. попробуйте добавить фильтр в запрос (перед группировкой) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2014, 22:02:23 |
|
||
|
Модель EAV (сущность - характеристики)
|
|||
|---|---|---|---|
|
#18+
можете так же сравнить обведенное рамкой с примером из 15424973 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2014, 22:06:03 |
|
||
|
Модель EAV (сущность - характеристики)
|
|||
|---|---|---|---|
|
#18+
В общем наконец то заработало. Не идеально конечно, но уже хоть что то. вопрос остается открытым по последнему эксплайну, кто что скажет, можно ли как то улучшить ситуацию с работой по индексам? например если взять основную таблицу в которой например будет 250 000 записей, и по 10 характеристик на один товар, получим перебор таблицы в которой 2 500 000 записей и джойн ее хоть и по PK к таблице в которой 250 000 записей. при этом еще и Using temporary; Using filesort ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2014, 22:40:37 |
|
||
|
Модель EAV (сущность - характеристики)
|
|||
|---|---|---|---|
|
#18+
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 гуру, посему мне трудно дается это, прошу пояснить если не сложно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2014, 22:45:47 |
|
||
|
Модель EAV (сущность - характеристики)
|
|||
|---|---|---|---|
|
#18+
еще раз: группировка обрабатывает все отобранные записи таблицы (сортирует, затем вычисляет аггрегатные функции), и только потом проверяет вычисленные значения. фильтр WHERE использует индекс для эффективного отбора значений, которые потом нужно как-то обработать. Хотя если не видно разницы - то и мне и тем более все равно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2014, 22:55:19 |
|
||
|
Модель EAV (сущность - характеристики)
|
|||
|---|---|---|---|
|
#18+
Cygapb-007еще раз: группировка обрабатывает все отобранные записи таблицы (сортирует, затем вычисляет аггрегатные функции), и только потом проверяет вычисленные значения. фильтр WHERE использует индекс для эффективного отбора значений, которые потом нужно как-то обработать. Хотя если не видно разницы - то и мне и тем более все равно Другими словами, разница будет видна в скорости работы запроса когда там будет 2 500 000 записей? а не 12 000. я понимаю что есть разница с where и без него, только вот не понимаю меняется ли последовательность обработки этого запроса или нет, и как это в эксплайн увидеть... Не вижу я ее :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2014, 23:20:33 |
|
||
|
Модель EAV (сущность - характеристики)
|
|||
|---|---|---|---|
|
#18+
folder-proНе вижу я ее :)explain.rows должно уменьшаться при наличии where Впрочем, у ва всего 12к записей, может, оптимизатор посчитал выгодней прочитать их все, не дёргая ещё и индекс. Сделайте 120к записей и повторите эксперимент - rows должно отличаться. Akina Код: sql 1. Если разных атрибутов будет много, то может быть, выгодней будет idx1 on eav(attrib, val, entity). Можно будет читать даже не весь индекс, а только часть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2014, 06:21:10 |
|
||
|
Модель EAV (сущность - характеристики)
|
|||
|---|---|---|---|
|
#18+
tanglirЕсли разных атрибутов будет много, то может быть, выгодней будет idx1 on eav(attrib, val, entity). Можно будет читать даже не весь индекс, а только часть.Я демонстрирорвал только факт, что индекс МОЖЕТ ИСПОЛЬЗОВАТЬСЯ. Оптимизация его использования - это значительно более следующий этап. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2014, 08:50:30 |
|
||
|
Модель EAV (сущность - характеристики)
|
|||
|---|---|---|---|
|
#18+
tanglirfolder-proНе вижу я ее :)explain.rows должно уменьшаться при наличии where Впрочем, у ва всего 12к записей, может, оптимизатор посчитал выгодней прочитать их все, не дёргая ещё и индекс. Сделайте 120к записей и повторите эксперимент - rows должно отличаться. Akina Код: sql 1. Если разных атрибутов будет много, то может быть, выгодней будет idx1 on eav(attrib, val, entity). Можно будет читать даже не весь индекс, а только часть. для того чтобы оптимизатор сам выбрал какой индекс использовать (на время экспериментов), ранее были сделаны такие варианты. он использует тот что по трем полям. Огромное всем спасибо за помощь! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2014, 09:58:54 |
|
||
|
Модель EAV (сущность - характеристики)
|
|||
|---|---|---|---|
|
#18+
folder-pro, ну всё-таки попробуйте (name,value,id). Только не на 12к записей. Хотя если name достаточно редкое, то можно и так попробовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2014, 10:06:47 |
|
||
|
Модель EAV (сущность - характеристики)
|
|||
|---|---|---|---|
|
#18+
tanglirfolder-pro, ну всё-таки попробуйте (name,value,id). Только не на 12к записей. Хотя если name достаточно редкое, то можно и так попробовать.группировка предполагает предварительную сортировку по id, поэтому вряд ли id в конце индекса будет эффективнее... хотя решать оптимизатору ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2014, 10:10:35 |
|
||
|
Модель EAV (сущность - характеристики)
|
|||
|---|---|---|---|
|
#18+
Cygapb-007, этот индекс - для случая, когда where отбирает относительно мало дынных. Проще ведь прочитать 100 записей из индекса, чем весь индекс :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2014, 10:23:50 |
|
||
|
Модель EAV (сущность - характеристики)
|
|||
|---|---|---|---|
|
#18+
tanglirCygapb-007, этот индекс - для случая, когда where отбирает относительно мало дынных. Проще ведь прочитать 100 записей из индекса, чем весь индекс :)А, в смысле - покрывающий индекс (on (name, val) include (mess_id))... Согласен, этот индекс может оказаться эффективнее. Хотя фильтрация индекса все равно может оказаться эффективнее отбора фрагментов индекса и сортировки результата... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2014, 12:43:35 |
|
||
|
Модель EAV (сущность - характеристики)
|
|||
|---|---|---|---|
|
#18+
Cygapb-007, может. Тут уже ТСу самому смотреть надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2014, 12:45:24 |
|
||
|
Модель EAV (сущность - характеристики)
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2014, 15:47:39 |
|
||
|
Модель EAV (сущность - характеристики)
|
|||
|---|---|---|---|
|
#18+
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; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2014, 15:54:38 |
|
||
|
Модель EAV (сущность - характеристики)
|
|||
|---|---|---|---|
|
#18+
Cygapb-007, еще бы синтаксис знать того что вы предложили... ALTER TABLE `jos_md_catalog_message_criterions` ADD INDEX `ggg` USING BTREE ( ON ( `id_criterions_name`, `id_criterions_values` ) include(message_id) ) в чем ошибка тут? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2014, 16:15:17 |
|
||
|
Модель EAV (сущность - характеристики)
|
|||
|---|---|---|---|
|
#18+
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`) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2014, 16:19:26 |
|
||
|
Модель EAV (сущность - характеристики)
|
|||
|---|---|---|---|
|
#18+
Маленькая ремарка: если в запросе есть поля, отсутствующие в индексе, то для получения их значения применяется операция KeyLookup - выборка недостающих данных из таблицы по первичному ключу. если индекс покрывающий (т.е. все поля, задействованные в запросе, содержатся в индексе), то и чтения из таблицы не требуется. первичный ключ содержится в любом индексе и дублировать его смысла нет Пример из MS SQL: ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2014, 16:36:10 |
|
||
|
Модель EAV (сущность - характеристики)
|
|||
|---|---|---|---|
|
#18+
Cygapb-007, перепробовал кучу комбинаций и перестановок... варианты которые юзает мускуль message_id, id_criterions_name, id_criterions_values даже удалил PK на всякий случай (чтобы не грешили на него в операциях группировки и т.п.) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2014, 16:46:22 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38529921&tid=1835382]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
28ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
68ms |
get tp. blocked users: |
1ms |
| others: | 235ms |
| total: | 370ms |

| 0 / 0 |
