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

вот два запроса в первом берем цены до сегодня.
во второй берем с завтра (нужен этот запрос)



mysql> explain SELECT *, min(price) as p FROM Cat_Claim WHERE tour = 376 and CheckIn < CURDATE();
+----+-------------+-----------+-------+------------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-----------+-------+------------------+------+---------+------+------+-------------+
| 1 | SIMPLE | Cat_Claim | range | Tour,CheckIn,t_c | t_c | 7 | NULL | 10 | Using where |
+----+-------------+-----------+-------+------------------+------+---------+------+------+-------------+
1 row in set (0.00 sec)

mysql> explain SELECT *, min(price) as p FROM Cat_Claim WHERE tour = 376 and CheckIn > CURDATE();
+----+-------------+-----------+------+------------------+------+---------+-------+----------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-----------+------+------------------+------+---------+-------+----------+-------------+
| 1 | SIMPLE | Cat_Claim | ref | Tour,CheckIn,t_c | Tour | 4 | const | 37736646 | Using where |
+----+-------------+-----------+------+------------------+------+---------+-------+----------+-------------+
1 row in set (0.01 sec)
...
Рейтинг: 0 / 0
помогите. как можно ускорить запрос?
    #38823875
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mmm3SELECT *, min(price)Это что за бессмыслица?
...
Рейтинг: 0 / 0
помогите. как можно ускорить запрос?
    #38823889
mmm3
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft, ошибся select min(price) from ....
...
Рейтинг: 0 / 0
помогите. как можно ускорить запрос?
    #38823939
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mmm3miksoft, ошибся select min(price) from ....
Т.е.
Код: sql
1.
2.
3.
SELECT min(price) as p 
FROM Cat_Claim 
WHERE tour = 376 and CheckIn > CURDATE();


Для максимального ускорения такого запроса необходимый индекс - просто таки очевиден.
Hint: он составной...
...
Рейтинг: 0 / 0
помогите. как можно ускорить запрос?
    #38824003
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mmm3,

Сколько записей всего в таблице?
Сколько выдадут следующие запросы:
Код: sql
1.
SELECT count(*) FROM Cat_Claim WHERE tour = 376

Код: sql
1.
SELECT count(*) FROM Cat_Claim WHERE tour = 376 and CheckIn > CURDATE()

?
...
Рейтинг: 0 / 0
помогите. как можно ускорить запрос?
    #38824024
mmm3
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoftmmm3,

Сколько записей всего в таблице? 70 млн
Сколько выдадут следующие запросы:
Код: sql
1.
SELECT count(*) FROM Cat_Claim WHERE tour = 376   - 40 млн

Код: sql
1.
SELECT count(*) FROM Cat_Claim WHERE tour = 376 and CheckIn > CURDATE()  -  35 млн

?
...
Рейтинг: 0 / 0
помогите. как можно ускорить запрос?
    #38824032
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуйте создать индекс (tour, price, CheckIn).
Не уверен, что MySQL с ним справится. Но если справится, то для второго запроса может помочь.

После создания индекса выполните ANALYZE TABLE Cat_Claim
...
Рейтинг: 0 / 0
помогите. как можно ускорить запрос?
    #38824045
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftПопробуйте создать индекс (tour, price, CheckIn)А не (tour, CheckIn, price)?
...
Рейтинг: 0 / 0
помогите. как можно ускорить запрос?
    #38824050
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaА не (tour, CheckIn, price)?Для первого запроса - возможно.
Для второго точно смысла нет. Придется сканировать 35 млн записей в индексе.
Тогда как в моем варианте достаточно сканировать до первого подходящего CheckIn > CURDATE().
...
Рейтинг: 0 / 0
помогите. как можно ускорить запрос?
    #38824253
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mmm3miksoftmmm3,

Сколько записей всего в таблице? 70 млн
Сколько выдадут следующие запросы:
Код: sql
1.
SELECT count(*) FROM Cat_Claim WHERE tour = 376   - 40 млн

Код: sql
1.
SELECT count(*) FROM Cat_Claim WHERE tour = 376 and CheckIn > CURDATE()  -  35 млн

?

весело, блин...
и что же ты тут хочешь оптимизировать?
...
Рейтинг: 0 / 0
помогите. как можно ускорить запрос?
    #38824256
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftAkinaА не (tour, CheckIn, price)?Для первого запроса - возможно.
Для второго точно смысла нет. Придется сканировать 35 млн записей в индексе.
Тогда как в моем варианте достаточно сканировать до первого подходящего CheckIn > CURDATE().

в обоих случаях как Акина сказал надо индекс делать.
...
Рейтинг: 0 / 0
помогите. как можно ускорить запрос?
    #38825661
bochkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно так
но индекс надо tour CheckIn price
Код: sql
1.
2.
3.
4.
5.
SELECT price as p 
FROM Cat_Claim 
WHERE tour = 376 and CheckIn > CURDATE()
ORDER BY price
LIMIT 1;
...
Рейтинг: 0 / 0
помогите. как можно ускорить запрос?
    #38825703
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я вообще не понимаю, за что копья ломать. Фильтр WHERE оставляет ПОЛОВИНУ записей таблицы. Так что индекс если используется - то скорее как компактная версия таблицы, без лишних полей.
...
Рейтинг: 0 / 0
помогите. как можно ускорить запрос?
    #38825715
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaЯ вообще не понимаю, за что копья ломать.За то, чтобы не сканировать 35 миллионов записей (пусть даже и записей индекса), а как можно меньше.
...
Рейтинг: 0 / 0
помогите. как можно ускорить запрос?
    #38825853
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для этого надо понимать внутреннюю кухню кода сервера - как именно он будет выполнять сканирование индекса для поиска решения. Я в этом углублённо не копался - мне проще построить модель, набить фейком и сравнить скорости работы, ибо для меня это не основная и даже не дополнительная работа, сроки не тянут, а нужно редко.
...
Рейтинг: 0 / 0
помогите. как можно ускорить запрос?
    #38826316
