Задавайте вопросы, мы ответим
Вы не зашли.
Всем привет.
Работаю с стандартной структурой EAV.
MariaDB 5.5
Неактивен
Приветствую, красивый номер сообщения - 333
сделать суррогатный цифровой `_id`, который использовать в группировке вместо `entity_id`
и попробовать какой из вариантов индексов лучше подойдет
(`_id`,`attribute`,`value`)
(`attribute`,`value`,`_id`)
запрос лучше усложнить, во from части использовать `_id`,`attribute`,`value`, а потом после группировки дополнительным join подтянуть `entity_id`.
Неактивен
vasya написал:
Приветствую, красивый номер сообщения - 333
сделать суррогатный цифровой `_id`, который использовать в группировке вместо `entity_id`
и попробовать какой из вариантов индексов лучше подойдет
(`_id`,`attribute`,`value`)
(`attribute`,`value`,`_id`)
запрос лучше усложнить, во from части использовать `_id`,`attribute`,`value`, а потом после группировки дополнительным join подтянуть `entity_id`.
Извини не понял твою идею.
Можеш хотя бы примерно показать псевдо код.
Неактивен
Неактивен
Неактивен
это он предлагал, когда группировка по текстовому не индексированному полю
в моём варианте будет пошустрее
ещё можно поставить на первое место более селективное условие, т.е.
(a.attribute='size' and a.value='big')
or
(a.attribute='color' and a.value='black')
хотя, емнип, гарантии это не дает.
Но скорее всего работать будет быстро.
Неактивен
Добрый день, уважаемые форумчане. Уже несколько дней мучаюсь над одним запросом. Есть БД интернет магазина, структура такова:
Таблица товаров:
id, model, status
10000, test, 1
10001, test1, 0
10002, test2, 1
Таблица связей каталог - товар 32255 записей, будет как минимум в два раза больше
id, k_id, p_id
1, 37, 10000
2, 37, 10001
3, 38, 10002
Таблица связей товар - характеристики(features) 534730 записей(это примерно треть, будет больше)
id, f_id, p_id, value
1, 100, 10000, Белый
2, 100, 10001, Желтый
3, 100, 10002, Белый
Таблица характеристик
id, title, type
100, Цвет, T
101, Мощность, D
Есть еще конечно таблицы самих каталогов где хранятся наименования и др., но это сейчас не нужно. Так вот, пытаюсь сделать фильтр на сайте, и нужно сделать выборку возможных вариантов характеристик. То есть, есть ID характеристик, например 100, 101, 103, и т.д. и по этим ID нужно вытащить возможные варианты этих характеристик у тех товаров которые находятся в определенном каталоге. На данный момент есть написанный запрос, он выводит характеристики:
Неактивен
покажите план запроса explain select ..
и структуру таблиц в виде show create table `имя таблицы`
Неактивен
Таблица товаров (sdvd_products)
CREATE TABLE `sdvd_products` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`type` int(11) unsigned NOT NULL,
`url` varchar(255) NOT NULL,
`img` varchar(255) NOT NULL,
`thumb` varchar(255) NOT NULL,
`model` varchar(255) NOT NULL,
`product_group` varchar(255) NOT NULL,
`price` int(10) DEFAULT NULL,
`valute` varchar(4) DEFAULT NULL,
`inprice` int(11) DEFAULT NULL,
`invalute` varchar(4) DEFAULT NULL,
`delivery` int(10) unsigned DEFAULT NULL,
`service` int(10) unsigned DEFAULT NULL,
`pricenote` varchar(255) DEFAULT NULL,
`discount` varchar(3) NOT NULL,
`new` int(1) unsigned DEFAULT NULL,
`hit` int(1) unsigned DEFAULT NULL,
`date` int(10) unsigned NOT NULL,
`available` int(1) unsigned NOT NULL,
`status` int(1) unsigned NOT NULL,
`brand` int(10) unsigned DEFAULT NULL,
`mindesc` varchar(1500) DEFAULT NULL,
`creator` int(10) unsigned NOT NULL,
`suplier` varchar(50) DEFAULT NULL,
`suplier_id` varchar(255) DEFAULT NULL,
`classification` int(1) unsigned NOT NULL,
`unit` varchar(255) DEFAULT NULL,
`parce` int(1) unsigned NOT NULL,
`link_ekatalog` varchar(1000) DEFAULT NULL,
`link_mail` varchar(1000) DEFAULT NULL,
`link_market` varchar(1000) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `url` (`url`)
) ENGINE=MyISAM AUTO_INCREMENT=12716 DEFAULT CHARSET=utf8
Таблица связей товар - категория (sdvd_katalog_linking)
CREATE TABLE `sdvd_katalog_linking` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`k_id` int(11) unsigned NOT NULL,
`p_id` int(11) unsigned NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=13378 DEFAULT CHARSET=utf8
Таблица связей товар - характеристика (sdvd_features_linking)
CREATE TABLE `sdvd_features_linking` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`p_id` int(11) unsigned NOT NULL,
`f_id` int(11) unsigned NOT NULL,
`value` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=301307 DEFAULT CHARSET=utf8
Таблица характеристик (sdvd_features)
CREATE TABLE `sdvd_features` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(255) NOT NULL,
`sort` int(10) unsigned NOT NULL,
`type` varchar(1) NOT NULL,
`show_at_table` int(1) unsigned NOT NULL,
`show_at_vitrine` int(1) unsigned NOT NULL,
`show_at_top` int(1) unsigned NOT NULL,
`prefix` varchar(255) NOT NULL,
`postfix` varchar(255) NOT NULL,
`xml_tag_name` varchar(255) NOT NULL,
`parent_group` int(10) unsigned NOT NULL,
`features_group` varchar(255) NOT NULL,
`features_group_prefix` varchar(255) NOT NULL,
`features_group_postfix` varchar(255) NOT NULL,
`features_group_sort` int(10) unsigned NOT NULL,
`status` int(1) unsigned NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=374 DEFAULT CHARSET=utf8
Далее план запроса(На картинке сверху)
Неактивен
Планы запросов(кажется картинка не загрузилась)
1-ой запрос
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE sdvd_katalog_linking ALL NULL NULL NULL NULL 34983 Using where; Using temporary;
Using filesort
1 SIMPLE sdvd_features_linking ALL NULL NULL NULL NULL 584488 Using where;
Using join buffer (flat, BNL join)
1 SIMPLE sdvd_features eq_ref PRIMARY PRIMARY 4 host1400239_nsdb.sdvd_features_linking.f_id 1
2-ой запрос
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE sdvd_features_linking ALL NULL NULL NULL NULL 584488 Using where; Using filesort
1 SIMPLE sdvd_features eq_ref PRIMARY PRIMARY 4 host1400239_nsdb.sdvd_features_linking.f_id 1
Неактивен
так у вас совсем нет индексов, неудивительно, что так долго работает
зачем id в таблицах связей?
нужен индекс на (f_id,p_id) в sdvd_features_linking
аналогично для sdvd_katalog_linking
посмотрите FAQ №5
для примера, должно быть что-то вроде:
CREATE TABLE `sdvd_katalog_linking` (
`k_id` int(11) unsigned NOT NULL,
`p_id` int(11) unsigned NOT NULL,
PRIMARY KEY (`k_id`,`p_id`),
index (`p_id`)
)
Неактивен
Где то вычитал, что колонка `id` в каждой таблице - это грамотно. У самого были сомнения, ведь это получается лишняя информация... Сейчас попробую переделать таблицы...
Почитал информацию по ссылке которую вы мне скинули, большое спасибо. Возник один вопрос, дело в том, что в таблице связей товар - каталог id товара может повторяться, так как один товар может быть одновременно в разных категориях, а PRIMARY KEY должен быть уникальным... Или же в примере, что вы написали "PRIMARY KEY (`k_id`,`p_id`)" уникальность будет высчитываться сразу по двум полям `k_id` и `p_id`?
Неактивен
да, уникальность для комбинации двух полей
Неактивен
Проставил ключи, все стало работать очень быстро. Огромное Вам спасибо
Неактивен