powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Почему медленно работает запрос?
19 сообщений из 19, страница 1 из 1
Почему медленно работает запрос?
    #38441905
Stan_1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день. Уже сломал всю голову. Есть таблица, которая занимает примерно 3 млн. записей. К этой таблице, и ряду других применяется такой запрос.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT ROUND(COALESCE(SUM(t1.`amount`),0),2)
FROM (
   SELECT DISTINCT  us.`savind_id`, ROUND(us.`amount`,2) as `amount`
   FROM `user_savings` us
   INNER JOIN `users` u ON us.`user_id`=u.`user_id`
   LEFT JOIN `transactions_by_date` td ON td.`transactionId`=us.`transaction_id` AND us.`user_id`=td.`user_id`
   WHERE us.`user_id`=20 AND td.`is_excluded`=0 AND td.`not_qualified`=0 AND td.`is_system`=0 AND DATE(us.create_time)>=DATE(u.`create_time`)
) as `t1`;



Сервер - 4 ядра i5, 32 Gb оперативки, все кеши на виртуальных дисках в памяти размером 2 Гб, аппаратный RAID. Explain показывает вроде бы неплохую ситуацию

Код: plaintext
1.
2.
3.
1	PRIMARY	<derived2>	ALL					255	
2	DERIVED	u	const	PRIMARY	PRIMARY	4		1	Using temporary
2	DERIVED	td	index_merge	transactionId,is_excluded,not_qualified,is_system,user_id	user_id,is_excluded,not_qualified,is_system	4,5,5,5		8542	Using intersect(user_id,is_excluded,not_qualified,is_system); Using where; Using index
2	DERIVED	us	ref	user_id,transaction_id	transaction_id	4	savedplus.td.transactionId	1	Using where

Среднее время выполнения - 4-5 секунд. Меньше ни как. Помогите, плз, в чем может быть проблема?
...
Рейтинг: 0 / 0
Почему медленно работает запрос?
    #38441906
Stan_1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
3 млн. записей - это таблица transaction_by_date. Остальные таблицы - в пределах нескольких десятков тысяч строк
...
Рейтинг: 0 / 0
Почему медленно работает запрос?
    #38441922
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В результат идут данные данные только из одной таблицы, это так и надо?

Таблицу `transactions_by_date` вы соединяете через LEFT JOIN, но тут же в секции WHERE фильтруете по ней, что автоматически превращает LEFT JOIN в просто JOIN. Нужно ли убрать слово LEFT, либо убрать условия фильтрации, либо (наиболее вероятно) перенести их в условия соединения.
...
Рейтинг: 0 / 0
Почему медленно работает запрос?
    #38441940
Stan_1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблема похоже в вот этом.

Код: plsql
1.
SELECT * FROM `transactions_by_date` WHERE user_id=20 AND is_system=0 AND is_excluded=0 AND not_qualified=0



Этот запрос сам по себе выполняется за 4.10 секунды. При этом EXPLAIN пишет

| 1 | SIMPLE | transactions_by_date | index_merge | is_excluded,not_qualified,is_system,user_id | user_id,is_excluded,not_qualified,is_system | 4,5,5,5 | NULL | 8542 | Using intersect(user_id,is_excluded,not_qualified,is_system); Using where |

Это как раз та таблица, которая занимает примерно 3 млн. строк. Что в ней может быть?
...
Рейтинг: 0 / 0
Почему медленно работает запрос?
    #38441946
Stan_1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А иногда (редко) данный запрос выдает нормальное время в 0,17 сек. А не может быть это связано с тем, что в эту базу пишутся новые записи с частотой, скажем, 2 записи в секунду? Может быть при вставке новой записи индексы пересчитываются, и в это время не работают?
...
Рейтинг: 0 / 0
Почему медленно работает запрос?
    #38441949
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нехватает индекса по полям, что во where...
...
Рейтинг: 0 / 0
Почему медленно работает запрос?
    #38441951
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
create index idx on `transactions_by_date`(user_id,is_system,is_excluded,not_qualified)
...
Рейтинг: 0 / 0
Почему медленно работает запрос?
    #38441963
Stan_1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уже делал - правда по всем, кроме user_id. Не помогает. Но вот что сейчас помогло

Код: plsql
1.
2.
3.
SELECT * FROM `transactions_by_date` 
FORCE INDEX(user_id) WHERE user_id=20 
AND is_excluded=0 AND not_qualified=0 AND is_system=0



0,23 сек

Теперь пытаюсь в большой запрос это вставить.
...
Рейтинг: 0 / 0
Почему медленно работает запрос?
    #38441964
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaНехватает индекса по полям, что во where...Не факт. Возможно, нужен индекс на поля для соединения.
...
Рейтинг: 0 / 0
Почему медленно работает запрос?
    #38442026
