@dNertyco

Как можно оптимизировать данный sql код?

Сейчас выполнение данного кода на выдачу 5и результатов составляет 10 секунд, а нужно намного меньше, но что же делать?

Упрощённый код:
SELECT 
	* 
FROM 
	table_sql AS t0 
	INNER JOIN table_sql AS t1 ON (
		t0.id <> t1.id 
		AND (
			0 
			OR (
				1 
				AND t0.P1_01 = t1.P1_01 
				AND t0.X_02 = t1.X_02 
				AND t0.X_01 = t1.X_01 
				AND t0.X_10 = t1.X_10 
				AND t0.P2_01 = t1.P2_01
			) 
			OR (
				1 
				AND t0.P1_01 = t1.P1_01 
				AND t0.X_02 = t1.X_02 
				AND t0.X_01 = t1.X_01 
				AND t0.X_10 = t1.X_10
			) 
			OR (
				1 
				AND t0.X_02 = t1.X_02 
				AND t0.X_01 = t1.X_01 
				AND t0.X_10 = t1.X_10 
				AND t0.P2_01 = t1.P2_01
			) 
		)
	) 
ORDER BY 
	t0.date ASC 
LIMIT 
	5


Полный код:

SELECT 
	* 
FROM 
	table_sql AS t0 
	INNER JOIN table_sql AS t1 ON (
		t0.id <> t1.id 
		AND (
			0 
			OR (
				1 
				AND t0.P1_01 = t1.P1_01 
				AND t0.X_02 = t1.X_02 
				AND t0.X_01 = t1.X_01 
				AND t0.X_10 = t1.X_10 
				AND t0.P2_01 = t1.P2_01
			) 
			OR (
				1 
				AND t0.P1_01 = t1.P1_01 
				AND t0.X_02 = t1.X_02 
				AND t0.X_01 = t1.X_01 
				AND t0.X_10 = t1.X_10
			) 
			OR (
				1 
				AND t0.X_02 = t1.X_02 
				AND t0.X_01 = t1.X_01 
				AND t0.X_10 = t1.X_10 
				AND t0.P2_01 = t1.P2_01
			) 
			OR (
				1 
				AND t0.P1_10 = t1.P1_10 
				AND t0.X_01 = t1.X_01 
				AND t0.X_10 = t1.X_10 
				AND t0.X_20 = t1.X_20 
				AND t0.P2_10 = t1.P2_10
			) 
			OR (
				1 
				AND t0.P1_10 = t1.P1_10 
				AND t0.X_01 = t1.X_01 
				AND t0.X_10 = t1.X_10 
				AND t0.X_20 = t1.X_20
			) 
			OR (
				1 
				AND t0.X_01 = t1.X_01 
				AND t0.X_10 = t1.X_10 
				AND t0.X_20 = t1.X_20 
				AND t0.P2_10 = t1.P2_10
			) 
			OR (
				1 
				AND t0.P1_01 = t1.P1_01 
				AND t0.X_02 = t1.X_02 
				AND t0.X_10 = t1.X_10 
				AND t0.P2_01 = t1.P2_01
			) 
			OR (
				1 
				AND t0.P1_01 = t1.P1_01 
				AND t0.X_02 = t1.X_02 
				AND t0.X_01 = t1.X_01 
				AND t0.X_10 = t1.X_10
			) 
			OR (
				1 
				AND t0.X_02 = t1.X_02 
				AND t0.X_01 = t1.X_01 
				AND t0.X_10 = t1.X_10 
				AND t0.P2_01 = t1.P2_01
			) 
			OR (
				1 
				AND t0.P1_10 = t1.P1_10 
				AND t0.X_01 = t1.X_01 
				AND t0.X_20 = t1.X_20 
				AND t0.P2_10 = t1.P2_10
			) 
			OR (
				1 
				AND t0.P1_10 = t1.P1_10 
				AND t0.X_01 = t1.X_01 
				AND t0.X_20 = t1.X_20
			) 
			OR (
				1 
				AND t0.X_01 = t1.X_01 
				AND t0.X_20 = t1.X_20 
				AND t0.P2_10 = t1.P2_10
			) 
			OR (
				1 
				AND t0.X_02 = t1.X_02 
				AND t0.X_01 = t1.X_01 
				AND t0.X_10 = t1.X_10
			) 
			OR (
				1 
				AND t0.P1_01 = t1.P1_01 
				AND t0.X_01 = t1.X_01 
				AND t0.P2_01 = t1.P2_01
			) 
			OR (
				1 
				AND t0.X_01 = t1.X_01 
				AND t0.X_10 = t1.X_10 
				AND t0.X_20 = t1.X_20
			) 
			OR (
				1 
				AND t0.P1_10 = t1.P1_10 
				AND t0.X_10 = t1.X_10 
				AND t0.P2_10 = t1.P2_10
			) 
			OR (
				1 
				AND t0.X_01 = t1.X_01 
				AND t0.X_02 = t1.X_02 
				AND t0.X_03 = t1.X_03
			) 
			OR (
				1 
				AND t0.X_10 = t1.X_10 
				AND t0.X_20 = t1.X_20 
				AND t0.X_30 = t1.X_30
			)
		)
	) 
ORDER BY 
	t0.date ASC 
LIMIT 
	5
  • Вопрос задан
  • 761 просмотр
Пригласить эксперта
Ответы на вопрос 1
leha_gorbunov
@leha_gorbunov
Программист
SELECT 
  * 
FROM 
  table_sql AS t0 
  INNER JOIN table_sql AS t1 ON (
    t0.id <> t1.id 
    AND (
      0

----- Вот отсюда -------
OR (
        1 
        AND t0.P1_01 = t1.P1_01 
        AND t0.X_02 = t1.X_02 
        AND t0.X_01 = t1.X_01 
        AND t0.X_10 = t1.X_10 
        AND t0.P2_01 = t1.P2_01
      )

---- До сюда --- НАХЕР НЕ НАДО---- потому что это объединение следующих двух блоков и на запрос не влияет----
OR (
        1 
        AND t0.P1_01 = t1.P1_01

----Вот эти три строчки-----
AND t0.X_02 = t1.X_02 
        AND t0.X_01 = t1.X_01 
        AND t0.X_10 = t1.X_10

)
OR (
1

----- точно такие же как и эти-----
AND t0.X_02 = t1.X_02 
        AND t0.X_01 = t1.X_01 
        AND t0.X_10 = t1.X_10

---- три строчки --- поэтому выносим их за OR без последствий ------
AND t0.P2_01 = t1.P2_01
      ) 
    )
  ) 
ORDER BY 
  t0.date ASC 
LIMIT 
  5


В итоге имеем что-то более менее вменяемое

SELECT 
  * 
FROM 
  table_sql AS t0 
  INNER JOIN table_sql AS t1 ON 
    t0.id <> t1.id 
    AND t0.X_02 = t1.X_02 
    AND t0.X_01 = t1.X_01 
    AND t0.X_10 = t1.X_10
    AND ( t0.P1_01 = t1.P1_01  OR  t0.P2_01 = t1.P2_01)
ORDER BY 
  t0.date ASC 
LIMIT 
  5
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы