![]() |
Внимание, важное сообщение: Дорогие Друзья!
В ноябре далекого 2001 года мы решили создать сайт и форум, которые смогут помочь как начинающим, так и продвинутым пользователям разобраться в операционных системах. В 2004-2006г наш проект был одним из самых крупных ИТ ресурсов в рунете, на пике нас посещало более 300 000 человек в день! Наша документация по службам Windows и автоматической установке помогла огромному количеству пользователей и сисадминов. Мы с уверенностью можем сказать, что внесли большой вклад в развитие ИТ сообщества рунета. Но... время меняются, приоритеты тоже. И, к сожалению, пришло время сказать До встречи! После долгих дискуссий было принято решение закрыть наш проект. 1 августа форум переводится в режим Только чтение, а в начале сентября мы переведем рубильник в положение Выключен Огромное спасибо за эти 24 года, это было незабываемое приключение. Сказать спасибо и поделиться своей историей можно в данной теме. С уважением, ваш призрачный админ, BigMac... |
|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » MySQL - Помогите оптимизировать запросы! |
|
MySQL - Помогите оптимизировать запросы!
|
Пользователь Сообщения: 78 |
Здравствуйте!
Будучи любителем, разрабатываю один продукт на MySQL, вставшая задачка разрослась далеко за любительский уровень... В числе прочего, в базе есть таблица, имеющая тенденцию сильно "распухать". Сейчас в нее добавляется порядка 2000-3000 новых записей в день, и это по идеологии проекта еще очень мало. Не исключено возрастание наполняемости до 100000-1000000 новых записей в день. Очень бы хотелось хранить эту таблицу (это полный ЛОГ событий и транзакций системы) в полном объеме. 1. Подскажите - не маразм ли это идеологически? Одна таблица с сотнями миллиардов записей и больше? 2. Встает очевидная проблема - уже сейчас. Время запроса к такой таблице. Сейчас у меня сделано любительски (я только начинаю осваивать ЭТО) - внутри цикла WHILE крутится сначала SELECT-запрос - это проверка уникальности новой записи. Если SELECT возвращает нулевой результат - происходит INSERT INTO. Мне подсказали, что делать внутри внешнего цикла каскад подобных запросов - дурь, что можно делать один запрос, а весь каскад проверок может сделать сама СУБД, за время в сотню раз меньше... Подскажите, реально ли это? Посоветуйте про какие операторы мануалы изучать?)) Или книжку хорошую... Использую РНР и чистый С, с акцентом на второй. 3. Какое типичное время одиночного запроса следует ожидать при размере таблицы допустим, в сотню миллиардов строк? При таком раскладе можно будет только под БД выделить отдельный XEON-сервер. С уважением, Евгений |
|
Отправлено: 10:53, 21-05-2015 |
Пользователь Сообщения: 78
|
Профиль | Отправить PM | Цитировать >>а можно в одном запросе послать не 1 INSERT а сразу кучу (15-20 и более)? »
>Можно, «INSERT INTO … SELECT … FROM …». Но, как я понимаю, Вам это не подойдёт. Кое в чем подойдет. Перспектива тратить на 1 вставку (или что угодно другое) аж целый запрос - ИМХО жирно. Полагаю, что СУБД прекрасно в состоянии отработать одновременно 20-30 фраз, которые можно впихать в один запрос. Поправьте, если я не прав... буду пробовать. >>Так вот, будет вставлено только две записи по первому и второму запросам. А по третьему и четвёртому — вставка записи будет отвергнута, поскольку недопустимо дублирование первичного ключа. Это проверил - работает на MySQL! Уже хорошо! Подскажите еще по одному - так таки если таблица будет иметь указанный чудовищный размер (сотни миллиардов строк) - будет ли разумным время ответа при формировании из нее небольшой выборки? Короче... Всем спасибо, я еще поизучаю вопрос, но в крайнем случае, буду использовать временную таблицу, размером до 100000, а при превышении этого размера данные будут переноситься в архивную таблицу, а временная очищаться... |
Отправлено: 22:51, 22-05-2015 | #11 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Необычный Сообщения: 4466
|
Профиль | Сайт | Отправить PM | Цитировать evpu, ну так, рекламы для facebook-presto
Чисто для покурить поискать слова и спрятанные за ними технологии. Цитата evpu:
Т.ч. тут как и везде - сперва определить потребность, потом смотреть, как этого крякозябла воплощать к жизни. Цитата evpu:
Исхожу из статьи, посвященному обработке гигабайтных баз данных под MapReduce что ли. Вывод был таков: если БД помещается в оперативку, или на SSD накопитель, то пользуйте PostgreSQL все нормально. А вот если оно туда не влазит, то это уже можно попробовать назвать BigData и думать над соотв. инструментом. Т.ч. если этим сотни миллиардов строк уложатся пусть в пусть 100Gb пространства, то SSD - снивилирует эту проблему. Бекап понятно ленты, диски. Но это уже другой вопрос. |
||
------- Отправлено: 02:23, 23-05-2015 | #12 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата evpu:
«Перспектива тратить на 1 вставку…» — это вполне нормально. Вспомните, что ядро базы должно при этом отработать все триггеры: каждого поля, всей записи, всех ключей, целостности базы. Цитата evpu:
|
||
Отправлено: 03:01, 23-05-2015 | #13 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать lxa85, небольшая выборка — это и значит небольшая выборка. Поиск должен будет вестись только по индексам, а не по:
Цитата evpu:
Цитата lxa85:
|
||
Отправлено: 03:18, 23-05-2015 | #14 |
Пользователь Сообщения: 78
|
Профиль | Отправить PM | Цитировать >>Сейчас у Вас сколько примерно строк?
За 100000 перевалило... Время запроса произвольной строки около 10-20мс. Извиняюсь за офтоп... Тут задачка для первокласника... Вот есть функция sscanf() производящая форматированный ввод из строки. Конкретнее пример: sscanf("192.168.1.1 root jgjFGHjhj 20000 0", "%s %s %s %s %s", ip, login, pass, listen, sqlport ); Приведенаня строка на самом деле - читается из файла.... Но "192.168.1.1 root jgjFGHjhj 20000 0" это неудобно, хотелось бы настроить форматированный ввод типа: "<ip>192.168.1.1</ip> <login>root</login> <pass>jgjFGHjhj</pass> <listen>20000</listen> <sqlport>0</sqlport>". Вот сохранять конфиг в таком виде - совершенно очевидно элементарно может sprintf(). Подскажите - как отформатировать подобный ввод? |
Отправлено: 20:59, 04-06-2015 | #15 |
Пользователь Сообщения: 78
|
Профиль | Отправить PM | Цитировать Добрый день!
По данной теме, пришел к решению, писать данные во временную таблицу temp_log, с последующим переносом в основную - stat_tab, именно она будет распухать. Для переноса соорудил конструкцию: INSERT INTO stat_tab SELECT * FROM temp_log WHERE `flag` = '1' ; (флаг=1 - копируются записи, прошедшие транзакционную обработку.) Вопрос - как соорудить команду, чтобы в процессе запроса помимо всего прочего, строка после вставки удалялась из temp_log? |
Отправлено: 11:44, 04-08-2015 | #16 |
Пользователь Сообщения: 75
|
Профиль | Отправить PM | Цитировать Доброго времени суток. Вопрос в к Вам как раз по поводу оптимизации текст по ссылке http://forum.oszone.net/thread-304322.html. И вообще где можно прочитать о зависимости аппаратного обеспечения на показатели тестирования какие будут идеальны. А какие уж очень ужасны.
|
Отправлено: 20:19, 26-08-2015 | #17 |
Пользователь Сообщения: 78
|
Профиль | Отправить PM | Цитировать Да, тут речь идет о хранимых процедурах, как раз оно! На таком решении и сделал!
Это вообще БОМБА! Когда создавал эту тему - и предполагал об этом подсознательно... Там и внутрисерверные циклы, и все что угодно. Только модифицировать пришлось: INSERT INTO stat_tab SELECT `id`=0,``...()весь длиннющий перечень...`` FROM temp_log WHERE `flag` = '1' ; TRUNCATE temp_log; И далее всякие COMMIT и т.п. Модификация потому, чтобы idшники пересчитывались в новую таблицу. |
Отправлено: 12:31, 14-09-2015 | #18 |
Ветеран Сообщения: 740
|
Профиль | Отправить PM | Цитировать |
Отправлено: 15:15, 14-09-2015 | #19 |
Пользователь Сообщения: 78
|
Профиль | Отправить PM | Цитировать Кстати да... Спасибо, поюзаю!
>>какие будут идеальны. А какие уж очень ужасны. Тут сказать сложно... Но например - я взял SSD, на его базе поднял linux-apache-mysql-php (LAMP), и там же исполняется бинарник написанный на С. Так скажем - отличие РАДИКАЛЬНОЕ от Денверов и девелоперских конфигураций - на порядок. Я как будто только успеваю отправить запрос - как мне выплевывает ответ, несмотря на кучу запросов. А конфигурация тем не менее проста и бесхитростна - core2duo 8400 3GHz, RAM 3GB, SSD накопитель. |
Последний раз редактировалось evpu, 14-09-2015 в 21:17. Отправлено: 15:34, 14-09-2015 | #20 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
PowerShell - [решено] Как оптимизировать | User001 | Скриптовые языки администрирования Windows | 1 | 10-04-2014 09:54 | |
CMD/BAT - помогите оптимизировать скрипт | dredre | Скриптовые языки администрирования Windows | 1 | 18-09-2011 05:10 | |
помогите оптимизировать систему | BABA ZINA | Выбор отдельных компонентов компьютера и конфигурации в целом | 6 | 07-01-2011 22:19 | |
Помогите оптимизировать офис. Голова пухнит | Joni | Флейм | 11 | 19-08-2009 11:55 | |
CMD/BAT - Помогите оптимизировать код | n4! | Скриптовые языки администрирования Windows | 3 | 08-04-2008 05:59 |
|