Для запроса, который вы показываете, вы не можете сделать лучше, чем индекс на date
, который у вас уже есть.Запрос будет проверять все строки, которые соответствуют диапазону дат, но, по крайней мере, он не будет проверять строки вне диапазона дат.Если это заставит запрос исследовать тысячи или миллионы строк, с этим ничего не поделаешь.Он должен исследовать строки, чтобы подсчитать их.
Если вам нужен запрос, который подсчитывает строки за меньшее время, одной из стратегий является создание второй таблицы, в которой хранится по одной строке на дату, и количество, связанное с этой датой,
CREATE TABLE market_db_candle_count_by_day (
date DATE PRIMARY KEY,
count INT UNSIGNED NOT NULL
);
Заполните его подсчетами по дням:
INSERT INTO market_db_candle_count_by_day
SELECT date, COUNT(*)
FROM market_db_candle
GROUP BY date;
Затем вы можете запросить СУММУ подсчетов:
select sum(count) as count from market_db_candle_count_by_day
where date >= '2018-09-05' and date <= '2018-09-09';
Вы должны сохранитьпоследняя таблица синхронизируется и обновляется при необходимости.
PS: вставьте литералы даты в одинарные кавычки.