|
Более оптимальный SQl запрос | ☑ | ||
---|---|---|---|---|
0
Coldboy
29.04.13
✎
16:19
|
Здравствуйте. Нужно выбрать строку из таблицы, с наибольшей датой.
Делаю так. select pole1 From table where mypole = 'parametr' order by mydate desc limit 1. на 12000 строчек отрабатывает, за 0.29 это много. хочется быстрее, т.к надо сделать около 100 раз. вариант с select max(mydate),pole1 from table where mypole = 'parametr' отрабатывает за 0.3-0.32. Есть у кого нить другие варианты. |
|||
1
Ёпрст
29.04.13
✎
16:20
|
select top 1
^) |
|||
2
Ёпрст
29.04.13
✎
16:20
|
т.к надо сделать около 100 раз.
Зачем ? |
|||
3
Coldboy
29.04.13
✎
16:28
|
(1) select top 1 это как? если сортировки по дате там изначально нет. ну 100 раз. это как бы с разными параметрами надо отработать.
|
|||
4
Fram
29.04.13
✎
16:31
|
(3) Вообще то смысл SQL запросов в том, чтобы все вытащить одним запросом. Неужели нет возможности?
|
|||
5
Fram
29.04.13
✎
16:32
|
(0) индекс по mypole есть?
|
|||
6
Ёпрст
29.04.13
✎
16:38
|
(3) чего как ?
select ещз 1 pole1 From table where mypole = 'parametr' order by mydate desc |
|||
7
Жан Пердежон
29.04.13
✎
16:47
|
(3) ну так запихни свои 100 раз параметр/вт и сделай одним запросом
|
|||
8
Coldboy
29.04.13
✎
16:57
|
(7) ну в принципе можно, но я просто в отдельности, может есть еще оптимальней метод ?
|
|||
9
Gepard
29.04.13
✎
17:00
|
(5) +1 и по дате тоже нужен
|
|||
10
Fragster
гуру
29.04.13
✎
17:14
|
select mypole, max(pole1) From table
|
|||
11
Fragster
гуру
29.04.13
✎
17:15
|
group by mypole
|
|||
12
Ёпрст
29.04.13
✎
17:16
|
(10) дык ему по последней дате надо
|
|||
13
mistеr
29.04.13
✎
17:18
|
(8) Не можно, а нужно.
В некоторых (нормальных) языках и СУБД можно и без ВТ обойтись, сразу массив в качестве параметра пихнуть. |
|||
14
Fragster
гуру
29.04.13
✎
17:19
|
(12) а макс(дата) - это что?
|
|||
15
Fragster
гуру
29.04.13
✎
17:19
|
короче, я сказал...
|
|||
16
GANR
29.04.13
✎
17:20
|
При условиЯх, что:
- данные в таблицу добавляются редко - считывание происходит часто отлично помогают и н д е к с и р о в а н и е |
|||
17
Ёпрст
29.04.13
✎
17:20
|
(14) это в каком месте у тебя ?
У автора - mydate |
|||
18
GANR
29.04.13
✎
17:20
|
+(16) в смысле, считывание с фильтром
|
|||
19
Fragster
гуру
29.04.13
✎
17:21
|
select mypole, pole1 From table inner join (select mypole, max(mydate) as mydate from Table) as table2 on table.mypole = table2.mytable and table.mydate = table2.mydate
|
|||
20
Fragster
гуру
29.04.13
✎
17:22
|
(16) в таких случаях отлично помагает денормализация
|
|||
21
GANR
29.04.13
✎
17:25
|
(20) агрессивное хирургическое вмешательство, то есть wiki:Денормализация ;)
|
|||
22
Ёпрст
29.04.13
✎
17:26
|
(19) дык не прокатит select mypole, max(mydate) as mydate from Table без group by
|
|||
23
Fragster
гуру
29.04.13
✎
17:28
|
(22) это майскуль, там много чего прокатывает
|
|||
24
Ёпрст
29.04.13
✎
17:28
|
(23) не верю чегой-то
|
|||
25
Fragster
гуру
29.04.13
✎
18:25
|
(24) да, прокатывает, но возвращает одну строку со случайным полем, если не сгруппировать. груп бай нужен.
|
|||
26
trad
29.04.13
✎
18:52
|
create index idx_pole_date on table (mypole,mydate)
еще не предлагали? |
|||
27
Fram
29.04.13
✎
18:55
|
Вообще есть подозрение, что 0.29с уходит на вывод этих 12000 строк, а не на обработку.
|
|||
28
Fragster
гуру
29.04.13
✎
18:58
|
(27)
EXPLAIN EXTENDED select pole1 From table where mypole = 'parametr' order by mydate desc limit 1 объяснит, что там так долго происходит, но дело в том, что 100 раз не надо это делать, можно же 1 раз |
|||
29
Fragster
гуру
29.04.13
✎
18:58
|
(19) + group by во внутренний запрос
|
|||
30
Fram
29.04.13
✎
19:01
|
(28) я ему сразу об этом написал
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |