powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Оптимизация SQL запроса
9 сообщений из 9, страница 1 из 1
Оптимизация SQL запроса
    #38915758
Кириллnot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!
Задача: Получить значения которые есть в одной таблице, но нет в другой.
Вариант с LEFT JOIN не подходит, т.к. таблицы - миллионики и запрос КРАЙНЕ долог(около 1.5 часов).
Индексирование вводил в одну таблицу - немного ускорилось, во вторую босс запрещает.
Пробовал на perl, php
Выручайте!!!
...
Рейтинг: 0 / 0
Оптимизация SQL запроса
    #38915761
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Давай запрос и DDL всех таблиц ...
...
Рейтинг: 0 / 0
Оптимизация SQL запроса
    #38915770
Кириллnot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivДавай запрос и DDL всех таблиц ...

Таблица 1
CREATE TABLE `table1` ( `ID` int(10) NOT NULL AUTO_INCREMENT, `ISBN` varchar(255) DEFAULT NULL, `NO` varchar(255) DEFAULT NULL, `NOBD` varchar(255) DEFAULT NULL, `GOOD` varchar(255) DEFAULT NULL, PRIMARY KEY (`ID`), KEY `good` (`GOOD`), KEY `NO` (`NO`) ) ENGINE=InnoDB AUTO_INCREMENT=147382 DEFAULT CHARSET=cp1251

Таблица 2
CREATE TABLE `table2` ( `ID` int(11) NOT NULL AUTO_INCREMENT, `IBLOCK_ELEMENT_ID` int(11) NOT NULL, `IBLOCK_PROPERTY_ID` int(11) NOT NULL, `VALUE` text NOT NULL, `VALUE_ENUM` int(11) DEFAULT NULL, `VALUE_NUM` decimal(18,4) DEFAULT NULL, `DESCRIPTION` varchar(255) DEFAULT NULL, PRIMARY KEY (`ID`), KEY `ix_iblock_elem_prop_m1_1` (`IBLOCK_ELEMENT_ID`,`IBLOCK_PROPERTY_ID`), KEY `ix_iblock_elem_prop_m1_2` (`IBLOCK_PROPERTY_ID`), KEY `ix_iblock_elem_prop_m1_3` (`VALUE_ENUM`,`IBLOCK_PROPERTY_ID`), KEY `ix_iblock_elem_prop_m1_s4` (`IBLOCK_PROPERTY_ID`,`VALUE`(17)) ) ENGINE=InnoDB AUTO_INCREMENT=3103932 DEFAULT CHARSET=cp1251

Запрос

my $sth_x = $dbh_b->prepare("SELECT distinct(m1.`VALUE`) from table2 m1
LEFT JOIN table1 a1
ON a1.`GOOD` = m1.`VALUE` or a1.`NO` = m1.`VALUE`
WHERE m1.`IBLOCK_PROPERTY_ID` = '1' and a1.`GOOD` IS NULL and a1.`NO` IS NULL limit 50000");

$sth_x->execute();
...
Рейтинг: 0 / 0
Оптимизация SQL запроса
    #38915788
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кириллnot,

Позволю себе отформатировать ваши серые портянки:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE TABLE `table1` ( 
`ID` int(10) NOT NULL AUTO_INCREMENT, 
`ISBN` varchar(255) DEFAULT NULL, 
`NO` varchar(255) DEFAULT NULL, 
`NOBD` varchar(255) DEFAULT NULL, 
`GOOD` varchar(255) DEFAULT NULL, 
PRIMARY KEY (`ID`), 
KEY `good` (`GOOD`), 
KEY `NO` (`NO`) 
) ENGINE=InnoDB AUTO_INCREMENT=147382 DEFAULT CHARSET=cp1251

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CREATE TABLE `table2` ( 
`ID` int(11) NOT NULL AUTO_INCREMENT, 
`IBLOCK_ELEMENT_ID` int(11) NOT NULL, 
`IBLOCK_PROPERTY_ID` int(11) NOT NULL, 
`VALUE` text NOT NULL, 
`VALUE_ENUM` int(11) DEFAULT NULL, 
`VALUE_NUM` decimal(18,4) DEFAULT NULL, 
`DESCRIPTION` varchar(255) DEFAULT NULL, 
PRIMARY KEY (`ID`), 
KEY `ix_iblock_elem_prop_m1_1` (`IBLOCK_ELEMENT_ID`,`IBLOCK_PROPERTY_ID`), 
KEY `ix_iblock_elem_prop_m1_2` (`IBLOCK_PROPERTY_ID`), 
KEY `ix_iblock_elem_prop_m1_3` (`VALUE_ENUM`,`IBLOCK_PROPERTY_ID`), 
KEY `ix_iblock_elem_prop_m1_s4` (`IBLOCK_PROPERTY_ID`,`VALUE`(17)) 
) ENGINE=InnoDB AUTO_INCREMENT=3103932 DEFAULT CHARSET=cp1251

Код: sql
1.
2.
3.
4.
5.
SELECT distinct(m1.`VALUE`)
from table2 m1
  LEFT JOIN table1 a1 ON a1.`GOOD` = m1.`VALUE` or a1.`NO` = m1.`VALUE`
WHERE m1.`IBLOCK_PROPERTY_ID` = '1' and a1.`GOOD` IS NULL and a1.`NO` IS NULL
limit 50000
...
Рейтинг: 0 / 0
Оптимизация SQL запроса
    #38915790
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кириллnotво вторую босс запрещает.Передайте боссу, что Битрикс вполне благосклонно относится к индексам и за это с техподдержки не снимают.
...
Рейтинг: 0 / 0
Оптимизация SQL запроса
    #38915793
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуйте так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT m1.`VALUE`
from table2 m1
  LEFT JOIN table1 a1 ON a1.`GOOD` = m1.`VALUE`
WHERE m1.`IBLOCK_PROPERTY_ID` = '1' and a1.`GOOD` IS NULL
UNION
SELECT k1.`VALUE`
from table2 k1
  LEFT JOIN table1 t1 ON t1.`NO` = k1.`VALUE`
WHERE k1.`IBLOCK_PROPERTY_ID` = '1' and t1.`NO` IS NULL

Правда, довольно странно выглядит сравнение типов varchar(255) и text.

P.S. Кто-нибудь мне объяснит, откуда пошла дурацкая практика поле после distinct писать в скобках?
...
Рейтинг: 0 / 0
Оптимизация SQL запроса
    #38915800
Кириллnot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,

Спасибо большое! Передам. А существуют альтернативные решения? угадали про bitrix или я где то слил ?)
...
Рейтинг: 0 / 0
Оптимизация SQL запроса
    #38915802
Кириллnot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,

Не заметил попробую
...
Рейтинг: 0 / 0
Оптимизация SQL запроса
    #38915805
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КириллnotА существуют альтернативные решения?Самый быстрый способ что-то сделать - не делать этого вовсе.
Так и тут - нужно сперва понять, откуда возникла такая задача в дублировании данных в таблицах. А потом подумать, а не получится ли от этого избавиться?
Кириллnotугадали про bitrix или я где то слил ?)table2 трудно спутать, если когда-нибудь видел структуру таблиц Битрикса.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Оптимизация SQL запроса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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