Модераторы: skyboy

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Правильный запрос! Пытаемся составить грамотно запрос! 
V
    Опции темы
JavaCraft
Дата 20.4.2007, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 8.2.2007

Репутация: 0
Всего: 1



Цитата(SergeBS @  18.4.2007,  16:33 Найти цитируемый пост)
Маленькое упражнение в арифметике: пусть есть 100 юзеров, работают 24 часа в сутки 365 дней в году, вставляют по 10 записей в минуту. Вопрос - когда иссякнет AUTO_INCREMENT у int / bigint?


При 10000 пользователей (что маловато будет для Internet-ориентированной системы) INTEGER иссякнет через 5 лет.
Если они творческие личности и склонны к частым изменениям записей(контента), то автоинкремент иссякнет очень быстро. Использование везде и всюду BIGINT снижает производительность.


Цитата(SergeBS @  18.4.2007,  16:33 Найти цитируемый пост)
А попытки заполнять "дыры" у этих полей - верный способ заиметь проблемы потому, что если эту "дыру" вычислять, то любые 2 юзера получат одно и то же значение "дыры", пока ее кто-то не заполнит. И соответственно "заполнят" ее по очереди. А с учетом commit/rollback все становится еще печальней. И никакие "специальные" поля от этого не спасут по причинам, аналогичным тем, что возникают у FoxPro, например, при попытке соорудить на нем многопользовательское приложение.


Если конкретный идентификатор резервировать за конкретным юзером, то они никак не смогут одновременно использовать одно и тоже значение. Кроме того это резервирование выполняется в целях контроля и безопасности, для учета кто и что вводил.


Цитата(SergeBS @  18.4.2007,  16:33 Найти цитируемый пост)
Если кто-то таки желает избавиться от "дыр", то единственное решение - отрубить всех юзеров на время этой процедуры и накатать соответствующие скрипты, чтобы сам сервер перемещал на "дыру" следующую за ней запись и т.д. Привда при больших таблицах - успеете уйти к окончанию работы скрипта на пенсию 


Проще, повесить на триггер AFTER DELETE сохранение удаленного идентификатора в небольшой таблице резерва, а потом, если резерв есть, его оттуда брать. Если в момент сохранения произойдет сбой или атомная война, то максимум что произойдет это потеря одного единственного удаленного значения, что никак не скажется на базе в целом.



PM MAIL   Вверх
SergeBS
Дата 23.4.2007, 08:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

Репутация: 2
Всего: 22



JavaCraft
Цитата
При 10000 пользователей 

Цитата
Если конкретный идентификатор резервировать за конкретным юзером

А ежели подумать? Здравый смысл применить?

Цитата
Проще, повесить на триггер AFTER DELETE сохранение удаленного идентификатора в небольшой таблице резерва,

Еще раз: любая попытка вычисления/получения уникального значения идентификатора из приложения, а не путем формирования его сервером, ПРИНЦИПИАЛЬНО источник проблем. Хотя бы по той причине, что приложение не может определить (не)успешность этой операции и произвести откат.


PM MAIL   Вверх
JavaCraft
Дата 3.5.2007, 00:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 8.2.2007

Репутация: 0
Всего: 1



Цитата(SergeBS @  23.4.2007,  08:12 Найти цитируемый пост)
Еще раз: любая попытка вычисления/получения уникального значения идентификатора из приложения, а не путем формирования его сервером, ПРИНЦИПИАЛЬНО источник проблем. Хотя бы по той причине, что приложение не может определить (не)успешность этой операции и произвести откат.

О приложении и речи нет. Всё делает исключительно сервер.
Поле автоинкрементное, но если вставлять запись с инициализированным не NULL значением, то MySQL не выполняет автоинкремент, а использует то значение, которое ему дали.
Это значение берется из таблицы резерва, которая хранится также на сервере.
Выполняет все это хранимая процедура, тоже на сервере. Такая же процедура сбрасывает идентификаторы в резерв, после удаления записей.
Пользователь имеет доступ к базе исключительно через хранимые процедуры и ничем не может навредить базе.

А Вы, как я полагаю, предпочитаете давать юзеру права выполнять SQL запросы INSERT,DELETE,UPDATE... из приложения.  smile 





PM MAIL   Вверх
Бонифаций
Дата 3.5.2007, 00:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 827
Регистрация: 15.9.2005
Где: Brisbane

Репутация: 20
Всего: 40



Цитата(JavaCraft @  20.4.2007,  18:20 Найти цитируемый пост)
Использование везде и всюду BIGINT снижает производительность.


Цитата(JavaCraft @  3.5.2007,  00:36 Найти цитируемый пост)
то MySQL не выполняет автоинкремент, а использует то значение, которое ему дали.
Это значение берется из таблицы резерва, которая хранится также на сервере.


Вы полагаете выборка значения из таблицы будет быстрее операции с бигинтом?

Добавлено через 1 минуту и 40 секунд
Кроме того при массированом использовании триггеров с хранимками говорить о производительности вообще трудно. Это же интерпретируемые языки которые будут дергаться при любом изменении записи.

Добавлено через 4 минуты и 51 секунду
Цитата(JavaCraft @  20.4.2007,  18:20 Найти цитируемый пост)
При 10000 пользователей (что маловато будет для Internet-ориентированной системы) INTEGER иссякнет через 5 лет.


10000 одновременно работающих пользователей  smile ? в какой операционке и на каком железе вы собираетесь получить такую нагрузку?

Добавлено через 7 минут и 9 секунд
PS Если вам мало int/bigint - используйте функцию UUID(). Она  для таких целей и создана


--------------------
 Бонифаций.
 
PM MAIL ICQ Skype GTalk Jabber YIM   Вверх
JavaCraft
Дата 3.5.2007, 01:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 8.2.2007

Репутация: 0
Всего: 1



Цитата(Бонифаций @  3.5.2007,  00:47 Найти цитируемый пост)
Вы полагаете выборка значения из таблицы будет быстрее операции с бигинтом?

В нормальных условиях не быстрее, но BIGINT требует в два раза больше дисковой и оперативной памяти. 
Кроме того, сказали А, должно сказать и В. Во всех таблицах где мы ссылаемся на эту таблицу нам придется перейти на BIGINT. Про индексы забыли? Они тоже удвоятся.
Если памяти не хватит, то таки ДА будет медленнее. Для меня лишние 32Гиг на каждую таблицу и каждое ссылочное поле, приемлемы только в случае если другого пути нет.
А выборка из маленькой таблицы, к томуже закэшированной в памяти, выполняется очень быстро.


Цитата(Бонифаций @  3.5.2007,  00:47 Найти цитируемый пост)
10000 одновременно работающих пользователей  smile ? в какой операционке и на каком железе вы собираетесь получить такую нагрузку?

На любом, хоть на P1 133Mhz 64RAM. Тут не в нагрузке дело и не в одновременности, а в количестве и качестве "писателей". Достаточно просто раз в 1-10 секунд подключаться и добавлять запись.

Цитата(Бонифаций @  3.5.2007,  00:47 Найти цитируемый пост)
Кроме того при массированом использовании триггеров с хранимками говорить о производительности вообще трудно. Это же интерпретируемые языки которые будут дергаться при любом изменении записи.

Ну не при любом, а при вполне конкретном. AFTER DELETE, BEFORE INSERT
А соотвествующие SP вызываются по мере необходимости. И они компилируются один раз, а не интерпретируются каждый раз, если только Вы под интерпретацией не имеете в виду внутреннюю реализацию скомпилированного кода. Но это же мелочи. Куда тяжелее и дольше взаимодействовать с внешней бизнес логикой.

Это сообщение отредактировал(а) JavaCraft - 3.5.2007, 01:50
PM MAIL   Вверх
SergeBS
Дата 3.5.2007, 08:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

Репутация: 2
Всего: 22



JavaCraft
Цитата
Для меня лишние 32Гиг на каждую таблицу и каждое ссылочное поле, приемлемы только в случае если другого пути нет.

Немножко посчитаем. Int - 8, bigint - 16 байт. 32 Гб/8 = 4 Г записей. Если в записи 100 байт - таблица - 400 Гб. 10 таблиц - 4 Тб. Ну в 2 раза меньше, если поле просто добавить. Непринципиально. 
Может сказочки в другом месте будешь рассказывать?

Цитата
И они компилируются один раз, а не интерпретируются каждый раз, если только Вы под интерпретацией не имеете в виду внутреннюю реализацию скомпилированного кода. Но это же мелочи. Куда тяжелее и дольше взаимодействовать с внешней бизнес логикой.

Опять бред. От незнания основ.

PM MAIL   Вверх
JavaCraft
Дата 3.5.2007, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 8.2.2007

Репутация: 0
Всего: 1



Цитата(SergeBS @  3.5.2007,  08:39 Найти цитируемый пост)
Немножко посчитаем. Int - 8, bigint - 16 байт. 32 Гб/8 = 4 Г записей. Если в записи 100 байт - таблица - 400 Гб. 10 таблиц - 4 Тб. Ну в 2 раза меньше, если поле просто добавить. Непринципиально. 
Может сказочки в другом месте будешь рассказывать?


И что вы уже этим хотели сказать?
32Гб это увеличение расхода памяти на 4Г проиндексированных записей состоящих из 1 поля. Поуважительнее плиз, просьба не хамить.


Цитата(SergeBS @  3.5.2007,  08:39 Найти цитируемый пост)
Опять бред. От незнания основ.

Такие реплики признак непрофессионализма, а мнение непрофессионала меня не интересует.
PM MAIL   Вверх
SergeBS
Дата 3.5.2007, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

Репутация: 2
Всего: 22



JavaCraft
Если не понял, то объясняю: я прикинул размер БД, у которой добавление 1 поля int или изменение с int на bigint увеличивает размер таблицы на 32 Гб. Как автор описал.

Цитата
32Гб это увеличение расхода памяти на 4Г проиндексированных записей состоящих из 1 поля.

