Новости
Документация
Download
Webboard
Поиск
FAQ/ЧаВо
Обратная связь




MySQL.RU - Webboard



Вернуться
Select backward (Mike Maverick) 21/09/2002 - 18:51:10
      Re: Select backward (Bogdan) 21/09/2002 - 19:40:14
      Re: Select backward (Mike Maverick) 22/09/2002 - 00:17:34
      Re: Select backward (stalker) 23/09/2002 - 12:13:52
      Re: Select backward (Mike Maverick) 23/09/2002 - 17:37:18
      Re: Select backward (vi.k) 24/09/2002 - 08:44:01
      Re: Select backward (Mike Maverick) 24/09/2002 - 12:51:17
      Re: Select backward (vi.k) 26/09/2002 - 05:24:51
      Re: Select backward (vi.k) 26/09/2002 - 10:24:27
      Re: Select backward (walrus) 28/09/2002 - 10:59:46

> Original message text:
> From: Mike Maverick - 21/09/2002 - 18:51:10
> Subject:Select backward
> -----------------
> Голову сломал, чтобы просматривать таблицу в обратном направлении.
>
> Задача такая: есть таблица с проиндексированым текстовым полем.
> Как зная текущее значение поля, выбрать _предыдущую_ запись?
> Для следующей все понятно: "select keyname from table where keyname>'CurrentKeyName' order by KeyName ASC limit 10"
>
> Если так же делать для предыдущей, но "KN<Current DESC limit 10", то выбирается все с начала таблицы, а потом выводятся десять последних строк.
>
> Я сейчас нахожу предыдущую начальную букву:
> loop
> PrevChar = CurChar-1
> select count(*) where kn like 'PrevChar%'
> выйти если count(*)>0
> выйти если начало таблицы
> end
> и делаю запрос "select kn where kn>PreviousChar AND kn<CurrentKeyName order by kn DESC limit 10"
>
> однако на сильно больших таблицах, где строк на одну букву будет много, это тоже сломается.
>
> Что делать?
>


From: vi.k - 26/09/2002 - 10:24:27
Subject:Select backward
-----------------
Сгенерил на 20 млн. (на большее места не хватило и сил).

Запросы работают выполняются быстро (max 0.3 сек первый раз, последующие естественно гораздо быстрее).
У меня P166 MMX, 64 MB, ATA33 (для тех кто ещё помнит такие)
Поле name содержит md5()

1. 1 010 002 строк
CREATE TABLE `base` (
`id` int(11) NOT NULL auto_increment,
`name` char(32) NOT NULL default '',
PRIMARY KEY (`id`),
KEY `name` (`name`)
) TYPE=MyISAM

SELECT * FROM base WHERE name<'e' ORDER BY name DESC LIMIT 10

2. 22 871 940 строк
(не хватало места - поэтому без индекса по полю name)

CREATE TABLE `base_n` (
`id` int(11) NOT NULL auto_increment,
`name` char(32) NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=MyISAM

SELECT * FROM base_n WHERE id<15000000 ORDER BY id DESC LIMIT 10


Так что ищи багу в другом месте.

Я попробовал создать запрос для двух таблиц с ORDER BY. Вот тут вот оно и понеслось:

select base.name, base_n.name
from base, base_n
where base_n.id<10000000
limit 10

выполняется мгновенно, а вот запрос:

select base.name, base_n.name
from base, base_n
where base_n.id<10000000
order by base_n.id
limit 10

- пришлось убить MySQL, потому как не дождался.

В чём прикол? Есть у кого мысли? Для меня это не понятно. Судя по всему он сначала в памяти создаёт весь результат и только потом отсчитывает limit.

У меня mysql-max-4.0.3-win.
Кто бы на 3.23 ещё попробовал.



[Это сообщение - спам!]

Последние сообщения из форума

Уважаемые посетители форума MySQL.RU!
Убедительная просьба, прежде чем задавать свой вопрос в этом форуме, обратите внимание на разделы:
- ответы на наиболее часто задаваемые вопросы - FAQ
- раздел документация
- раздел поиск по сообщениям форума и документации
Также, старайтесь наиболее подробно указывать свою ситуацию (версию операционной системы, версию MySQL, версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
 Имя:
 E-mail:
 Тема:
 Текст:
Код подтверждения отправки: Code
4842



РЕКЛАМА НА САЙТЕ
  Создание сайтов | |