В чем ограничение MySQL

270
23 декабря 2017, 06:37
  • Написал класс на PHP который обрабатывает пакеты JSON
  • Разместил файлы на хостинге
  • Поднял Ubuntu server + MySQL 5.7.2
  • Настроил соединение с сервером Ubuntu

Локально при использовании OpenServer - Всё работает, обрабатывает большие пакеты

На хостинге тоже всё обрабатывает без проблем

в связке с Ubuntu server 17 + MySQL 5.7.2

При обработке маленьких пакетов с данными всё нормально, до 215 записей, но если я обрабатываю свыше 215, то в базу данных попадает 215. Менял конфигурацию MySQL по разному. Не могу победить, не могу разобраться в чем дело. Подскажите, направьте. Заранее благодарен.

Структура таблицы MySQL

CREATE TABLE IF NOT EXISTS $table_name  (
     id INT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 'Идентификатор',
     guid VARCHAR(36) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT 'Уникальный идентификатор',
     date_in DATETIME COMMENT 'Дата создания',
     date_up DATETIME COMMENT 'Дата изменения',
     name VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'Наименование',
     description VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT 'Описание',
     vin_code VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT 'VIN код транспортного средства',
     government_number VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT 'Государственный номер',
     device_type VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT 'Тип прибора',
     device_number INT(11) NULL COMMENT 'Номер прибора глонасс',
     device_id VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT 'Идентификатор прибора глонасс',
     application_key VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT 'Ключ приложения',
     processing INT(1) NOT NULL DEFAULT '0' COMMENT 'Обрабатывать данные'
)
ENGINE = MyISAM CHARSET = utf8 COLLATE utf8_general_ci COMMENT = 'Транспортные средства'

Часть функций PHP

    # Дополнительны функции

    # Обрабатываем результат из внешнего источника
    # Параметры:
    #   $table_name - Имя таблицы 
    #   $array - Массив данных
    #
    function process_data_from_an_external_source($table_name, $array) {
        # Создаём экземпляр класса
        $db = new DataBase();
        if ($table_name == 'means_of_transport') {
            foreach ($array as $value) {
                $options = array();
                $options['guid'] = $value['guid'];
                handle_the_value_of_an_array_key($table_name, $value, $options, $db);
                # sleep(1);
            }    
        }
    }
    # Обрабатываем значение ключа массива 
    # Параметры:
    #   $table_name - Имя таблицы 
    #   $column - Массив колонок
    #   $options - Массив условий для обновления записи
    #   $db - Экземпляр класса для работы с базой данных
    #
    function handle_the_value_of_an_array_key($table_name, $column, $options, $db) {
        # Формируем параметры запроса
//        $query_condition_array = array();
//        $query_parameters = array();
//        $query_options = array();
//        foreach ($options as $key => $value) { 
//            $query_condition_array[] = $key. ' = {?}';
//            $query_parameters[] = $value;
//            $query_options[] = $key . " = '$value'";
//        }         
        # Формируем строку условий
//        $query_condition = 'WHERE ' . implode(' AND ', $query_condition_array);
        # Обрабатываем БД
//        $query = "SELECT * FROM $table_name $query_condition";
//        $table = $db->select($query, $query_parameters);
//        if ($table) {
//            $db = new DataBase();
//            $column['date_up'] = 'NOW()';
//            $db->update($table_name, $column, $query_options);
//        } else {
//            $db = new DataBase();
            $column['date_in'] = 'NOW()';
            $column['date_up'] = 'NOW()';
            # Вставляем запись
            $db->insert($table_name, $column);
//        }
    }

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

Answer 1

Огромное спасибо за на правление teran

Изменена таблица SQL

$query = "CREATE TABLE IF NOT EXISTS $table_name 
        (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 'Идентификатор',
        guid VARCHAR(36) CHARACTER SET utf8 COLLATE utf8_general_ci NULL UNIQUE KEY COMMENT 'Уникальный идентификатор',
        date_in DATETIME COMMENT 'Дата создания',
        date_up DATETIME COMMENT 'Дата изменения',
        name VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'Наименование',
        description VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT 'Описание',
        vin_code VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT 'VIN код транспортного средства',
        government_number VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT 'Государственный номер',
        device_type VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT 'Тип прибора',
        device_number INT(11) NULL COMMENT 'Номер прибора глонасс',
        device_id VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT 'Идентификатор прибора глонасс',
        application_key VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT 'Ключ приложения',
        processing INT(1) NOT NULL DEFAULT '0' COMMENT 'Обрабатывать данные') 
        ENGINE = MyISAM CHARSET = utf8 COLLATE utf8_general_ci COMMENT = 'Транспортные средства'";

Основная функция вызова

    # Обрабатываем результат из внешнего источника
    # Параметры:
    #   $table_name - Имя таблицы 
    #   $array - Массив данных
    #
    function process_data_from_an_external_source($table_name, $array) {
        # Создаём экземпляр класса
        $db = new DataBase();
        # Дополнительные поля со значениями
        $additional_columns = array();
        $additional_columns['date_in'] = 'NOW()';
        $additional_columns['date_up'] = 'NOW()';
        # Условия для обновления
        $options = array();
        array_push($options, 'guid');
        $db->upgrade($table_name, $array, $additional_columns, $options);
    }

Функция из класса

    # INSERT & UPDATE метод обработки данных из массива
    public function upgrade($table_name, $column, $additional_columns = false, $options = false) {
        $column_keys = array();
        # Перебираем массив основных полей по ключу
        foreach ($column[0] as $key => $value) {
            array_push($column_keys, $key);
        }
        # Перебираем массив дополнительных полей по ключу
        if ($additional_columns) {
            foreach ($additional_columns as $key => $value) {
                array_push($column_keys, $key);
            }    
        }
        # Начало формирования запроса
        $query = "INSERT INTO $table_name (". implode(", ", $column_keys) .") VALUES ";
        $query_values = array();
        # Перебираем основной массив и изрекаем значение ключей
        foreach ($column as $data) {
            $item = array();
            foreach ($data as $key => $value) {
                if (gettype($value) == 'integer') {
                    array_push($item, $value); 
                } else {
                    array_push($item, "'$value'");
                }
            }
            # Если есть дополнительные поля
            if ($additional_columns) {
                foreach ($additional_columns as $key => $value) {
                    if (gettype($value) == 'integer' || $value = 'NOW()') {
                        array_push($item, $value); 
                    } else {
                        array_push($item, "'$value'");   
                    }
                }    
            }

            $result = implode(',', $item);
            array_push($query_values, "($result)");
        }
        # Добавляем к запросу
        $query .= implode(',', $query_values);
        # Если есть условие
        if ($options) {
            # Добавляем к запросу
            $query .= ' ON DUPLICATE KEY UPDATE ';
            $duplicate_key = array();
            # Перебираем массив с значениями имен полей
            foreach ($options as $key => $value) {
                array_push($duplicate_key, "$value = VALUES($value)");
            } 
            # Добавляем к запросу
            $query .= implode(',', $duplicate_key);
        }

        # Выполняем сформированный запрос
        $success = $this->mysqli->query($query);
        # Возвращаем результат
        return $success; 
    }

Но есть момент, при первом выполнении запроса, всё отлично, если я удаляю несколько записей - они снова добавляются. но поле с AUTO_INCREMENT PRIMARY KEY увеличивается ровно на число обрабатываемой порции, т.е. последняя запись была 788, удалил 10, снова выполняю запрос, поле с id становится 15хх.

Как в таком случаи быть?

READ ALSO
Как сделать изменение месяца и года динамически на php?

Как сделать изменение месяца и года динамически на php?

Для построения графика мне необходимо по Х выстроить месяца с годамиНа примере <?php echo date( "m

298
Запись массива php в базу данных

Запись массива php в базу данных

Доброго времени сутокИмеется массив переданный на страницу как $_POST['ch'], в котором храниться неизвестное количество чисел (id checkbox'ов)

212
В opencart 2 прибавить процент к цене

В opencart 2 прибавить процент к цене

Как вывести в шаблоне несколько цен, прибавлением процента

194
Аналог рации в браузере [требует правки]

Аналог рации в браузере [требует правки]

Добрый деньЕсть небольшая идея

196