Чтобы ускорить ваш запрос, используйте денормализация : сохраняйте баланс текущего счета в каждой записи.Для этого вам нужно сделать три вещи, а затем мы посмотрим, как будет выглядеть запрос:
a) Добавить столбцы в таблицу:
ALTER TABLE accounthistory ADD balance float;
b) Заполните новый столбец
UPDATE accounthistory main SET
balance = (
SELECT SUM(change_amount)
FROM accounthistory
where account_id = main.account_id
and data <= main.date
);
в) Чтобы заполнить новые строки, либо: а) используйте триггер, б) используйте логику приложения, либо в) выполните приведенный выше оператор UPDATE
для строки, добавленной после добавленияэто, т. е. UPDATE ... WHERE id = ?
Теперь запрос на поиск данных, учетная запись которого была изменена на отрицательный, что будет очень быстрым, становится:
SELECT date
from accounthistory
where balance < 0
and balance - change_amount > 0
and account_id = ?;