Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Индекс во вложенных запросах / 19 сообщений из 19, страница 1 из 1
29.10.2015, 23:53:16
    #39090639
pitnn
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индекс во вложенных запросах
Забыл добавить, в MS SQL 2008 этот же запрос выполняется на этих же данных за секунды
...
Рейтинг: 0 / 0
29.10.2015, 23:55:14
    #39090640
pitnn
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индекс во вложенных запросах
Вот ведь, так старался, что запутался)

Доброго времени суток, форумчане)
Помогите с запросом, пожалуйста. Есть таблица Cross содержащая более 50 миллионов записей
Структура у нее такая:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
CREATE TABLE `do_search_art_syn` (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `Art` varchar(255) NOT NULL,
  `MfcName` varchar(255) NOT NULL,
  `ArtCanonical` varchar(255) NOT NULL,
  `MfcNameCanonical` varchar(255) NOT NULL,
  `Desc` varchar(255) NOT NULL DEFAULT '',
  `Created` datetime NOT NULL DEFAULT '2000-01-01 00:00:00',
  `Modified` datetime NOT NULL DEFAULT '2000-01-01 00:00:00',
  PRIMARY KEY (`Id`),
  UNIQUE KEY `UK_do_search_art_syn_Id` (`Id`),
  KEY `IX_do_search_art_syn` (`Art`,`MfcName`),
  KEY `IX_do_search_art_syn_Art` (`Art`),
  KEY `IX_do_search_art_syn_ArtCanonical` (`ArtCanonical`),
  KEY `IX_do_search_art_syn_Created` (`Created`),
  KEY `IX_do_search_art_syn_Desc` (`Desc`),
  KEY `IX_do_search_art_syn_MfcName` (`MfcName`),
  KEY `IX_do_search_art_syn_MfcNameCanonical` (`MfcNameCanonical`),
  KEY `IX_do_search_art_syn_Modified` (`Modified`),
  KEY `IX_do_search_art_syn2` (`ArtCanonical`,`MfcNameCanonical`)
) ENGINE=MyISAM AUTO_INCREMENT=53959214 DEFAULT CHARSET=cp1251 AVG_ROW_LENGTH=16384



И есть вот такой запрос:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
USE detal_tec2;

SET @art = 'OC47', @br = 'KNECHT';

SELECT DISTINCT UAll.Art, UAll.Br FROM(
	
	SELECT U1.Art, U1.Br FROM (
	
		SELECT 
			Level2_11.ArtCanonical AS Art,
			Level2_11.MfcNameCanonical AS Br
		FROM
			`do_search_art_syn` AS Level2_11
		INNER JOIN (
			 SELECT
				Level1_11.ArtCanonical,
				Level1_11.MfcNameCanonical
			FROM
				`do_search_art_syn` AS Level1_11
			WHERE
				Level1_11.Art = @art
				AND Level1_11.MfcName = @br) AS CrossL_11
		ON Level2_11.Art = CrossL_11.ArtCanonical AND
			Level2_11.MfcName = CrossL_11.MfcNameCanonical
	
		UNION ALL
		
		SELECT 
			Level2_12.Art AS Art,
			Level2_12.MfcName AS Br
		FROM
			`do_search_art_syn` AS Level2_12
		INNER JOIN (
			SELECT
				Level1_12.ArtCanonical,
				Level1_12.MfcNameCanonical
			FROM
				`do_search_art_syn` AS Level1_12
			WHERE
				Level1_12.Art = @art
				AND Level1_12.MfcName = @br) AS CrossR_11
		ON Level2_12.ArtCanonical = CrossR_11.ArtCanonical AND
			Level2_12.MfcNameCanonical = CrossR_11.MfcNameCanonical) AS U1
	
	UNION ALL
	
	SELECT U2.Art, U2.Br FROM (
	
		SELECT 
			Level2_21.ArtCanonical AS Art,
			Level2_21.MfcNameCanonical AS Br
		FROM
			`do_search_art_syn` AS Level2_21
		INNER JOIN (
			EXPLAIN SELECT
				Level1_21.Art,
				Level1_21.MfcName
			FROM
				`do_search_art_syn` AS Level1_21
			WHERE
				Level1_21.ArtCanonical = @art
				AND Level1_21.MfcNameCanonical = @br) AS CrossL_21
		ON Level2_21.Art = CrossL_21.Art AND
			Level2_21.MfcName = CrossL_21.MfcName
	
		UNION ALL
		
		SELECT 
			Level2_22.Art AS Art,
			Level2_22.MfcName AS Br
		FROM
			`do_search_art_syn` AS Level2_22
		INNER JOIN (
			SELECT
				Level1_22.Art,
				Level1_22.MfcName
			FROM
				`do_search_art_syn` AS Level1_22
			WHERE
				Level1_22.ArtCanonical = @art
				AND Level1_22.MfcNameCanonical = @br) AS CrossR_21
		ON Level2_22.ArtCanonical = CrossR_21.Art AND
			Level2_22.MfcNameCanonical = CrossR_21.MfcName) AS U2) AS UAll



