Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / помогите. как можно ускорить запрос? / 23 сообщений из 23, страница 1 из 1
03.12.2014, 16:25:33
    #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
03.12.2014, 16:34:58
    #38823875
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите. как можно ускорить запрос?
mmm3SELECT *, min(price)Это что за бессмыслица?
...
Рейтинг: 0 / 0
03.12.2014, 16:41:42
    #38823889
mmm3
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите. как можно ускорить запрос?
miksoft, ошибся select min(price) from ....
...
Рейтинг: 0 / 0
03.12.2014, 17:15:46
    #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
03.12.2014, 18:01:35
    #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
03.12.2014, 18:21:29
    #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
03.12.2014, 18:28:10
    #38824032
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите. как можно ускорить запрос?
Попробуйте создать индекс (tour, price, CheckIn).
Не уверен, что MySQL с ним справится. Но если справится, то для второго запроса может помочь.

После создания индекса выполните ANALYZE TABLE Cat_Claim
...
Рейтинг: 0 / 0
03.12.2014, 18:39:38
    #38824045
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите. как можно ускорить запрос?
miksoftПопробуйте создать индекс (tour, price, CheckIn)А не (tour, CheckIn, price)?
...
Рейтинг: 0 / 0
03.12.2014, 18:46:37
    #38824050
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите. как можно ускорить запрос?
AkinaА не (tour, CheckIn, price)?Для первого запроса - возможно.
Для второго точно смысла нет. Придется сканировать 35 млн записей в индексе.
Тогда как в моем варианте достаточно сканировать до первого подходящего CheckIn > CURDATE().
...
Рейтинг: 0 / 0
03.12.2014, 23:11:38
    #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
03.12.2014, 23:13:24
    #38824256
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите. как можно ускорить запрос?
miksoftAkinaА не (tour, CheckIn, price)?Для первого запроса - возможно.
Для второго точно смысла нет. Придется сканировать 35 млн записей в индексе.
Тогда как в моем варианте достаточно сканировать до первого подходящего CheckIn > CURDATE().

в обоих случаях как Акина сказал надо индекс делать.
...
Рейтинг: 0 / 0
05.12.2014, 04:57:23
    #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
05.12.2014, 08:59:13
    #38825703
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите. как можно ускорить запрос?
Я вообще не понимаю, за что копья ломать. Фильтр WHERE оставляет ПОЛОВИНУ записей таблицы. Так что индекс если используется - то скорее как компактная версия таблицы, без лишних полей.
...
Рейтинг: 0 / 0
05.12.2014, 09:23:33
    #38825715
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите. как можно ускорить запрос?
AkinaЯ вообще не понимаю, за что копья ломать.За то, чтобы не сканировать 35 миллионов записей (пусть даже и записей индекса), а как можно меньше.
...
Рейтинг: 0 / 0
05.12.2014, 10:51:31
    #38825853
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите. как можно ускорить запрос?
Для этого надо понимать внутреннюю кухню кода сервера - как именно он будет выполнять сканирование индекса для поиска решения. Я в этом углублённо не копался - мне проще построить модель, набить фейком и сравнить скорости работы, ибо для меня это не основная и даже не дополнительная работа, сроки не тянут, а нужно редко.
...
Рейтинг: 0 / 0
05.12.2014, 15:01:40
    #38826316
Progrom
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите. как можно ускорить запрос?
Для нахождения неизвестного минимального значения, итоговая функция проверит все строки (хотите Вы этого или нет). Единственный на мой взгляд вариант, это разбить саму таблицу на несколько, чтобы не было 70 млн. записей в одной таблице.

Кстати можно попробовать сыграть на порядке выполнения проверки WHERE . Если кол-во значений по условию CheckIn > CURDATE() меньше 40 млн, то будет иметь смысл сделать не WHERE tour = 376 and CheckIn > CURDATE(); , а WHERE CheckIn > CURDATE() and tour = 376;
...
Рейтинг: 0 / 0
05.12.2014, 16:00:21
    #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
05.12.2014, 16:10:30
    #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
05.12.2014, 16:20:18
    #38826423
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите. как можно ускорить запрос?
Cygapb-007,

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

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

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

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

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


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