фильтр по времени.
выполняю с двумя разными диапазонами дат: в одном диапазон 3 дня, в другом - 4. при этом второй запрос выполняется вечность.
explain показывает, что выбран другой индекс. если зафорсить хинтом "правильный индекс", то всё отрабатывает быстро. налицо неправильная статистика распределения значений.
однако ANALYZE TABLE проблему не решает.
вычитал про innodb_stats_transient_sample_pages и innodb_stats_persistent, но, т.к. опыта с мускулом не много не уверен. что оно поможет.
стоит играться с этими настройками? кто-то пробовал?
короче, analyze всех таблиц не помог. зато после поднятия innodb_stats_persistent_sample_pages с 20 до 2000 оптимизатор начал выбирать подходящий индекс
Ты сам запрос так и не показал, может его переписать лучше на in или exists?
SELECT left(src,2) as `region_number`, firstname, left(src,4) as `colnum`, company, DATE_FORMAT(starttime,'%Y-%u') as `year-week`, DATE_FORMAT(starttime,'%Y-%m-%d') as `date`, call_price, count(starttime) as `number of calls`, sum(sessiontime) div 60 `traffic_minutes` FROM random_db.call LEFT JOIN random_db.call_cost ON call.sessionid=call_cost.sessionid and call.uniqueid=call_cost.uniqueid LEFT JOIN random_db.agent on id_agent=agent.id WHERE call.starttime BETWEEN '2022-03-28 00:00:00' and '2022-04-01 23:59:59' and id_agent in (1,22,15,745............) and sessiontime BETWEEN 1 and 900 and `calledstation` RLIKE '^00' GROUP BY id_agent, `date`, call_price;
Поиграйся с eq-range-index-dive-limit=
Обсуждают сегодня