Имя пользователя:
Пароль:
 | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » MySQL - Помогите оптимизировать запросы!

Ответить
Настройки темы
MySQL - Помогите оптимизировать запросы!

Пользователь


Сообщения: 78
Благодарности: 5

Профиль | Отправить PM | Цитировать


Здравствуйте!

Будучи любителем, разрабатываю один продукт на MySQL, вставшая задачка разрослась далеко за любительский уровень...

В числе прочего, в базе есть таблица, имеющая тенденцию сильно "распухать". Сейчас в нее добавляется порядка 2000-3000 новых записей в день, и это по идеологии проекта еще очень мало. Не исключено возрастание наполняемости до 100000-1000000 новых записей в день. Очень бы хотелось хранить эту таблицу (это полный ЛОГ событий и транзакций системы) в полном объеме.

1. Подскажите - не маразм ли это идеологически? Одна таблица с сотнями миллиардов записей и больше?
2. Встает очевидная проблема - уже сейчас. Время запроса к такой таблице. Сейчас у меня сделано любительски (я только начинаю осваивать ЭТО) - внутри цикла WHILE крутится сначала SELECT-запрос - это проверка уникальности новой записи. Если SELECT возвращает нулевой результат - происходит INSERT INTO. Мне подсказали, что делать внутри внешнего цикла каскад подобных запросов - дурь, что можно делать один запрос, а весь каскад проверок может сделать сама СУБД, за время в сотню раз меньше...
Подскажите, реально ли это? Посоветуйте про какие операторы мануалы изучать?)) Или книжку хорошую... Использую РНР и чистый С, с акцентом на второй.

3. Какое типичное время одиночного запроса следует ожидать при размере таблицы допустим, в сотню миллиардов строк? При таком раскладе можно будет только под БД выделить отдельный XEON-сервер.

С уважением, Евгений

Отправлено: 10:53, 21-05-2015

 

Пользователь


Сообщения: 78
Благодарности: 5

Профиль | Отправить PM | Цитировать


>>а можно в одном запросе послать не 1 INSERT а сразу кучу (15-20 и более)? »
>Можно, «INSERT INTO … SELECT … FROM …». Но, как я понимаю, Вам это не подойдёт.

Кое в чем подойдет. Перспектива тратить на 1 вставку (или что угодно другое) аж целый запрос - ИМХО жирно. Полагаю, что СУБД прекрасно в состоянии отработать одновременно 20-30 фраз, которые можно впихать в один запрос. Поправьте, если я не прав... буду пробовать.

>>Так вот, будет вставлено только две записи по первому и второму запросам. А по третьему и четвёртому — вставка записи будет отвергнута, поскольку недопустимо дублирование первичного ключа.

Это проверил - работает на MySQL! Уже хорошо!

Подскажите еще по одному - так таки если таблица будет иметь указанный чудовищный размер (сотни миллиардов строк) - будет ли разумным время ответа при формировании из нее небольшой выборки?

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

Отправлено: 22:51, 22-05-2015 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для lxa85

Необычный


Contributor


Сообщения: 4466
Благодарности: 995

Профиль | Сайт | Отправить PM | Цитировать


evpu, ну так, рекламы для facebook-presto
Чисто для покурить поискать слова и спрятанные за ними технологии.
Цитата evpu:
Короче... »
Beeline AFAIK хранит информацию до полугода/года. Дальнейший запрос на архивные данные - через заявку.
Т.ч. тут как и везде - сперва определить потребность, потом смотреть, как этого крякозябла воплощать к жизни.
Цитата evpu:
Подскажите еще по одному - так таки если таблица будет иметь указанный чудовищный размер (сотни миллиардов строк) - будет ли разумным время ответа при формировании из нее небольшой выборки? »
Если эта таблица поместиться на быстродействующую память, то будет. А нет-нет.
Исхожу из статьи, посвященному обработке гигабайтных баз данных под MapReduce что ли.
Вывод был таков: если БД помещается в оперативку, или на SSD накопитель, то пользуйте PostgreSQL все нормально. А вот если оно туда не влазит, то это уже можно попробовать назвать BigData и думать над соотв. инструментом.
Т.ч. если этим сотни миллиардов строк уложатся пусть в пусть 100Gb пространства, то SSD - снивилирует эту проблему.
Бекап понятно ленты, диски. Но это уже другой вопрос.

-------
- Я не разрешаю тебе быть плохой! Потому что плохие люди совершают плохие поступки. А это нехорошо!
(Из наставлений 5 летней девочки своей младшей сестре)


Отправлено: 02:23, 23-05-2015 | #12


Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


Цитата evpu:
Кое в чем подойдет. Перспектива тратить на 1 вставку (или что угодно другое) аж целый запрос - ИМХО жирно. Полагаю, что СУБД прекрасно в состоянии отработать одновременно 20-30 фраз, которые можно впихать в один запрос. Поправьте, если я не прав... буду пробовать. »
Тот синтаксис предназначен для добавления записей в таблицу, извлечённых из другой таблицы. И диалект я привёл, разумеется, для Jet.

«Перспектива тратить на 1 вставку…» — это вполне нормально. Вспомните, что ядро базы должно при этом отработать все триггеры: каждого поля, всей записи, всех ключей, целостности базы.

Цитата evpu:
Подскажите еще по одному - так таки если таблица будет иметь указанный чудовищный размер (сотни миллиардов строк) - будет ли разумным время ответа при формировании из нее небольшой выборки? »
Сейчас у Вас сколько примерно строк?

Отправлено: 03:01, 23-05-2015 | #13


Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


lxa85, небольшая выборка — это и значит небольшая выборка. Поиск должен будет вестись только по индексам, а не по:
Цитата evpu:
сотни миллиардов строк »
Цитата lxa85:
100Gb »
И извлекаться будут не все эти объёмы. Хотя, как я понимаю, даже три longint (Jet) или bigint (MS SQL) плюс один double — размер строки основной таблицы, если действительно «место» и «человек» могут повторяться и обязаны быть вынесены в отдельные таблицы, займёт несколько больше 100 Gb.

Отправлено: 03:18, 23-05-2015 | #14


Пользователь


Сообщения: 78
Благодарности: 5

Профиль | Отправить 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
Благодарности: 5

Профиль | Отправить 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
Благодарности: 0

Профиль | Отправить PM | Цитировать


Доброго времени суток. Вопрос в к Вам как раз по поводу оптимизации текст по ссылке http://forum.oszone.net/thread-304322.html. И вообще где можно прочитать о зависимости аппаратного обеспечения на показатели тестирования какие будут идеальны. А какие уж очень ужасны.

Отправлено: 20:19, 26-08-2015 | #17


Пользователь


Сообщения: 78
Благодарности: 5

Профиль | Отправить 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


Аватара для User001

Ветеран


Сообщения: 740
Благодарности: 116

Профиль | Отправить PM | Цитировать


Цитата evpu:
Посоветуйте про какие операторы мануалы изучать?)) »
Вроде, про профилировку никто еще не сказал. Сюда и далее по поиску.

Отправлено: 15:15, 14-09-2015 | #19


Пользователь


Сообщения: 78
Благодарности: 5

Профиль | Отправить 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



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » MySQL - Помогите оптимизировать запросы!

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
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




 
Переход