Как улучшить диапазон выбора значений, если одно из них имеет конкретную переменную в Mysql - PullRequest
0 голосов
/ 20 ноября 2018

Мой вопрос: как я могу ускорить это? Должен быть более элегантный способ справиться с этим. Внутренний выбор выполняется за 0,038 с, а этот - за 6 007 с. Я не знаю, как мне улучшить эту производительность

select * FROM table
where number1 in (
SELECT number1 
FROM table
WHERE `date` = 'yyyy-mm-dd' 
AND value1 = 'variable1' 
AND value2 = 1
)

Дело в том, что мне нужен диапазон значений из той же таблицы, если в значении 2 содержится переменная 1

так из таблицы вот так

id|number1| value1   | value2
1 | 11403 | exempl1  |  null
2 | 11404 | exempl1  | 1
3 | 11404 | exempl1  | null
4 | 11405 | exempl1  | null
5 | 11405 | exempl1  | null

я получаю только это

id|number1| value1   | value2
2 | 11404 | exempl1  | 1
3 | 11404 | exempl1  | null

1 Ответ

0 голосов
/ 20 ноября 2018

Вы можете преобразовать его в Коррелированный подзапрос с Exists . Оптимизатор MySQL может иметь возможность использовать индексы (если определены) в этом случае.

SELECT t1.* 
FROM table AS t1
WHERE EXISTS( SELECT 1 
              FROM table AS t2
              WHERE t2.number1 = t1.number1 AND 
                    t2.`date` = 'yyyy-mm-dd' AND 
                    t2.value1 = 'variable1' AND 
                    t2.value2 = 1 )

Если индексы не определены, вы можете определить составной индекс на (number1, date, value1, value2), чтобы повысить производительность.

ALTER TABLE `table`
ADD INDEX comp_idx1(number1, `date`, value1, value2);

Другая возможность оптимизации - это выборка только тех столбцов, которые действительно требуются в коде вашего приложения. Избегайте использования SELECT *. Вы можете прочитать: Почему SELECT * считается вредным?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...