• Выбрать СУБД между MySQL, PostgreSQL, MariaDB и MSSQL?

    KEKSOV
    @KEKSOV
    Похоже, что Вы забыли рассмотреть еще вот этот вариант: Percona Server is an enhanced, drop-in MySQL replacement. Для очень быстрого выполнения запросов необходимо воспользоваться special NoSQL interface called HandlerSocket. Да, и даже multi-master репликация там тоже есть.

    Несколько смущает PDO и желание сделать нагруженный сайт. Боюсь, что от этой прослойки придется отказаться сразу.
    Ответ написан
    3 комментария
  • Помогите подобрать системник для игр

    KEKSOV
    @KEKSOV
    Регулярно покупаю компы друзьям и знакомым. На Савеловский перестал ездить уже около пяти лет назад…
    В Ситилинке есть отличная услуга — сборка компа, всего 500 рублей.

    Итак, месяц назад брал следующую конфу для игрового компа с запасом:

    Корпуса на выбор (нужен для карты длинной более 300мм)

    1. БП 750W
    2. GIGABYTE GeForce GTX 680
    3. МБ GIGABYTE GA-Z77X-UD3H
    4. DDR3- 4x 4Гб
    5. SSD PLEXTOR M5 Pro PX-256M5P
    6. INTEL Core i7 3770, LGA 1155
    7. Корпус ATX AEROCOOL Templarius Ferrum

    Итого, с учетом услуги сборки 51 910 рублей
    Ответ написан
    Комментировать
  • Сконвертировать wmdk c windows server 2008 на VPS?

    KEKSOV
    @KEKSOV
    Как один из возможных вариантов —
    1. Заказываете установку VMWare ESXi 5.0 на сервер, соответствующий Вашим потребностям у OVH.com
    2. Конвертируете вашу VM либо так, либо так (зависит от ваших исходных условий)
    3. Запускаете Ваш образ на этом сервере, который полностью находится под вашим контролем.
    Ответ написан
    Комментировать
  • Разница в поведении FLOAT(M,D) в версиях 4.0 и 5.1?

    KEKSOV
    @KEKSOV
    Не спора ради, а сугубо для дележа информацией :)

    CREATE TABLE digits (
       float_col FLOAT DEFAULT NULL,
       decimal_col DECIMAL(20,18) DEFAULT NULL,
       double_col DOUBLE DEFAULT NULL
    ) ENGINE=INNODB DEFAULT CHARSET=cp1251
    
    INSERT INTO digits VALUES( ( @pi := 3.141592653589793238 ) / 3, @pi / 3, @pi / 3 );
    UPDATE digits SET float_col = float_col * 3 - @pi, decimal_col = decimal_col * 3 - @pi, double_col = double_col * 3 - @pi;
    


    После INSERT у меня в базе (5.5.24) получается
    float_col  decimal_col           double_col          
    1.0472     1.047197551196597746  1.0471975511965979

    После UPDATE… чертов колдун!.. в рот мне ноги!.. сам не ожидал…
    float_col        decimal_col           double_col             
    0.0000000874228  0.000000000000000000  4.440892098500626e-16

    Может все-таки DECIMAL? :)

    Видимо, секрет в том, что For DECIMAL columns, MySQL performs operations with a precision of 65 decimal digits, which should solve most common inaccuracy problems.
    Ответ написан
  • Разница в поведении FLOAT(M,D) в версиях 4.0 и 5.1?

    KEKSOV
    @KEKSOV
    в случае с decimal это маловероятно
    o_0?

    Если речь о том, чем поменять FLOAT(8,6) на просто FLOAT, то командная строка вот такая
    mysqldump | sed (меняем  FLOAT(8,6) на FLOAT ) | mysql
    если это винда, то лучше поставить cygwin. Простите, если мой совет из разряда «спасибо, кэп», просто из вашего вопроса не очень понятно, в чем именно состоит проблема с заменой FLOAT(8,6) на FLOAT
    Ответ написан
  • Разница в поведении FLOAT(M,D) в версиях 4.0 и 5.1?

    KEKSOV
    @KEKSOV
    Недавно столкнулся с похожей проблемой. Помогла вот эта статья. Если FLOAT в вашей базе используется для хранения «бизнес» значений (деньги и т.п.) то используйте тип DECIMAL. Во всех остальных случаях используйте DOUBLE.

    FLOAT нужно всячески избегать, т.к. он в большей степени подвержен ошибкам вычисления. «Забавно» выглядит ситуация, когда после добавления в базу целого значения при выборке этой же записи получаешь какие-то единицы в девятом знаке.
    Ответ написан
  • Какой выбрать миникомпьютер для дома?

    KEKSOV
    @KEKSOV
    В этом магазине есть интересные модели системных плат и готовых решений, которые подходят под ваше описание
    Ответ написан
    Комментировать
  • Оптимизация загрузки изображений по url

    KEKSOV
    @KEKSOV
    Для организации параллельной загрузки и обработки данных я использую pcntl_fork, главное контролируйте число одновременных воркеров, а то систему уложите. И, как сказал выше edogs
    Делайте curl, все скачки в одной сессии и включайте кэш днс в опциях курла хороший по времени. Уже одно это может на порядок улучшить результат.
    Ответ написан
    Комментировать
  • Вопрос во выбору ВУЗа для будущего программиста

    KEKSOV
    @KEKSOV
    По специальности я инженер системотехник (2201), получал образование в МИЭМе (сейчас это уже ВШЭ) и все еще работаю программистом :) на работе есть двое молодых коллег, закончивших МИЭМ в этом году, оба любят и умеют программировать. Но… если бы я сам не занимался самообразованием, так же как и мои коллеги, после ВУЗа остался бы только бесполезный диплом, как памятник напрасно потраченному времени.

    С учетом того, что инженерный диплом у Вас уже есть, расширьте свои познания при помощи онлайн курсов Если же второе образование для Вас идея фикс, то обратите свое внимание на немецкие или американские ВУЗы.
    Ответ написан
    2 комментария
  • Софт для моделирования?

    KEKSOV
    @KEKSOV
    В нескольких статьях про 3d принтеры видел упоминание meshlab.sourceforge.net/
    Ответ написан
    Комментировать
  • Где можно взять достоверные данные для валютных пар (форекс)?

    KEKSOV
    @KEKSOV Автор вопроса
    del
    Ответ написан
    Комментировать
  • Склейка двух таблиц по сложному условию

    KEKSOV
    @KEKSOV Автор вопроса
    dummy2002, ivnik, mib

    Спасибо, коллеги, ваши ответы подтолкнули мои мысли в правильном направлении. Если коротко, то идея состоит в создании временных таблиц, содержащих только нужный набор данных. До меня, вдруг, дошло, что мои тысячи случайных экспериментов можно очень красиво сгруппировать по времени события, т.к. они очень часто происходят в течении одной и той же минуты, это существенно снижает вычислительную нагрузку на БД. В итоге, удалось добиться снижения времени обработки с 5 минут, до 5 сек. :)

    Вот работающий код, буду признателен за критику и советы:
    -- После получения очередных суточных данных формируем временную таблицу, в которую попадают только те данные, которые попадают в диапазон необработанных случайных экспериментов
    SELECT @minRandomTimestamp := ( SELECT event_timestamp FROM random_events ORDER BY event_timestamp ASC LIMIT 1 );
    DROP TABLE IF EXISTS experiment_tmp;
    CREATE TEMPORARY TABLE experiment_tmp AS 
    	( -- Одна (старшая) запись из экспериментов за предыдущие сутки
    		SELECT event_timestamp, ex_value
    		FROM experiments
    		WHERE event_timestamp < @minRandomTimestamp 
    		ORDER BY event_timestamp DESC
    		LIMIT 1 
    	)
    	UNION 
    	( -- Все новые
    		SELECT event_timestamp, ex_value
    		FROM experiments 
    		WHERE event_timestamp >= @minRandomTimestamp 
    		ORDER BY event_timestamp ASC 
    	) 
    ;
    CREATE UNIQUE INDEX event_timestamp ON experiment_tmp (event_timestamp);
    
    -- Определяем время последнего известного эксперимента
    SELECT @maxExperimentTimestamp := ( SELECT event_timestamp FROM experiment_tmp ORDER BY event_timestamp DESC LIMIT 1 );
    
    -- Выбираем во временную таблицу УНИКАЛЬНЫЕ (по времени) события, для которых появились суточные данные. Записей в этой таблице будет не больше, чем минут в сутках
    DROP TABLE IF EXISTS random_events_tmp;
    CREATE TEMPORARY TABLE random_events_tmp AS 
    	SELECT event_timestamp, 0 prev_value_timestamp, 00000000000.0000 prev_value, 0 next_value_timestamp, 00000000000.0000 next_value
    	FROM random_events 
    	WHERE event_timestamp <= @maxExperimentTimestamp
    	GROUP BY event_timestamp
    ;
    CREATE UNIQUE INDEX pt ON random_events_tmp ( event_timestamp );
    
    -- Вычисляем время предыдущего эксперимента
    UPDATE random_events_tmp tr
    SET tr.prev_value_timestamp = ( 
    	SELECT event_timestamp 
    	FROM experiment_tmp te
    	WHERE te.event_timestamp <= tr.event_timestamp 
    	ORDER BY te.event_timestamp DESC
    	LIMIT 1
    );
    
    -- Проставляем величину предыдущего эксперимента
    UPDATE random_events_tmp tr
    LEFT JOIN experiment_tmp te ON te.event_timestamp = tr.prev_value_timestamp
    SET tr.prev_value = te.ex_value;
    
    -- Вычисляем время следующего эксперимента
    UPDATE random_events_tmp tr
    SET tr.next_value_timestamp = ( 
    	SELECT event_timestamp 
    	FROM experiment_tmp te
    	WHERE te.event_timestamp > tr.event_timestamp
    	ORDER BY te.event_timestamp ASC
    	LIMIT 1
    );
    
    -- Проставляем величину следующего эксперимента
    UPDATE random_events_tmp tr
    LEFT JOIN experiment_tmp te ON te.event_timestamp = tr.next_value_timestamp
    SET tr.next_value = te.ex_value;
    
    -- Переносим данные в таблицу случайных экспериментов. Это самый долгий запрос > 3 сек.
    UPDATE random_events f
    LEFT JOIN random_events_tmp tr ON f.event_timestamp = tr.event_timestamp
    SET 
    	  f.prev_value_timestamp = tr.prev_value_timestamp
    	, f.next_value_timestamp = tr.next_value_timestamp
    	, f.prev_value = tr.prev_value
    	, f.next_value = tr.next_value
    ;
    
    -- После этого происходит обработка данных на клиенте и обработанные записи удаляются из таблицы random_events
    
    Ответ написан
    Комментировать
  • Склейка двух таблиц по сложному условию

    KEKSOV
    @KEKSOV Автор вопроса
    UPDATE random_events
    SET random_events.next_event_timestamp = ( 
        SELECT MIN( event_timestamp )
        FROM experiment
        WHERE experiment.event_timestamp > random_events.event_timestamp
    )
    


    с MAX аналогично.

    P.S. А если сделать два поля в таблицe experiment


    Весьма проблематично. В процедуру импорта данных без стакана не влезешь, да и значения эти нужны только один раз в жизни каждого измерения, а записей сотни миллионов, это было бы слишком избыточно. На самом деле, я уже все придумал :) Сейчас дотестирую и выложу свое «решение» на поругание.
    Ответ написан
    Комментировать
  • Формат конфигурационных файлов, максимально удобных для редактирования?

    KEKSOV
    @KEKSOV
    JSON — для людей, XML — для компьютеров, ini — для Windows ;)
    Любой админ обязан знать все эти форматы, иначе, какой из него админ.
    Но ИМХО, так как json лаконичнее, чем XML и более универсален, чем ini — для конфигов самое оно.

    Как уже написали выше — обязательно нужна поддержка include.
    Ответ написан
    2 комментария
  • Учет пользователей, ведение статистики посещения?

    KEKSOV
    @KEKSOV
    Аппетит приходит во время еды. Это я к тому, что вряд ли Вам нужно просто считать пользователей (кстати, это не так уж и просто). Скорее всего, про каждого из них еще желательно сохранить максимально подробную инфу — куки, параметры запроса, переменные сессии, а потом еще захочется протоколировать кастомные события типа добавления товара в корзину и т.д. и т.п.

    В свое время я реализовывал следующую схему — есть несколько, вполне себе нагруженных, веб серверов, которые не стоит напрягать лишними запросами к БД. На каждом из этих серверов есть простая PHP библиотека, с помощью которой каждый запрос превращается во временный файл — все очень быстро и прозрачно. Далее, есть один выделенный сервер (вообще в офисе), который по cron через HTTP опрашивает веб серверы и забирает у них накопленные за минуты логи с инфой о запросах. После чего в своем темпе обрабатывает эти логи и записывает их в базу статистики, которая крутится на своем отдельном сервере, не имеющим ничего общего с продакшн серверами.

    Да, сырая база получается огромной, но никто не мешает ежедневно подсчитывать какие-нибудь агрегативные характеристики и удалять лишние записи.

    Готов поделиться исходниками своей подсистемы.
    Ответ написан
    1 комментарий
  • Провайдер email с API доступа к содержимому почтовых ящиков

    KEKSOV
    @KEKSOV
    Либо Вы чего-то не договариваете, либо Вам должна помочь библиотека PHP IMAP и, в частности, imap_savebody
    Ответ написан
  • Выбор web чата для интеграции на свой сайт

    KEKSOV
    @KEKSOV
    Мы пользуемся Mibwe, вполне себе зрелый продукт. Вот его список возможностей.
    Ответ написан
  • Как оптимизировать вот такой mysql запрос

    KEKSOV
    @KEKSOV
    Большой IN не айс… попробуйте сделать так, если, конечно, данные в IN всегда одни и те же.
    Итак, превращаем AND a.server_id IN (2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,28,30,32) в (порядок важен)
    AND a.server_id >1 AND a.server_id < 33 AND ( a.server_id < 23 OR a.server_id IN ( 28, 30, 32 ) )

    и еще попробуйте перенести проверку cloaked =0 в начало WHERE
    Ответ написан
  • Качественные наушники

    KEKSOV
    @KEKSOV
    В свое время, я влюбился в продукцию фирмы Sennheiser и с тех пор ей не изменяю ;) Вот список закрытых мониторных наушников на я.маркете
    Ответ написан
    Комментировать
  • Как сделать быструю группировку по дням и по часам в mysql?

    KEKSOV
    @KEKSOV
    Попробуйте следующий вариант — 1. Это для группировки по дням
    SELECT…
    FROM…
    GROUP BY UNIX_TIMESTAMP( поле с датой и временем ) DIV 24 * 3600

    2. Это для группировки по часам
    SELECT…
    FROM…
    GROUP BY UNIX_TIMESTAMP( поле с датой и временем ) DIV 3600

    Если все еще будет тормозить (скорее всего так и будет), то эти два поля нужно добавлять к таблице и строить по ним индекс
    Ответ написан
    Комментировать