Ответы пользователя по тегу MySQL
  • Проблема при переходе с MySQL на MySQLi

    KEKSOV
    @KEKSOV
    Простите, но в Вашем оригинале нет вызова функции mysqli_result. Приведите полный фрагмент нового кода.
    Ответ написан
  • Как сохранить соединение ssh?

    KEKSOV
    @KEKSOV
    У меня на работе есть SSHD на сервере и рабочая машинка под виндой. Иногда мне нужно заходить из дома на работу по RDP, а иногда с работы домой по RDP.

    Для начала, парочка удобных алиасов:

    alias ssh='ssh -o TCPKeepAlive=no -o ServerAliveInterval=15 -o ServerAliveCountMax=10'
    alias mars='ssh root@EXTERNAL_IP'

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

    while true; do mars -L 64012:192.168.200.36:3389 -R 64012:10.11.12.108:3389 -N; done

    Если не нужен проброс портов, то просто их не пишите. Уже несколько лет успешно использую такую конфигурацию - разрывов нет ;) Пробовал autossh, но что-то у меня с ним не получилось, иногда приходилось делать kill -9
    Ответ написан
    Комментировать
  • Кроссплатформенное приложение + web сервис + синхронизация баз этого всего. На чем все это писать?

    KEKSOV
    @KEKSOV
    Как вариант для построения кросс платформенного приложения - Chromium Embeded в качестве движка + ExtJS для отрисовки интерфейса. В приложение встраивается web сервер или используется какой-то готовый отдельно стоящий продукт.
    Ответ написан
    Комментировать
  • Как в mysql правильно реализовать выборку и поиск нужных записей по данным из массива?

    KEKSOV
    @KEKSOV
    Нужно сравнить два вариант и выбрать наиболее быстрый из них:
    1. Использовать IN. Так как есть ряд ограничений на его использование в MySQL, необходимо опытным путем подобрать оптимальное число аргументов в списке IN и делать несколько запросов.
    2. Более правильный (на мой взгляд) вариант это использовать prepared выражение: создаете такое выражение и в цикле по вашему массиву выполняете его, должно работать очень быстро.
    Ответ написан
    Комментировать
  • Как реализовать парсер товаров из интернет магазина средствами PHP?

    KEKSOV
    @KEKSOV
    Здесь подробно обсуждался парсинг. Как сохранить в БД это другой, но тоже решаемый вопрос, многое зависит от вашей конкретно задачи.
    Ответ написан
    Комментировать
  • Объясните странное поведение INSERT в mysql_query?

    KEKSOV
    @KEKSOV
    А часом у Вас на поле ident нет ли уникального индекса? А то Вы записываете три записи с одинаковым значением $idea_count — в вашем случае 3.

    Надеюсь приведенный фрагмент кода это просто тест, а не кусок из вашего проекта? В противном случае это одно большое отверстие в безопасности сайта ;) Переходите на использование mysqli и prepared выражений. Это резко повысит скорость выполнения запросов и избавит проект от большого числа проблем с безопасностью.
    Ответ написан
    4 комментария
  • Разница в поведении 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 Автор вопроса
    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
    Аппетит приходит во время еды. Это я к тому, что вряд ли Вам нужно просто считать пользователей (кстати, это не так уж и просто). Скорее всего, про каждого из них еще желательно сохранить максимально подробную инфу — куки, параметры запроса, переменные сессии, а потом еще захочется протоколировать кастомные события типа добавления товара в корзину и т.д. и т.п.

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

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

    Готов поделиться исходниками своей подсистемы.
    Ответ написан
    1 комментарий
  • Как оптимизировать вот такой 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
    Ответ написан
  • Как сделать быструю группировку по дням и по часам в mysql?

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

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

    Если все еще будет тормозить (скорее всего так и будет), то эти два поля нужно добавлять к таблице и строить по ним индекс
    Ответ написан
    Комментировать
  • Копирование большого объёма данных из одной таблицы в другую

    KEKSOV
    @KEKSOV
    На офсайте есть много полезного на эту тему. И Google по запросу mysql speedup insert select может помочь

    Если будете использовать InnoDB, то добавьте в заголовок еще SET autocommit=0; а после инсерта добавьте COMMIT;
    Ответ написан
    Комментировать
  • В каком формате хранить метку времени?

    KEKSOV
    @KEKSOV
    В дополнении к вышесказанному:

    timestamp — время от начала эпохи, всегда указывается в UTC. При получении результатов запроса, например при помощи FROM_UNIXTIME( timestam поле ) учитывается временная зона сервера или указанная при помощи SET time_zone в рамках текущего соединения. Пример использования — у Вас чат-сервер или сервер по отслеживанию биржевых котировок, в базе для каждого события хранится timestamp события и, в зависимости от часовых поясов пользователей, можно отобразить их местное время этого события, просто указав в запросе соответствующую временную зону.

    datetime не подвержен влиянию текущей временной зоны и более нагляден.

    Что касается индексирования этих двух типов, то оно одинаково эффективно.

    Еще инфа по теме была на Хабре.
    Ответ написан
    Комментировать
  • Репликация данных MySQL

    KEKSOV
    @KEKSOV
    Безкостыльный вариант это OpenVPN туннель с компа, где работает мастер, на комп, где работает второй сервер. Тогда они будут в одной приватной сети и видеть друг друга напрямую по IP-адресу
    Ответ написан
    5 комментариев
  • Почему тормозит mysql при insert и update?

    KEKSOV
    @KEKSOV
    Пожалуй, вот хорошая статья о проблемах больших таблиц.

    И с чего, вдруг, такая «боязнь» партиционирования? Вот живой пример из подсистемы статистики на сайте одного из моих заказчиков. За год там накопилось около 5.000.000 записей, все прекрасно работает и ничего не тормозит:

    SET NAMES cp1251;
    DROP TABLE IF EXISTS stat_event;
    CREATE TABLE stat_event
    (
    -- Общие поля
        `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'Ключ записи',
        `oid` BIGINT UNSIGNED NOT NULL DEFAULT '0' COMMENT 'ID Объекта',
        `created` DATETIME NULL COMMENT 'Время создания записи',
        `changed` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP NOT NULL COMMENT 'Время последнего изменения записи',
        `uid` BIGINT UNSIGNED NOT NULL DEFAULT '0' COMMENT 'ID пользователя, сделавшего последние изменения',
        `comments` BLOB COMMENT 'Примечание',
    
    -- Поля объекта
        `event_time` DATETIME NOT NULL COMMENT 'UNIX timestamp события (может отличаться от значения в поле created)',
        `event_type` ENUM (
              'UNKNOWN'     -- тип события не определен
            , 'INDEX'       -- загрузка заглавной страницы
            , 'PRODUCT'     -- загрузка страницы с описанием товара
            , 'CATEGORY'    -- загрузка страницы с описанием категории
            , 'GROUP'       -- загрузка страницы с описанием группы категорий
            , 'SITEMAP'     -- загрузка роботом карты сайта
            , 'ORDER'       -- оформление заказа через сайт
            , 'OTHER'       -- прочее событие
            , '404'         -- страница не найдена
            , '301'         -- редирект страницы
            , 'VIEW_CART'   -- просмотр корзины заказов
            , 'OFFLINE_MSG' -- Отправка сообщения через Форму пожаловаться
            , 'ONLINE_MSG'  -- Отправка сообщения через Форма помощь онлайн
            , 'PAGE_LOAD'   -- Страница загружена в браузер
        ) NOT NULL DEFAULT 'UNKNOWN' COMMENT 'Тип события',
        `server_name` ENUM('0','foo.ru','boo.ru','goo.ru') NOT NULL DEFAULT '0' COMMENT 'Сервер, на котором произошло событие',
        `shop_object_id` BIGINT UNSIGNED DEFAULT 0 COMMENT 'идентификатор объекта магазина, если событие связано с ним',
        `request_uri` TEXT NULL COMMENT 'строка запроса',
        `query_string` TEXT NULL COMMENT 'параметры запроса',
        `bot` ENUM('0','1') NOT NULL DEFAULT '0' COMMENT 'В строке USER_AGENT встречается bot',
        `remote_addr` VARCHAR(255) NOT NULL DEFAULT '' COMMENT 'IP-адрес клиента',
        `referer` TEXT NULL COMMENT 'Адрес страницы, с которой пришел клиент',
        `user_agent` VARCHAR(255) NOT NULL DEFAULT '' COMMENT 'название браузера, переданного серверу',
        `server` TEXT NULL COMMENT 'php-переменная $_SERVER',
        `session` TEXT NULL COMMENT 'php-переменная $_SESSION',
        `cookie` TEXT NULL COMMENT 'php-переменная $_COOKIE',
        `request` TEXT NULL COMMENT 'php-переменная $_REQUEST',
        `event_params` TEXT NULL COMMENT 'Дополнительные параметры события, как правило это JSON',
        `profiler` TEXT NULL COMMENT 'json счетчиков производительности',
        `profiler_total` DECIMAL(8,5) NOT NULL DEFAULT 0 COMMENT 'время, за которое был выполнен запрос',
        `db` TEXT NULL COMMENT 'json счетчиков SQL-запросов',
        `tephlon` TEXT NULL COMMENT 'json статистики кеша SQL-запросов',
        
        PRIMARY KEY (`id`, bot, event_time )
    ) ENGINE=MYISAM DEFAULT CHARSET=cp1251 COMMENT 'События, происходящие на сайте'
    PARTITION BY RANGE COLUMNS( event_time ) 
    SUBPARTITION BY LINEAR KEY( bot )
    SUBPARTITIONS 2
    (
          PARTITION p2011_09 VALUES LESS THAN ( '2011-10-01 00:00:00' )
        , PARTITION p2011_10 VALUES LESS THAN ( '2011-11-01 00:00:00' )
        , PARTITION p2011_11 VALUES LESS THAN ( '2011-12-01 00:00:00' )
        , PARTITION p2011_12 VALUES LESS THAN ( '2012-01-01 00:00:00' )
    
        , PARTITION p2012_01 VALUES LESS THAN ( '2012-02-01 00:00:00' )
        , PARTITION p2012_02 VALUES LESS THAN ( '2012-03-01 00:00:00' )
        , PARTITION p2012_03 VALUES LESS THAN ( '2012-04-01 00:00:00' )
        , PARTITION p2012_04 VALUES LESS THAN ( '2012-05-01 00:00:00' )
        , PARTITION p2012_05 VALUES LESS THAN ( '2012-06-01 00:00:00' )
        , PARTITION p2012_06 VALUES LESS THAN ( '2012-07-01 00:00:00' )
        , PARTITION p2012_07 VALUES LESS THAN ( '2012-08-01 00:00:00' )
        , PARTITION p2012_08 VALUES LESS THAN ( '2012-09-01 00:00:00' )
        , PARTITION p2012_09 VALUES LESS THAN ( '2012-10-01 00:00:00' )
        , PARTITION p2012_10 VALUES LESS THAN ( '2012-11-01 00:00:00' )
        , PARTITION p2012_11 VALUES LESS THAN ( '2012-12-01 00:00:00' )
        , PARTITION p2012_12 VALUES LESS THAN ( '2013-01-01 00:00:00' )
    
        , PARTITION p2013_01 VALUES LESS THAN ( '2013-02-01 00:00:00' )
        , PARTITION p2013_02 VALUES LESS THAN ( '2013-03-01 00:00:00' )
        , PARTITION p2013_03 VALUES LESS THAN ( '2013-04-01 00:00:00' )
        , PARTITION p2013_04 VALUES LESS THAN ( '2013-05-01 00:00:00' )
        , PARTITION p2013_05 VALUES LESS THAN ( '2013-06-01 00:00:00' )
        , PARTITION p2013_06 VALUES LESS THAN ( '2013-07-01 00:00:00' )
        , PARTITION p2013_07 VALUES LESS THAN ( '2013-08-01 00:00:00' )
        , PARTITION p2013_08 VALUES LESS THAN ( '2013-09-01 00:00:00' )
        , PARTITION p2013_09 VALUES LESS THAN ( '2013-10-01 00:00:00' )
        , PARTITION p2013_10 VALUES LESS THAN ( '2013-11-01 00:00:00' )
        , PARTITION p2013_11 VALUES LESS THAN ( '2013-12-01 00:00:00' )
        , PARTITION p2013_12 VALUES LESS THAN ( '2014-01-01 00:00:00' )
    
        , PARTITION p2014_01 VALUES LESS THAN ( '2014-02-01 00:00:00' )
        , PARTITION p2014_02 VALUES LESS THAN ( '2014-03-01 00:00:00' )
        , PARTITION p2014_03 VALUES LESS THAN ( '2014-04-01 00:00:00' )
        , PARTITION p2014_04 VALUES LESS THAN ( '2014-05-01 00:00:00' )
        , PARTITION p2014_05 VALUES LESS THAN ( '2014-06-01 00:00:00' )
        , PARTITION p2014_06 VALUES LESS THAN ( '2014-07-01 00:00:00' )
        , PARTITION p2014_07 VALUES LESS THAN ( '2014-08-01 00:00:00' )
        , PARTITION p2014_08 VALUES LESS THAN ( '2014-09-01 00:00:00' )
        , PARTITION p2014_09 VALUES LESS THAN ( '2014-10-01 00:00:00' )
        , PARTITION p2014_10 VALUES LESS THAN ( '2014-11-01 00:00:00' )
        , PARTITION p2014_11 VALUES LESS THAN ( '2014-12-01 00:00:00' )
        , PARTITION p2014_12 VALUES LESS THAN ( '2015-01-01 00:00:00' )
        
        , PARTITION p2015_01 VALUES LESS THAN ( '2015-02-01 00:00:00' )
        , PARTITION p2015_02 VALUES LESS THAN ( '2015-03-01 00:00:00' )
        , PARTITION p2015_03 VALUES LESS THAN ( '2015-04-01 00:00:00' )
        , PARTITION p2015_04 VALUES LESS THAN ( '2015-05-01 00:00:00' )
        , PARTITION p2015_05 VALUES LESS THAN ( '2015-06-01 00:00:00' )
        , PARTITION p2015_06 VALUES LESS THAN ( '2015-07-01 00:00:00' )
        , PARTITION p2015_07 VALUES LESS THAN ( '2015-08-01 00:00:00' )
        , PARTITION p2015_08 VALUES LESS THAN ( '2015-09-01 00:00:00' )
        , PARTITION p2015_09 VALUES LESS THAN ( '2015-10-01 00:00:00' )
        , PARTITION p2015_10 VALUES LESS THAN ( '2015-11-01 00:00:00' )
        , PARTITION p2015_11 VALUES LESS THAN ( '2015-12-01 00:00:00' )
        , PARTITION p2015_12 VALUES LESS THAN ( '2016-01-01 00:00:00' )
        
        , PARTITION p2016_01 VALUES LESS THAN ( '2016-02-01 00:00:00' )
        , PARTITION p2016_02 VALUES LESS THAN ( '2016-03-01 00:00:00' )
        , PARTITION p2016_03 VALUES LESS THAN ( '2016-04-01 00:00:00' )
        , PARTITION p2016_04 VALUES LESS THAN ( '2016-05-01 00:00:00' )
        , PARTITION p2016_05 VALUES LESS THAN ( '2016-06-01 00:00:00' )
        , PARTITION p2016_06 VALUES LESS THAN ( '2016-07-01 00:00:00' )
        , PARTITION p2016_07 VALUES LESS THAN ( '2016-08-01 00:00:00' )
        , PARTITION p2016_08 VALUES LESS THAN ( '2016-09-01 00:00:00' )
        , PARTITION p2016_09 VALUES LESS THAN ( '2016-10-01 00:00:00' )
        , PARTITION p2016_10 VALUES LESS THAN ( '2016-11-01 00:00:00' )
        , PARTITION p2016_11 VALUES LESS THAN ( '2016-12-01 00:00:00' )
        , PARTITION p2016_12 VALUES LESS THAN ( '2017-01-01 00:00:00' )
        
        , PARTITION p2017_01 VALUES LESS THAN ( '2017-02-01 00:00:00' )
        , PARTITION p2017_02 VALUES LESS THAN ( '2017-03-01 00:00:00' )
        , PARTITION p2017_03 VALUES LESS THAN ( '2017-04-01 00:00:00' )
        , PARTITION p2017_04 VALUES LESS THAN ( '2017-05-01 00:00:00' )
        , PARTITION p2017_05 VALUES LESS THAN ( '2017-06-01 00:00:00' )
        , PARTITION p2017_06 VALUES LESS THAN ( '2017-07-01 00:00:00' )
        , PARTITION p2017_07 VALUES LESS THAN ( '2017-08-01 00:00:00' )
        , PARTITION p2017_08 VALUES LESS THAN ( '2017-09-01 00:00:00' )
        , PARTITION p2017_09 VALUES LESS THAN ( '2017-10-01 00:00:00' )
        , PARTITION p2017_10 VALUES LESS THAN ( '2017-11-01 00:00:00' )
        , PARTITION p2017_11 VALUES LESS THAN ( '2017-12-01 00:00:00' )
        , PARTITION p2017_12 VALUES LESS THAN ( '2018-01-01 00:00:00' )
        
        , PARTITION p2018_01 VALUES LESS THAN ( '2018-02-01 00:00:00' )
        , PARTITION p2018_02 VALUES LESS THAN ( '2018-03-01 00:00:00' )
        , PARTITION p2018_03 VALUES LESS THAN ( '2018-04-01 00:00:00' )
        , PARTITION p2018_04 VALUES LESS THAN ( '2018-05-01 00:00:00' )
        , PARTITION p2018_05 VALUES LESS THAN ( '2018-06-01 00:00:00' )
        , PARTITION p2018_06 VALUES LESS THAN ( '2018-07-01 00:00:00' )
        , PARTITION p2018_07 VALUES LESS THAN ( '2018-08-01 00:00:00' )
        , PARTITION p2018_08 VALUES LESS THAN ( '2018-09-01 00:00:00' )
        , PARTITION p2018_09 VALUES LESS THAN ( '2018-10-01 00:00:00' )
        , PARTITION p2018_10 VALUES LESS THAN ( '2018-11-01 00:00:00' )
        , PARTITION p2018_11 VALUES LESS THAN ( '2018-12-01 00:00:00' )
        , PARTITION p2018_12 VALUES LESS THAN ( '2019-01-01 00:00:00' )
        
        , PARTITION p2019_01 VALUES LESS THAN ( '2019-02-01 00:00:00' )
        , PARTITION p2019_02 VALUES LESS THAN ( '2019-03-01 00:00:00' )
        , PARTITION p2019_03 VALUES LESS THAN ( '2019-04-01 00:00:00' )
        , PARTITION p2019_04 VALUES LESS THAN ( '2019-05-01 00:00:00' )
        , PARTITION p2019_05 VALUES LESS THAN ( '2019-06-01 00:00:00' )
        , PARTITION p2019_06 VALUES LESS THAN ( '2019-07-01 00:00:00' )
        , PARTITION p2019_07 VALUES LESS THAN ( '2019-08-01 00:00:00' )
        , PARTITION p2019_08 VALUES LESS THAN ( '2019-09-01 00:00:00' )
        , PARTITION p2019_09 VALUES LESS THAN ( '2019-10-01 00:00:00' )
        , PARTITION p2019_10 VALUES LESS THAN ( '2019-11-01 00:00:00' )
        , PARTITION p2019_11 VALUES LESS THAN ( '2019-12-01 00:00:00' )
        , PARTITION p2019_12 VALUES LESS THAN ( '2020-01-01 00:00:00' )
        
        , PARTITION p2020_01 VALUES LESS THAN ( '2020-02-01 00:00:00' )
        , PARTITION p2020_02 VALUES LESS THAN ( '2020-03-01 00:00:00' )
        , PARTITION p2020_03 VALUES LESS THAN ( '2020-04-01 00:00:00' )
        , PARTITION p2020_04 VALUES LESS THAN ( '2020-05-01 00:00:00' )
        , PARTITION p2020_05 VALUES LESS THAN ( '2020-06-01 00:00:00' )
        , PARTITION p2020_06 VALUES LESS THAN ( '2020-07-01 00:00:00' )
        , PARTITION p2020_07 VALUES LESS THAN ( '2020-08-01 00:00:00' )
        , PARTITION p2020_08 VALUES LESS THAN ( '2020-09-01 00:00:00' )
        , PARTITION p2020_09 VALUES LESS THAN ( '2020-10-01 00:00:00' )
        , PARTITION p2020_10 VALUES LESS THAN ( '2020-11-01 00:00:00' )
        , PARTITION p2020_11 VALUES LESS THAN ( '2020-12-01 00:00:00' )
        , PARTITION p2020_12 VALUES LESS THAN ( '2021-01-01 00:00:00' )
        
        , PARTITION p2021_01 VALUES LESS THAN ( '2021-02-01 00:00:00' )
        , PARTITION p2021_02 VALUES LESS THAN ( '2021-03-01 00:00:00' )
        , PARTITION p2021_03 VALUES LESS THAN ( '2021-04-01 00:00:00' )
        , PARTITION p2021_04 VALUES LESS THAN ( '2021-05-01 00:00:00' )
        , PARTITION p2021_05 VALUES LESS THAN ( '2021-06-01 00:00:00' )
        , PARTITION p2021_06 VALUES LESS THAN ( '2021-07-01 00:00:00' )
        , PARTITION p2021_07 VALUES LESS THAN ( '2021-08-01 00:00:00' )
        , PARTITION p2021_08 VALUES LESS THAN ( '2021-09-01 00:00:00' )
        , PARTITION p2021_09 VALUES LESS THAN ( '2021-10-01 00:00:00' )
        , PARTITION p2021_10 VALUES LESS THAN ( '2021-11-01 00:00:00' )
        , PARTITION p2021_11 VALUES LESS THAN ( '2021-12-01 00:00:00' )
        , PARTITION p2021_12 VALUES LESS THAN ( '2022-01-01 00:00:00' )
    )
    ;
    
    -- ALTER TABLE `stat_event` ADD UNIQUE `oid` (`oid`);
    ALTER TABLE `stat_event` ADD INDEX `shop_object_id` (`shop_object_id`);
    ALTER TABLE `stat_event` ADD INDEX `event_type` (`event_type`);
    ALTER TABLE `stat_event` ADD INDEX `time_bot` (`event_time`, `bot`);
    ALTER TABLE `stat_event` ADD INDEX `time_bot_type` (`event_time`, `bot`, `event_type`);
    ALTER TABLE `stat_event` ADD INDEX `shop_object_id` (`shop_object_id`);  
    
    Ответ написан
    Комментировать
  • MySQL: пользователь root без GRANT, что делать?

    KEKSOV
    @KEKSOV
    Попробуйте mysql -u root -p -h <IP хоста> где IP это не 127.0.0.1
    иногда root@localhost и root@* имеют разные права.

    Как вариант — скопируйте базу mysql к себе (переименовав предварительно) и измените права у roota, а потом верните ее на место. Сервер в это время должен быть выключен.
    Ответ написан
  • Конвертировать базу в UTF8 частично

    KEKSOV
    @KEKSOV
    В одном проекте нужно было решить аналогичную задачу, помогло выражение:
    ALTER TABLE CONVERT TO CHARACTER SET utf8;

    На счет спец символов ничего сказать не могу, у меня они не встречались…
    Ответ написан
    Комментировать