Stan_1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще интереснее. Вот такой запрос:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
EXPLAIN SELECT ROUND(COALESCE(SUM(t1.`amount`),0),2)
FROM (
SELECT us.create_time, us.`savind_id`, ROUND(td.`amount`,2) as `amount`
FROM `user_savings` us, `transactions_by_date` td WHERE us.user_id=20 
AND us.transaction_id=td.transactionId AND us.amount > 0 
AND td.`is_excluded`=0 AND td.`is_system`=0 AND td.`not_qualified`=0
) t1



Он то выполняется 12 секунд, то 0,17. Закономерность такая.

Когда 12 секунд, то EXPLAIN такой.

1    PRIMARY    <derived2>    ALL                    254    
2    DERIVED    td    ref    transactionId,is_excluded,not_qualified,is_system    is_excluded    5        3170975    Using where
2    DERIVED    us    ref    user_id,transaction_id    transaction_id    4    savedplus.td.transactionId    1    Using where

А если 0,17, то EXPLAIN такой.

1    PRIMARY    <derived2>    ALL                    254    
2    DERIVED    us    ref    user_id,transaction_id    user_id    4        1230    Using where
2    DERIVED    td    ref    transactionId,is_excluded,not_qualified,is_system    transactionId    4    savedplus.us.transaction_id    44    Using where

Уже понятнее. Почему-то иногда планировщик выбирает вариант, при котором он просматривает 3 млн. записей. И это занимает 12 секунд.

А как можно зафискирвоать вторую схему планирования навсегда?
...
Рейтинг: 0 / 0
Почему медленно работает запрос?
    #38442034
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Варианты:
1) удалить индекс is_excluded и другие индексы с низкой селективностью (если они не нужны для чего-то другого).
2) выполнить ANALYZE TABLE для обоих таблиц.

План попытаться закрепить можно через принудительною использование нужных индексов, см. Index Hint Syntax .
...
Рейтинг: 0 / 0
Почему медленно работает запрос?
    #38442040
Stan_1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хм. на первый взгляд сработал вариант 1. Сейчас буду тестировать. Исключить ненужные ключи уже в скрипте можно будет.
...
Рейтинг: 0 / 0
Почему медленно работает запрос?
    #38442124
Stan_1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoftВарианты:
1) удалить индекс is_excluded и другие индексы с низкой селективностью (если они не нужны для чего-то другого).


В общем... спасибо огромное! Вот это сработало.

Хотя в целом непонимание так и осталось. Похоже, что очень медленно работает index_merge. Все проводки с ними выполняются очень долго. Как только я "ломал разными методами" планировщик запросов, и не видел в EXPLAIN index_merge - все становилось нормально.

Например, по части запросов удавалось поднять производительность в десятки и сотни раз (в обще сложности вчера скорректировал 5 запросов) путем замены "is_excluded=0" на "is_excluded != 1". И это при том, что is_excluded, естественно, сам по себе является индексом.
...
Рейтинг: 0 / 0
Почему медленно работает запрос?
    #38442134
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stan_1, мусклевский сборщик статистики - вещь такая, как бы сказать... в общем, он может ошибаться. А из кривой статистики вырастают кривые планы...
...
Рейтинг: 0 / 0
Почему медленно работает запрос?
    #38442136
Stan_1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglirStan_1, мусклевский сборщик статистики - вещь такая, как бы сказать... в общем, он может ошибаться. А из кривой статистики вырастают кривые планы...

А я ей и не пользуюсь. :) У меня скрипт, который пишет время вызова программных методов. Вот например, было

 im->getUserSA executed at 0.006242036819458 sec (load 2 accounts)
 im->getUserCC executed at 0.020219087600708 sec (load 10 accounts)
Load user at 4.27365647382921 sec
   Load all transactions at 1.1266248512268 sec
   Load dates of use application at 0.00624680519104 sec

Стало

 im->getUserSA executed at 0.0063648223876953 sec (load 2 accounts)
 im->getUserCC executed at 0.019848108291626 sec (load 10 accounts)
   Load user at 0.016113042831421 sec
   Load all transactions at 0.16445207595825 sec
   Load dates of use application at 0.0062861442565918 sec
...
Рейтинг: 0 / 0
Почему медленно работает запрос?
    #38442142
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stan_1А я ей и не пользуюсь. :)Речь о статистике по имеющимся данным, которую мускль собирает самостоятельно и которая учитывается при оценке количества получаемых записей и, соответственно, при определении используемых при выполнении запросов индексов.
...
Рейтинг: 0 / 0
Почему медленно работает запрос?
    #38442150
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stan_1,

Попробуй для начала убрать подзапрос во from, потом - лишние колонки и таблицы.
...
Рейтинг: 0 / 0
Почему медленно работает запрос?
    #38442155
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

И distinct ещё, безусловно.
...
Рейтинг: 0 / 0
Почему медленно работает запрос?
    #38442157
Stan_1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglirStan_1А я ей и не пользуюсь. :)Речь о статистике по имеющимся данным, которую мускль собирает самостоятельно и которая учитывается при оценке количества получаемых записей и, соответственно, при определении используемых при выполнении запросов индексов.

Сорри, ступил. :( Теперь понял
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Почему медленно работает запрос?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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