А нука подробнее, пример в студию. Как это вычислялось и что за таблица? Только не надо уползать в сторону полнотекстового поиска  и т.п. Речь идет об int/bigint.

PM MAIL   Вверх
Бонифаций
Дата 3.5.2007, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 827
Регистрация: 15.9.2005
Где: Brisbane

Репутация: 20
Всего: 40



2JavaCraft:
"Валик-джан, я тебе один умный вещь скажу, только ты не обижайся", 

- Вы говорите о миллиардах записей, и приводите P1 133Mhz 64RAM в качестве железа. 
- Вас страшит bigint, хотя заполнить обычный unsigned int автоинками еще никому не удавалось. По крайней мере на моей памяти.  
- вы говорите о компиляции хранимок/триггеров. Хотя на самом деле они хранятся в в таблице mysql.proc просто как строки, а кешируются как деревья, и исполняются обходом аттрибутного дерева в памяти. Это чистой воды интерпретация. Иначе вам придется называть и питон и перл компилируемыми языками.

Не обижайтесь, но Вы теоретик.



Это сообщение отредактировал(а) Бонифаций - 3.5.2007, 13:57


--------------------
 Бонифаций.
 
PM MAIL ICQ Skype GTalk Jabber YIM   Вверх
JavaCraft
Дата 3.5.2007, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 8.2.2007

Репутация: 0
Всего: 1



Цитата(Бонифаций @  3.5.2007,  13:55 Найти цитируемый пост)
- Вы говорите о миллиардах записей, и приводите P1 133Mhz 64RAM в качестве железа. 
-

На той железке у меня был Web-сайт и летала база с таблицами 8000000 записей, правда всё было на MyISAM, только для чтения и посетителей не много. Этот гратеск не для показа на чем будет крутиться эта база (такое железо сейчас трудно найти), а чтобы было понятно, что от нагрузки в единицу времени тут ничего не зависит. 

Цитата(Бонифаций @  3.5.2007,  13:55 Найти цитируемый пост)
Вас страшит bigint, хотя заполнить обычный unsigned int автоинками еще никому не удавалось. По крайней мере на моей памяти.  

В моей задаче UNSIGNED INT будет заполнен очень быстро (чисто теоретически).

Цитата(Бонифаций @  3.5.2007,  13:55 Найти цитируемый пост)
Не обижайтесь, но Вы теоретик.

не обижаюсь

А вообще парню нужно было решение как заполнить пробелы в идентификаторах и я его кажется дал. Причем это лучшее решение в данной постановке вопроса. Я не утверждаю что оно лучше чем автоинкремент, это несравнимые и совсем разные вещи.

Это сообщение отредактировал(а) JavaCraft - 3.5.2007, 16:55
PM MAIL   Вверх
SergeBS
Дата 4.5.2007, 07:53 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

Репутация: 2
Всего: 22



Бонифаций
JavaCraft не теоретик, а обычный "WEB-дизайнер", поперший в СУБД. Не первый и не последний.

JavaCraft
Цитата
На той железке у меня был Web-сайт и летала база с таблицами 8000000 записей, 

В классическом понимании это не база, а куча разрозненных таблиц. На чем и попадаются, пытаясь кислое с красным сравнивать. 

Цитата
А вообще парню нужно было решение как заполнить пробелы в идентификаторах и я его кажется дал.

А вообще если в чем-то не разбираешься совсем, так лучше не советовать. Поскольку получается "лучшее лекарство от насморка - гильотина".
PM MAIL   Вверх
JavaCraft
Дата 4.5.2007, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 8.2.2007

Репутация: 0
Всего: 1



Цитата(SergeBS @  4.5.2007,  07:53 Найти цитируемый пост)
Цитата
А вообще парню нужно было решение как заполнить пробелы в идентификаторах и я его кажется дал.
А вообще если в чем-то не разбираешься совсем, так лучше не советовать. Поскольку получается "лучшее лекарство от насморка - гильотина". 


Ну ну. Можно подумать твои посты по всем форумам можно назвать содержательными... 
Везде, где твою писанину встречаю, вижу только хамство и обсерательство.
Подумай на досуге, может тебе к доктору нужно сходить?
PM MAIL   Вверх
SergeBS
Дата 4.5.2007, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

Репутация: 2
Всего: 22



JavaCraft
Я не хамлю. Нет такой привычки. Просто я на основании своего опыта достаточно быстро определяю что из себя представляет собеседник. И вместо фантазирования использую факты и доки. В отличие от.
Когда новичок предлагает свое "гениальное" решение, которое ПРИНЦИПИАЛЬНО неверно и приведет к проблеме, то этот новичок неправ по крайней мере дважды.
PM MAIL   Вверх
JavaCraft
Дата 4.5.2007, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 8.2.2007

Репутация: 0
Всего: 1



Цитата(SergeBS @  4.5.2007,  14:37 Найти цитируемый пост)
Когда новичок предлагает свое "гениальное" решение

Это решение не ново, широко известно и оно не моё.
PM MAIL   Вверх
Страницы: (3) Все 1 2 [3] 
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.1046 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.