И этот вот самый запрос мало того что выполняется порядка минуты, так еще и процессор на серваке сжирает на время выполнения.

План выполнения запроса показал, что вложенные запросы Level1_11, Level1_12, Level1_21, Level1_22 выполняются без использования индексов. Т.е. перебираются все 50 миллионов записей.

Собственно вот результат:

idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra1PRIMARY<derived2>ALLNULLNULLNULLNULL19385Using temporary2DERIVED<derived3>ALLNULLNULLNULLNULL106913DERIVED<derived4>ALLNULLNULLNULLNULL423DERIVEDLevel2_11refIX_do_search_art_syn_Art,IX_do_search_art_syn_Mfc,IX_do_search_art_syn_ArtMfcIX_do_search_art_syn_ArtMfc104CrossL_11.ArtCanonical,CrossL_11.MfcNameCanonical54DERIVEDLevel1_11ALLNULLNULLNULLNULL53942279Using where5UNCACHEABLE UNION<derived6>ALLNULLNULLNULLNULL425UNCACHEABLE UNIONLevel2_12refIX_do_search_art_syn_ArtCan,IX_do_search_art_syn_MfcCab,IX_do_search_art_syn_ArtMfcCanIX_do_search_art_syn_ArtMfcCan104CrossR_11.ArtCanonical,CrossR_11.MfcNameCanonical106DERIVEDLevel1_12ALLNULLNULLNULLNULL53942279Using whereNULLUNION RESULT<union3,5>ALLNULLNULLNULLNULLNULL7UNCACHEABLE UNION<derived8>ALLNULLNULLNULLNULL86948DERIVED<derived9>ALLNULLNULLNULLNULL1538DERIVEDLevel2_21refIX_do_search_art_syn_Art,IX_do_search_art_syn_Mfc,IX_do_search_art_syn_ArtMfcIX_do_search_art_syn_ArtMfc104CrossL_21.Art,CrossL_21.MfcName59DERIVEDLevel1_21ALLNULLNULLNULLNULL53942279Using where10UNCACHEABLE UNION<derived11>ALLNULLNULLNULLNULL15310UNCACHEABLE UNIONLevel2_22refIX_do_search_art_syn_ArtCan,IX_do_search_art_syn_MfcCab,IX_do_search_art_syn_ArtMfcCanIX_do_search_art_syn_ArtMfcCan104CrossR_21.Art,CrossR_21.MfcName1011DERIVEDLevel1_22ALLNULLNULLNULLNULL53942279Using whereNULLUNION RESULT<union8,10>ALLNULLNULLNULLNULLNULLNULLUNION RESULT<union2,7>ALLNULLNULLNULLNULLNULL



А теперь вопрос. Почему не используются индексы в вложенных запросах и как можно исправить ситуацию?
...
Рейтинг: 0 / 0
30.10.2015, 00:23:19
    #39090646
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индекс во вложенных запросах
pitnn,

попробуйте повторить без использования @art, @br.
просто подставьте текстовые значения.
...
Рейтинг: 0 / 0
30.10.2015, 00:27:58
    #39090648
pitnn
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индекс во вложенных запросах
javajdbc,

Это ничего не даст. Переменные позже появились, изначально были текстовые значения, но неудобно было их менять каждый раз, поэтому вывел в переменные.
...
Рейтинг: 0 / 0
30.10.2015, 00:40:13
    #39090654
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индекс во вложенных запросах
pitnn
Код: sql
1.
2.
INNER JOIN (
			EXPLAIN SELECT

Это как?
...
Рейтинг: 0 / 0
30.10.2015, 00:52:17
    #39090660
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индекс во вложенных запросах
pitnn,

...ну к чему ломатся как красна девица...
...проверить to 3 секунды...


...вообше что-то действительно не то...
оптимизатор не видит даже POSSIBLE KEYS...
...
Рейтинг: 0 / 0
30.10.2015, 06:11:15
    #39090683
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индекс во вложенных запросах
javajdbc..вообше что-то действительно не то...
оптимизатор не видит даже POSSIBLE KEYS...+1
интересно, он не видит их только внутри большого запроса? pitnn, если проexplainить отдельно какой-нибудь из подзапросов, ключи видно?
...кстати, индекс (art,mfcname,artcanonical,mfcnamecanonical) мог бы использоваться как покрывающий, если ничего не путаю.
...
Рейтинг: 0 / 0
30.10.2015, 08:55:24
    #39090716
pitnn
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индекс во вложенных запросах
miksoft,

Это я смотрел как работает отдельно вложенный запрос, забыл удалить просто
...
Рейтинг: 0 / 0
30.10.2015, 09:46:05
    #39090780
pitnn
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индекс во вложенных запросах
javajdbcpitnn,

...ну к чему ломатся как красна девица...
...проверить to 3 секунды...

...вообше что-то действительно не то...
оптимизатор не видит даже POSSIBLE KEYS...

Ахалай-махалай, действительно, подставил вместо переменных значения и ситуация резко улучшилась.

Результат Explain-а:
idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra1PRIMARY<derived2>ALLNULLNULLNULLNULL19385Using temporary2DERIVED<derived3>ALLNULLNULLNULLNULL106913DERIVED<derived4>ALLNULLNULLNULLNULL423DERIVEDLevel2_11refIX_do_search_art_syn_Art,IX_do_search_art_syn_Mfc,IX_do_search_art_syn_ArtMfcIX_do_search_art_syn_ArtMfc104CrossL_11.ArtCanonical,CrossL_11.MfcNameCanonical54DERIVEDLevel1_11refIX_do_search_art_syn_Art,IX_do_search_art_syn_Mfc,IX_do_search_art_syn_ArtMfcIX_do_search_art_syn_ArtMfc10432Using where5UNION<derived6>ALLNULLNULLNULLNULL425UNIONLevel2_12refIX_do_search_art_syn_ArtCan,IX_do_search_art_syn_MfcCab,IX_do_search_art_syn_ArtMfcCanIX_do_search_art_syn_ArtMfcCan104CrossR_11.ArtCanonical,CrossR_11.MfcNameCanonical106DERIVEDLevel1_12refIX_do_search_art_syn_Art,IX_do_search_art_syn_Mfc,IX_do_search_art_syn_ArtMfcIX_do_search_art_syn_ArtMfc10432Using whereNULLUNION RESULT<union3,5>ALLNULLNULLNULLNULLNULL7UNION<derived8>ALLNULLNULLNULLNULL86948DERIVED<derived9>ALLNULLNULLNULLNULL1538DERIVEDLevel2_21refIX_do_search_art_syn_Art,IX_do_search_art_syn_Mfc,IX_do_search_art_syn_ArtMfcIX_do_search_art_syn_ArtMfc104CrossL_21.Art,CrossL_21.MfcName59DERIVEDLevel1_21refIX_do_search_art_syn_ArtCan,IX_do_search_art_syn_MfcCab,IX_do_search_art_syn_ArtMfcCanIX_do_search_art_syn_ArtMfcCan10498Using where10UNION<derived11>ALLNULLNULLNULLNULL15310UNIONLevel2_22refIX_do_search_art_syn_ArtCan,IX_do_search_art_syn_MfcCab,IX_do_search_art_syn_ArtMfcCanIX_do_search_art_syn_ArtMfcCan104CrossR_21.Art,CrossR_21.MfcName1011DERIVEDLevel1_22refIX_do_search_art_syn_ArtCan,IX_do_search_art_syn_MfcCab,IX_do_search_art_syn_ArtMfcCanIX_do_search_art_syn_ArtMfcCan10498Using whereNULLUNION RESULT<union8,10>ALLNULLNULLNULLNULLNULLNULLUNION RESULT<union2,7>ALLNULLNULLNULLNULLNULL

У меня такие предположения на этот счет: когда добавлялся основной объем данных в таблицу индексы не обновились (интересно, могло такое быть?). Вчера удалил все индексы и создал их заново и стало лучше. По большому счету тему можно закрывать, но буду рад каким-либо рекомендациям относительно оптимизации данного запроса) Всем спасибо за участие.
...
Рейтинг: 0 / 0
30.10.2015, 09:55:42
    #39090794
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индекс во вложенных запросах
pitnnВчера удалил все индексы и создал их заново и стало лучше.Если уверены, что не показалось, то в будущем имеет смысл периодически выполнять команду OPTIMIZE TABLE для всех таблиц.
...
Рейтинг: 0 / 0
30.10.2015, 10:37:27
    #39090832
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индекс во вложенных запросах
pitnnУ меня такие предположения на этот счет: когда добавлялся основной объем данных в таблицу индексы не обновились (интересно, могло такое быть?).Статистика могла криво собраться, иногда такое бывает. К сожалению, не лечится в принципе ничем кроме её пересбора (analyze table, и не факт, что в очередной раз соберётся правильно). Ну или явного указания индексов в хинтах.
...
Рейтинг: 0 / 0
30.10.2015, 10:52:58
    #39090840
pitnn
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индекс во вложенных запросах
А в целом как вы оцениваете запрос, насколько корректно он составлен? Я хотел было вынести вложенные запросы во временные таблицы, чтобы не четыре раза вызывался, а два. Но что-то у меня не сложилось с временными таблицами. Не на столько я знаток мускульных запросов, я больше по 1С)
...
Рейтинг: 0 / 0
30.10.2015, 11:40:07
    #39090901
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индекс во вложенных запросах
pitnnЯ хотел было вынести вложенные запросы во временные таблицы, чтобы не четыре раза вызывался, а дваНу, записей там немного выбирается, причём индекс используется, да и друг с другом они не джойнятся, так что смысла имхо в этом нет.
pitnnА в целом как вы оцениваете запрос, насколько корректно он составлен?Запрос может быть составлен либо корректно, т.е. выдавать верные данные, либо некорректно, т.е. выдавать неверные. Соответственно корректность запроса могут оценивать только те, кто знает, что он должен выдавать, а мы этого не знаем :)
...
Рейтинг: 0 / 0
30.10.2015, 13:24:49
    #39091062
pitnn
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индекс во вложенных запросах
pitnnАЗапрос может быть составлен либо корректно, т.е. выдавать верные данные, либо некорректно, т.е. выдавать неверные. Соответственно корректность запроса могут оценивать только те, кто знает, что он должен выдавать, а мы этого не знаем :)
С точки зрения выдачи результата, да согласен) Я имел ввиду корректность с точки зрения построителя. Можно запрос составить криво и он будет выполняться долго, а можно составить оптимально и он будет выполняться быстро при одинаковых результатах
...
Рейтинг: 0 / 0
30.10.2015, 13:51:24
    #39091105
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индекс во вложенных запросах
pitnn
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
USE detal_tec2;

SET @art = 'OC47', @br = 'KNECHT';

SELECT DISTINCT UAll.Art, UAll.Br FROM(
	
	SELECT U1.Art, U1.Br FROM (
	
		SELECT 
			Level2_11.ArtCanonical AS Art,
			Level2_11.MfcNameCanonical AS Br
		FROM
			`do_search_art_syn` AS Level2_11
		INNER JOIN (
			 SELECT
				Level1_11.ArtCanonical,
				Level1_11.MfcNameCanonical
			FROM
				`do_search_art_syn` AS Level1_11
			WHERE
				Level1_11.Art = @art
				AND Level1_11.MfcName = @br) AS CrossL_11
		ON Level2_11.Art = CrossL_11.ArtCanonical AND
			Level2_11.MfcName = CrossL_11.MfcNameCanonical
	
		UNION ALL
		
		SELECT 
			Level2_12.Art AS Art,
			Level2_12.MfcName AS Br
		FROM
			`do_search_art_syn` AS Level2_12
		INNER JOIN (
			SELECT
				Level1_12.ArtCanonical,
				Level1_12.MfcNameCanonical
			FROM
				`do_search_art_syn` AS Level1_12
			WHERE
				Level1_12.Art = @art
				AND Level1_12.MfcName = @br) AS CrossR_11
		ON Level2_12.ArtCanonical = CrossR_11.ArtCanonical AND
			Level2_12.MfcNameCanonical = CrossR_11.MfcNameCanonical) AS U1
	
	UNION ALL
	
	SELECT U2.Art, U2.Br FROM (
	
		SELECT 
			Level2_21.ArtCanonical AS Art,
			Level2_21.MfcNameCanonical AS Br
		FROM
			`do_search_art_syn` AS Level2_21
		INNER JOIN (
			EXPLAIN SELECT
				Level1_21.Art,
				Level1_21.MfcName
			FROM
				`do_search_art_syn` AS Level1_21
			WHERE
				Level1_21.ArtCanonical = @art
				AND Level1_21.MfcNameCanonical = @br) AS CrossL_21
		ON Level2_21.Art = CrossL_21.Art AND
			Level2_21.MfcName = CrossL_21.MfcName
	
		UNION ALL
		
		SELECT 
			Level2_22.Art AS Art,
			Level2_22.MfcName AS Br
		FROM
			`do_search_art_syn` AS Level2_22
		INNER JOIN (
			SELECT
				Level1_22.Art,
				Level1_22.MfcName
			FROM
				`do_search_art_syn` AS Level1_22
			WHERE
				Level1_22.ArtCanonical = @art
				AND Level1_22.MfcNameCanonical = @br) AS CrossR_21
		ON Level2_22.ArtCanonical = CrossR_21.Art AND
			Level2_22.MfcNameCanonical = CrossR_21.MfcName) AS U2) AS UAll



А теперь вопрос. Почему не используются индексы в вложенных запросах и как можно исправить ситуацию?

Я лично запрос ниасилил. Куча подзапросов, куча UNION ALL, чтобы потом гордо написать DISTINCT...
Левелы какие-то ...

Херь какая-то.

Перепиши это всё без финального DISTINCT, без подзапросов во FROM и желательно не повторяя 4 раза одинаковый или почти одинаковый (под)запрос. Думай башкой, а не чем другим.
Если сделаешь, я полагаю, всё будет ОК.

нужные индексы у тебя есть (индексы лишние я бы на твоём месте почикал)
...
Рейтинг: 0 / 0
30.10.2015, 14:18:55
    #39091146
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индекс во вложенных запросах
MasterZiv,

запрос составлен оптимально для перебора (на данной структуре)
всех возможных связок (до третьего колена) начиная с двух входных позиций (Имя и ИмяКаноникал).

Визуально упрошение возможно если использовать OR,
но это, скорее всего, исключит поиск по индексам.


Возможно имеет смысл создать большую универсальную
таблицу связок со всеми возможными линками
(до заданого колена/вложености).
...
Рейтинг: 0 / 0
30.10.2015, 15:24:58
    #39091252
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индекс во вложенных запросах
запрос составлен оптимально для перебора (на данной структуре)
всех возможных связок (до третьего колена) начиная с двух входных позиций (Имя и ИмяКаноникал).

Сомневаюсь.


Визуально упрошение возможно если использовать OR,
но это, скорее всего, исключит поиск по индексам.


Отнюдь. (в смысле -- не исключит)



Возможно имеет смысл создать большую универсальную
таблицу связок со всеми возможными линками


Хорошая мысль, правильная.
...
Рейтинг: 0 / 0
30.10.2015, 18:21:23
    #39091476
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индекс во вложенных запросах
MasterZivзапрос составлен оптимально для перебора (на данной структуре)
всех возможных связок (до третьего колена) начиная с двух входных позиций (Имя и ИмяКаноникал).

Сомневаюсь.


Визуально упрошение возможно если использовать OR,
но это, скорее всего, исключит поиск по индексам.


Отнюдь. (в смысле -- не исключит)



Возможно имеет смысл создать большую универсальную
таблицу связок со всеми возможными линками


Хорошая мысль, правильная.

>> Сомневаюсь.

Сомневатся полезно. но в какой-то момент следует
проверить самому...

>> Отнюдь. (в смысле -- не исключит)

При Сталине такого не было! (С).
OR не дружил с индексами до послдних несколько лет...
вроде только недавно подружился...
мы не знаем весию ТСа.
...
Рейтинг: 0 / 0
30.10.2015, 18:35:09
    #39091491
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индекс во вложенных запросах
javajdbcOR не дружил с индексами до послдних несколько лет...
вроде только недавно подружился...
мы не знаем весию ТСа.

Миф...
Зависит от запроса.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Индекс во вложенных запросах / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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