Progrom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для нахождения неизвестного минимального значения, итоговая функция проверит все строки (хотите Вы этого или нет). Единственный на мой взгляд вариант, это разбить саму таблицу на несколько, чтобы не было 70 млн. записей в одной таблице.

Кстати можно попробовать сыграть на порядке выполнения проверки WHERE . Если кол-во значений по условию CheckIn > CURDATE() меньше 40 млн, то будет иметь смысл сделать не WHERE tour = 376 and CheckIn > CURDATE(); , а WHERE CheckIn > CURDATE() and tour = 376;
...
Рейтинг: 0 / 0
помогите. как можно ускорить запрос?
    #38826396
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не знаю, как красиво посмотреть в MySQL... Да и не профильный он мне
Вот в MS SQL вроде как наглядней, да и индексы в планах отражаются:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
/*
insert Cat_Claim(tour,CheckIn,price) 
  select 
    tour=abs(checksum(newid()))%1000+1
  , CheckIn=dateadd(day,checksum(newid())%1000,GETDATE())
  , price=abs(checksum(newid()))%1000000/100.00+1 
  from Cat_Claim
*/

set statistics io, time on
select count(*)qty from Cat_Claim c where c.tour<>376 
select count(*)qty from Cat_Claim c where c.tour=376 
select count(*)qty from Cat_Claim c where c.tour=376 and c.CheckIn>GETDATE()
select min(price)p from Cat_Claim c where c.tour=376
select min(price)p from Cat_Claim c where c.tour=376 and c.CheckIn>GETDATE()
set statistics io, time off


Таблица "Cat_Claim". Число просмотров 2, логических чтений 169659, физических чтений 2, упреждающих чтений 169988, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Время ЦП = 4641 мс, затраченное время = 6476 мс.

Таблица "Cat_Claim". Число просмотров 5, логических чтений 172239, физических чтений 0, упреждающих чтений 169352, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Время ЦП = 4016 мс, затраченное время = 2656 мс.

Таблица "Cat_Claim". Число просмотров 5, логических чтений 152965, физических чтений 0, упреждающих чтений 147787, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Время ЦП = 3422 мс, затраченное время = 2172 мс.

Таблица "Cat_Claim". Число просмотров 1, логических чтений 5, физических чтений 2, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Время ЦП = 0 мс, затраченное время = 7 мс.

Таблица "Cat_Claim". Число просмотров 1, логических чтений 5, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Время ЦП = 15 мс, затраченное время = 0 мс.
...
Рейтинг: 0 / 0
помогите. как можно ускорить запрос?
    #38826410
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bochkovможно так но индекс надо tour CheckIn price
Код: sql
1.
2.
3.
4.
5.
SELECT price as p 
FROM Cat_Claim 
WHERE tour = 376 and CheckIn > CURDATE()
ORDER BY price
LIMIT 1;


Кстати, на индексе (tour,CheckIn,price)
имеем такую картинку:
...
Рейтинг: 0 / 0
помогите. как можно ускорить запрос?
    #38826423
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cygapb-007,

Можете словами описать выводы?
А то лень в чуждые картинки вникать. Я MS SQL даже на картинках уже сто лет не видел.
...
Рейтинг: 0 / 0
помогите. как можно ускорить запрос?
    #38826433
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftCygapb-007,

Можете словами описать выводы?
А то лень в чуждые картинки вникать. Я MS SQL даже на картинках уже сто лет не видел.
Да просто подтвержденее на картинках ранее высказанного
miksoftAkinaА не (tour, CheckIn, price)?Для первого запроса - возможно.
Для второго точно смысла нет. Придется сканировать 35 млн записей в индексе.
Тогда как в моем варианте достаточно сканировать до первого подходящего CheckIn > CURDATE().
Ровно это и ничего больше... Но - красиво
А то тут уже начали предлагать порядок условий в WHERE поменять...
...
Рейтинг: 0 / 0
помогите. как можно ускорить запрос?
    #38826438
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cygapb-007,

Ну оптимизатор в MS SQL все-таки поумнее будет. Способен ли на такое MySQL - не уверен, а пробовать, увы, некогда.
...
Рейтинг: 0 / 0
помогите. как можно ускорить запрос?
    #38826446
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftCygapb-007,

Ну оптимизатор в MS SQL все-таки поумнее будет. Способен ли на такое MySQL - не уверен, а пробовать, увы, некогда.Вы про распараллеливание на 4 процессора?
ЯТД, суть не в этом, а в толщине линий (над ними указано число передаваемых по линии строк таблицы, соответственно чем больше строк, тем толще линия)
...
Рейтинг: 0 / 0
помогите. как можно ускорить запрос?
    #38826451
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cygapb-007miksoftCygapb-007,

Ну оптимизатор в MS SQL все-таки поумнее будет. Способен ли на такое MySQL - не уверен, а пробовать, увы, некогда.Вы про распараллеливание на 4 процессора?
ЯТД, суть не в этом, а в толщине линий (над ними указано число передаваемых по линии строк таблицы, соответственно чем больше строк, тем толще линия)Нет, я про ограниченное сканирование, которое быстрее чем полное.
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / помогите. как можно ускорить запрос?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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