Oracle mechanics

24.11.2009

Проблема с множественным соединением по индексу в Mysql 5.0.51a

Filed under: MySQL,optimizer — Игорь Усольцев @ 00:02
Tags: ,

В Mysql 5.0.51a наблюдается забавная проблема, связанная с многократным (конкурентным?) использованием одного и того же индекса при множественном соединении таблиц (внутренняя таблица iblock_property содержит всего 45 строк)

SELECT COUNT(DISTINCT BE.ID) as C FROM iblock B
...
INNER JOIN iblock_property FP0 ON FP0.IBLOCK_ID = B.ID AND FP0.CODE='NEW_ATTR_METALL'
INNER JOIN iblock_property FP1 ON FP1.IBLOCK_ID = B.ID AND FP1.CODE='NEW_ATTR_VSTAVKA'
INNER JOIN iblock_property FP2 ON FP2.IBLOCK_ID = B.ID AND FP2.CODE='NEW_NO_DOUBLE'
...

Запрос выполняется более 70 секунд

Explain plan for slow query
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
...
1	PRIMARY	FP0	ref	PRIMARY,ix_iblock_property_1,ix_iblock_property_2	 ix_iblock_property_2	53	const	1	Using where
1	PRIMARY	FP1	ref	PRIMARY,ix_iblock_property_1,ix_iblock_property_2	 ix_iblock_property_2	53	const	1	Using where
1	PRIMARY	FP2	ref	PRIMARY,ix_iblock_property_1,ix_iblock_property_2	 ix_iblock_property_2	53	const	1	Using where
...

при (вроде бы) вполне оправданном использовании индекса ix_iblock_property_2

show indexes from iblock_property;
Table	Non_unique	Key_name	Seq_in_index	Column_name	Collation	Cardinality	Sub_part	Packed	Null	Index_type
iblock_property	0	PRIMARY	1	ID	A	45	 	 	 	BTREE
iblock_property	1	ix_iblock_property_1	1	IBLOCK_ID	A	7	 	 	 	BTREE
iblock_property	1	ix_iblock_property_2	1	CODE	A	22	 	 	YES	BTREE

Если же исключить использование индекса из запроса просто удалив индекс или игнорируя использование (подсказка IGNORE INDEX)

...
INNER JOIN iblock_property FP0 IGNORE INDEX (ix_iblock_property_2) ON FP0.IBLOCK_ID =
B.ID AND FP0.CODE='NEW_ATTR_METALL'
INNER JOIN iblock_property FP1 IGNORE INDEX (ix_iblock_property_2) ON FP1.IBLOCK_ID =
B.ID AND FP1.CODE='NEW_ATTR_VSTAVKA'
INNER JOIN iblock_property FP2 IGNORE INDEX (ix_iblock_property_2) ON FP2.IBLOCK_ID =
B.ID AND FP2.CODE='NEW_NO_DOUBLE'
...

тот же запрос выполняется менее  1 секунды с планом

id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
...
1	PRIMARY	FP0	ref	PRIMARY,ix_iblock_property_1	ix_iblock_property_1	4	const	14	Using where
...
1	PRIMARY	FP1	eq_ref	PRIMARY,ix_iblock_property_1	PRIMARY	4	FPV1.IBLOCK_PROPERTY_ID	1	Using where
...
1	PRIMARY	FP2	eq_ref	PRIMARY,ix_iblock_property_1	PRIMARY	4	FPV2.IBLOCK_PROPERTY_ID	1	Using where
...

Запрос остаётся таким же медленным (70 секунд) при замене индекса ix_iblock_property_2 на более подходящий для объединения таблиц:

drop index ix_iblock_property_2 on iblock_property;
create index ix_iblock_property_2 on iblock_property(IBLOCK_ID, code);
analyze table iblock_property;
show indexes from iblock_property;
Table	Non_unique	Key_name	Seq_in_index	Column_name	Collation	Cardinality	Sub_part	Packed	Null	Index_type	Comment
iblock_property	0	PRIMARY	1	ID	A	45	 	 	 	BTREE
iblock_property	1	ix_iblock_property_1	1	IBLOCK_ID	A	7	 	 	 	BTREE
iblock_property	1	ix_iblock_property_12	1	IBLOCK_ID	A	7	 	 	 	BTREE
iblock_property	1	ix_iblock_property_12	2	CODE	A	45	 	 	YES	BTREE

Баг зафиксирован в службе подержки MySQL, получена рекомендация обновить MySQL до версии 5.0.86 / 5.0.88 — рекомендации переданы клиенту

Проблема может быть актуально поскольку в некоторые стабильные дистрибутивы Linux — Ubuntu 8.0.4 LTS, например, включена именно версия Mysql 5.0.51a

Добавить комментарий »

Комментариев нет.

RSS feed for comments on this post. TrackBack URI

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

Блог на WordPress.com.

%d такие блоггеры, как: