Главная страница


ru.cgi.perl

 
 - RU.CGI.PERL ------------------------------------------------------------------
 From : Andrey Sapozhnikov                   2:5020/400     27 Aug 2004  18:16:30
 To : Artem Chuprina
 Subject : Re: Программируем MySQL под CGI Perl
 -------------------------------------------------------------------------------- 
 
 Artem Chuprina пишет:
 
 > Igor Sigaev -> Serge Chervjakov  @ Wed, 25 Aug 2004 20:50:02 +0000 (UTC):
 > 
 >  IS> А если пользователей будет больше? А, самое главное, если будут "гонять"
 >  IS> данные чаще ? ...
 > 
 > Вообще на подобные задачи обычно применяется другой метод.  Поле,
 > естественно, делается не автоинкрементным, а просто числовым.  Таблица
 > блокируется, выбирается случайное число, проверяется, есть ли оно в
 > базе.  Если есть - выбирается следующее случайное число, и т.д.  Если
 > нет - используется это.  Запись вставляется, таблица разблокируется.
 > Разумно выбор случайного числа ограничить пятком итераций - если все
 > пять уже есть в базе, то либо база слишком набита (почти под завязку
 > диапазона чисел), либо генератор случайных чисел очень плохой (например,
 > стандартный от солярки - всего 15 бит), и тут лучше отвалить операцию,
 > чем зациклить сервер.
 
 Просто при проектировании БД надо тоже включать алгоритмическое мышление :)
 Hам нужно найти не запись, а "дырку" между записями. Можно изначально не
 удалять записи, а помечать их как освободившиеся. Hо это накладно если
 таковых записей очень много. Можно пользоваться генератором случайных чисел,
 но раз в год и палка стреляет и генератор в почти пустой базе пять раз
 попадает в очко. Можно и ключ сделать очень длинный и не повторяющийся
 и инкрементировать его до следующего цикла расширения нашей вселенной...
 Тоже некузяво :) Hо почему бы не добавить к записи N флажок
 указывающий на то, что запись N+1 свободна? Тогда поиск дырки сведется к:
 
 1. SELECT 1 FROM tbl WHERE id = 1 ?
    Если записи 1 нет - вставляем запись N = 1, если есть - переходим к п. 2
 2. SELECT id FROM tbl WHERE nextisfree = TRUE ORDER BY id LIMIT 1
    Переходим к вставке записи N = id + 1
 
 Для PostgreSQL:
 
 SELECT CASE
    WHEN NOT EXISTS (SELECT 1 FROM tbl WHERE id = 1) THEN
      1
    ELSE
      (SELECT id FROM tbl WHERE nextisfree = TRUE ORDER BY id LIMIT 1) + 1
 END;
 Вставка записи N:
 1. Проверяем есть ли запись N + 1
    Если есть - INSERT INTO tbl(id, nextisfree) VALUES(N, FALSE)
    иначе INSERT INTO tbl(id, nextisfree) VALUES(N, TRUE)
 2. Снимаем флажок nextisfree с записи N - 1
    UPDATE tbl SET nextisfree = FALSE WHERE id = N - 1
 
 Для PostgreSQL:
 
 INSERT INTO tbl(id, nextisfree) VALUES (:N,
    NOT EXISTS(SELECT 1 FROM tbl WHERE id = :N + 1));
 UPDATE tbl SET nextisfree = FALSE WHERE id = :N - 1;
 
 Все поиски исключительно быстрые при правильно созданных
 индексах. Потери памяти - 1 бит на запись (теоретически :))
 
 -- 
 Андрей
 --- ifmail v.2.15dev5.3
  * Origin: Demos online service (2:5020/400)
 
 

Вернуться к списку тем, сортированных по:

 Тема:    Автор:    Дата:  
 Программируем MySQL под CGI Perl   Igor Sigaev   25 Aug 2004 22:02:00 
 Re: Программируем MySQL под CGI Perl   Konstantin Tokar   25 Aug 2004 22:49:54 
 Re: Программируем MySQL под CGI Perl   Serge Chervjakov   25 Aug 2004 23:58:06 
 Re: Программируем MySQL под CGI Perl   Igor Sigaev   26 Aug 2004 00:50:02 
 Re: Программируем MySQL под CGI Perl   Konstantin Tokar   26 Aug 2004 00:59:16 
 Re: Программируем MySQL под CGI Perl   Igor Sigaev   26 Aug 2004 12:10:52 
 Re: Программируем MySQL под CGI Perl   Justin Finch-Fletchley   26 Aug 2004 01:24:52 
 Re: Программируем MySQL под CGI Perl   Igor Sigaev   26 Aug 2004 12:10:52 
 Пpогpаммиpуем MySQL под CGI Perl   Ivan Frolkov   26 Aug 2004 11:54:57 
 Re: Программируем MySQL под CGI Perl   Dmitri Shankov   26 Aug 2004 17:16:00 
 Re^5: заpаботок   Ivan Frolkov   26 Aug 2004 23:24:38 
 Re^5: заpаботок   Ivan Frolkov   27 Aug 2004 00:03:04 
 Re: Программируем MySQL под CGI Perl   Artem Chuprina   27 Aug 2004 11:58:14 
 Re: Программируем MySQL под CGI Perl   Andrey Sapozhnikov   27 Aug 2004 18:16:30 
 Re: Программируем MySQL под CGI Perl   Ivan Frolcov   27 Aug 2004 18:26:01 
 Re: Программируем MySQL под CGI Perl   Andrey Sapozhnikov   27 Aug 2004 18:36:26 
 Re: Программируем MySQL под CGI Perl   Andrei Protasovitski   27 Aug 2004 18:57:48 
 Re: Программируем MySQL под CGI Perl   Andrey Sapozhnikov   27 Aug 2004 19:29:33 
 Программируем MySQL под CGI Perl   Alexey Gradovtsev   29 Aug 2004 15:18:52 
 Re: Программируем MySQL под CGI Perl   Andrey Sapozhnikov   30 Aug 2004 17:03:48 
 Hа: Программируем MySQL под CGI Perl   Alexander V. Gaiduk   30 Aug 2004 18:09:45 
 Re: Hа: Программируем MySQL под CGI Perl   Andrey Sapozhnikov   30 Aug 2004 20:42:21 
 Re: Программируем MySQL под CGI Perl   Alexey Gradovtsev   31 Aug 2004 14:32:48 
 Re: Программируем MySQL под CGI Perl   Sergey Gernichenko   01 Sep 2004 10:26:02 
 Re: Программируем MySQL под CGI Perl   Andrey Sapozhnikov   01 Sep 2004 16:49:03 
 Re: Программируем MySQL под CGI Perl   Serge Chervjakov   02 Sep 2004 00:00:50 
 Re: Программируем MySQL под CGI Perl   Andrey Sapozhnikov   02 Sep 2004 00:47:28 
 Re: Программируем MySQL под CGI Perl   Boris Nesterov   01 Sep 2004 23:48:00 
 Re: Программируем MySQL под CGI Perl   Andrey Sapozhnikov   02 Sep 2004 01:18:17 
 Re: Программируем MySQL под CGI Perl   Dmitri Shankov   27 Aug 2004 23:37:00 
 Re: Программируем MySQL под CGI Perl   Serge Chervjakov   28 Aug 2004 03:56:11 
 Re: Программируем MySQL под CGI Perl   Artem Chuprina   28 Aug 2004 12:09:13 
 Hа: Программируем MySQL под CGI Perl   Alexander V. Gaiduk   26 Aug 2004 09:14:40 
 Re: Программируем MySQL под CGI Perl   Igor Sigaev   26 Aug 2004 12:10:53 
 Программируем MySQL под CGI Perl   Sergey Orlov   26 Aug 2004 08:53:27 
 Re: Программируем MySQL под CGI Perl   Igor Sigaev   26 Aug 2004 12:10:52 
 Re: Программируем MySQL под CGI Perl   Andrei Protasovitski   26 Aug 2004 14:54:52 
 Re: Программируем MySQL под CGI Perl   Serge Chervjakov   26 Aug 2004 17:34:23 
 Re: Программируем MySQL под CGI Perl   Igor Sigaev   26 Aug 2004 19:24:06 
 Re: Программируем MySQL под CGI Perl   Andrei Protasovitski   26 Aug 2004 19:58:17 
 Re: Программируем MySQL под CGI Perl   Serge Chervjakov   26 Aug 2004 20:01:23 
 Re: Программируем MySQL под CGI Perl   Dmitri Shankov   26 Aug 2004 23:35:00 
 Пpогpаммиpyем MySQL под CGI Perl   Yuri Pats   26 Aug 2004 16:31:36 
 Re: Программируем MySQL под CGI Perl   Artem Chuprina   27 Aug 2004 11:52:27 
Архивное /ru.cgi.perl/6577ab30d542.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional