powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Оптимизация запроса
9 сообщений из 9, страница 1 из 1
Оптимизация запроса
    #38974455
rydzyks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вроде все индексы поставлены но EXPLAIN все ровно дает плохой результат
как луче оптимизировать таблицу ? или сам запрос луче править ?


таблицы
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE TABLE IF NOT EXISTS `eav_attribute_option` (
  `option_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Option Id',
  `attribute_id` smallint(6) unsigned NOT NULL DEFAULT '0' COMMENT 'Attribute Id',
  `sort_order` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'Sort Order',
  PRIMARY KEY (`option_id`),
  KEY `IDX_EAV_ATTRIBUTE_OPTION_ATTRIBUTE_ID` (`attribute_id`,`sort_order`),
  KEY `sort_order` (`sort_order`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='Eav Attribute Option' AUTO_INCREMENT=31354 ;

ALTER TABLE `eav_attribute_option`
  ADD CONSTRAINT `FK_EAV_ATTRIBUTE_OPTION_ATTRIBUTE_ID_EAV_ATTRIBUTE_ATTRIBUTE_ID` FOREIGN KEY (`attribute_id`) REFERENCES `eav_attribute` (`attribute_id`) ON DELETE CASCADE ON UPDATE CASCADE;

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
CREATE TABLE IF NOT EXISTS `eav_attribute_option_value` (
  `value_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Value Id',
  `option_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'Option Id',
  `store_id` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'Store Id',
  `value` varchar(255) NOT NULL COMMENT 'Value',
  PRIMARY KEY (`value_id`),
  KEY `IDX_EAV_ATTRIBUTE_OPTION_VALUE_OPTION_ID` (`option_id`),
  KEY `IDX_EAV_ATTRIBUTE_OPTION_VALUE_STORE_ID` (`store_id`),
  KEY `option_id` (`option_id`,`store_id`),
  KEY `value` (`value`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='Eav Attribute Option Value' AUTO_INCREMENT=1121433 ;


ALTER TABLE `eav_attribute_option_value`
  ADD CONSTRAINT `FK_EAV_ATTRIBUTE_OPTION_VALUE_STORE_ID_CORE_STORE_STORE_ID` FOREIGN KEY (`store_id`) REFERENCES `core_store` (`store_id`) ON DELETE CASCADE ON UPDATE CASCADE,
  ADD CONSTRAINT `FK_EAV_ATTR_OPT_VAL_OPT_ID_EAV_ATTR_OPT_OPT_ID` FOREIGN KEY (`option_id`) REFERENCES `eav_attribute_option` (`option_id`) ON DELETE CASCADE ON UPDATE CASCADE;


сам запрос
Код: sql
1.
2.
3.
4.
5.
6.
SELECT `main_table`.*, `tdv`.`value` AS `default_value`, `tsv`.`value` AS `store_default_value`, IF(tsv.value_id > 0, tsv.value, tdv.value) AS `value` 
FROM `eav_attribute_option` AS `main_table`
 INNER JOIN `eav_attribute_option_value` AS `tdv` ON tdv.option_id = main_table.option_id
 LEFT JOIN `eav_attribute_option_value` AS `tsv` ON tsv.option_id = main_table.option_id AND tsv.store_id = '2'
WHERE (attribute_id = '70') AND (tdv.store_id = 0)
ORDER BY main_table.sort_order ASC, value ASC
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38974464
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуйте создать индекс eav_attribute_option_value(store_id, option_id[, value])
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38974664
rydzyks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

не помогло

авторid select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE main_table ref PRIMARY,IDX_EAV_ATTRIBUTE_OPTION_ATTRIBUTE_ID IDX_EAV_ATTRIBUTE_OPTION_ATTRIBUTE_ID 2 const 1098 Using index; Using temporary; Using filesort
1 SIMPLE tdv ref IDX_EAV_ATTRIBUTE_OPTION_VALUE_OPTION_ID,IDX_EAV_A... IDX_EAV_ATTRIBUTE_OPTION_VALUE_OPTION_ID 4 magento.main_table.option_id 1 Using where
1 SIMPLE tsv ref IDX_EAV_ATTRIBUTE_OPTION_VALUE_OPTION_ID,IDX_EAV_A... IDX_EAV_ATTRIBUTE_OPTION_VALUE_OPTION_ID 4 magento.main_table.option_id 1 Using where
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38974669
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rydzyks,

Перепишите запрос, укажите в нем явно алиасы таблиц, из которых берутся поля.
Например, я совсем не уверен, по какому именно из трех возможных value происходит сортировка.
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38974993
rydzyks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
это все пробовали

убирали IF(tsv.value_id > 0, tsv.value, tdv.value) не помагло
и также value ASC - помогло но не на все 100 буквально немного сократило
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38975000
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rydzyksэто все пробовалиЭто не для оптимизации, а для того, чтобы запрос можно было хотя бы прочитать однозначно.
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38975006
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сколько записей в каждой из таблиц? Сколько получается в результате запроса? Сколько записей в `eav_attribute_option` соответствует условию attribute_id = '70' (кстати, кавычки тут лишние) ?
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38975033
rydzyks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,

eav_attribute_option - 30.000
eav_attribute_option_value - 60.000


после селекта ( 1,099 всего, Запрос занял 3.2173 сек.)

attribute_id=70 ( 1,099 всего, Запрос занял 0.0004 сек.)
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38975306
lamer yuga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rydzyks , я бы попробовал покрывающие индексы - дабы исключить лишний поиск по ПК
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT mt.*, 
  `tdv`.`value` AS `default_value`, 
  `tsv`.`value` AS `store_default_value`, 
  IF(tsv.value_id > 0, tsv.value, tdv.value) AS `used_value` 
FROM `eav_attribute_option` AS mt
JOIN `eav_attribute_option_value` AS `tdv` 
  ON tdv.option_id = mt.option_id AND tdv.store_id = 0
LEFT JOIN `eav_attribute_option_value` AS `tsv` 
  ON tsv.option_id = mt.option_id AND tsv.store_id = 2
WHERE mt.attribute_id = '70'
ORDER BY mt.sort_order ASC, used_value ASC


Для eav_attribute_option покрывающий индекс уже есть (attribute_id,sort_order)+РК(option_id)

Для eav_attribute_option_value покрывающим будет (option_id,store_id,value), ну или (store_id,option_id,value), как уже посоветовали, но он чуть хуже из-за РК(option_id)

Можно попробовать еще уточнить ORDER BY mt.attribute_id, mt.sort_order, used_value , хотя и без этого должен взяться правильный индекс

А вот этот ваш план -жуть
id select_type table type possible_keys key key_len ref rows Extra1 SIMPLE main_table ref PRIMARY;IDX_EAV_ATTRIBUTE_OPTION_ATTRIBUTE_ID IDX_EAV_ATTRIBUTE_OPTION_ATTRIBUTE_ID 2 const 1098 Using index; Using temporary; Using filesort1 SIMPLE tdv ref IDX_EAV_ATTRIBUTE_OPTION_VALUE_OPTION_ID;IDX_EAV_A... IDX_EAV_ATTRIBUTE_OPTION_VALUE_OPTION_ID 4 magento.main_table.option_id 1 Using where1 SIMPLE tsv ref IDX_EAV_ATTRIBUTE_OPTION_VALUE_OPTION_ID;IDX_EAV_A... IDX_EAV_ATTRIBUTE_OPTION_VALUE_OPTION_ID 4 magento.main_table.option_id 1 Using where
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Оптимизация запроса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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