проблема при переходе к новой версии MYSQL

fazan

Client
Регистрация
25.12.2014
Сообщения
95
Благодарностей
8
Баллы
8
Всем привет. На данный момент есть БД на удаленном хостинге. Написано с десяток разной сложности проектов работающих с данной БД.
Вот ее характеристики:
Сервер баз данных
Сервер: Localhost via UNIX socket
Тип сервера: Percona Server
Соединение сервера: SSL не используется Документация
Версия сервера: 5.7.27-30 - Percona Server (GPL), Release 30, Revision 8916819
Версия протокола: 10
Кодировка сервера: cp1252 West European (latin1)

Хостер начал ругаться и присылать гневные письма из-за превышения допустимой нагрузки и грозиться заблокировать доступ.
Есть потребность перенести БД на локальную машину.
Установил на нее Open Server. Импортировал БД с хостинга. Тестово в PM успешно подключаюсь к локальной БД и делаю запросы.
При попытке запуска текущих проектов с новой БД получаю ошибки при попытке внесения или обновления строк.
Характеристики БД на Open Server:
  • Сервер: 127.0.0.1 via TCP/IP
  • Тип сервера: MariaDB
  • Соединение сервера: SSL не используется Документация
  • Версия сервера: 10.3.22-MariaDB - mariadb.org binary distribution
  • Версия протокола: 10
  • Пользователь: root@localhost
  • Кодировка сервера: UTF-8 Unicode (utf8mb4)

Вот структура тестовой таблицы на Open Server:
89411


Вот запрос, который пытаюсь выполнить:

PHP:
INSERT INTO `test`(`id`, `test_text`, `test_int`) VALUES (4,"","")
Получаю ошибку:
#1366 - Incorrect integer value: '' for column `u1564826_new_base`.`test`.`test_int` at row 1

Ошибка эта связана, с тем, что я передаю пустые значения в столбцы test_text и test_int.
Приведенная таблица является лишь примером. Фактически переносимая таблица имеет десятки столбцов. И какая то часть столбцов может быть не заполнена.
Т.е. фактически в экшене присутствует столбец, но переменная пуста.
Например:
PHP:
INSERT INTO `test`(`id`, `test_text`, `test_int`) VALUES (4,"{-Variable.test_text-}","{-Variable.test_int-}")
Вопрос: Какие настройки внести в структуру таблицы, чтобы запросы с пустыми значениями корректно вносились в таблицу? По умолчанию NULL установил, не помогло....

p.s. Есть конечно мысль перед добавлением строки каждую переменную проверять на пустоту и если она пуста, то присваивать какое то дефолтное значение, но кубиков и переменных много, что вероятно вызовет ошибки и необходимость долгой отладки. К тому же в таблице много строк. И она уже весит 700МБ. А если вместо пустоты передавать какое то дефолтное, то полагаю вес таблицы будет разрастаться еще быстрее.
 

WebBot

Client
Регистрация
04.04.2015
Сообщения
1 719
Благодарностей
1 377
Баллы
113

uuw

Client
Регистрация
04.06.2020
Сообщения
146
Благодарностей
54
Баллы
28
INSERT INTO `test`(`id`, `test_text`, `test_int`) VALUES (4,"","")
INSERT INTO `test`(`id`, `test_text`, `test_int`) VALUES (4,NULL,NULL)

NULL в SQL не пустая строка
UPD: Прогнал, в MariaDB по другому надо
INSERT INTO `test`(`id`) VALUES (4)
 
  • Спасибо
Реакции: fazan

fazan

Client
Регистрация
25.12.2014
Сообщения
95
Благодарностей
8
Баллы
8
проблема именно в том что вам написал MySQL - Incorrect integer value
в данном столбце должно быть целое число, а не пустота или строка
Т.е. у меня один вариант?
- В проектах перед запросом к БД, делать проверку на пустоту всех переменных с типом INT. И если переменная пуста, то присваивать например 0.
 

fazan

Client
Регистрация
25.12.2014
Сообщения
95
Благодарностей
8
Баллы
8
INSERT INTO `test`(`id`, `test_text`, `test_int`) VALUES (4,NULL,NULL)

NULL в SQL не пустая строка
Ага, так запрос отрабатывает корректно. Но придется править тучу экшенов в куче проектов((((
 

fazan

Client
Регистрация
25.12.2014
Сообщения
95
Благодарностей
8
Баллы
8
проблема именно в том что вам написал MySQL - Incorrect integer value
в данном столбце должно быть целое число, а не пустота или строка
уточните пожалуйста, с точки зрения оптимизации, какое из двух дефолтных лучше назначать в переменной в проекте перед записью в БД? Null или 0?
 

uuw

Client
Регистрация
04.06.2020
Сообщения
146
Благодарностей
54
Баллы
28
  • Спасибо
Реакции: fazan

fazan

Client
Регистрация
25.12.2014
Сообщения
95
Благодарностей
8
Баллы
8
Всем привет. Перенес БД на локальный ПК.
Некоторые запросы выполняются значительно дольше, чем они выполнялись ранее на хостинге.
Например Запрос для подсчета количества строк со значением 0 водном из столбце (int). Или селект одной строки с поиском по столбцу без индексов.
Вот запрос на подсчет количества из стандартного кубика:
Код:
SELECT COUNT(*) as count FROM `new` WHERE `status_add` = 0
Ранее на хостинге, этот запрос выполнялся мгновенно, на лету. Теперь на него уходит 4-20 секунд.
В самой таблице 269469 строк. Подпадающих под фильтр запроса как правило 0-150 строк.
В таблице 52 столбца и три индекса unique для столбцов по которым чаще всего идут селект запросы.

Также вижу что Mysql грузит ЦП, иногда до 50%. Это нормально? Сам open server расположен на ssd диске.
Подскажите, есть очевидные рекомендации, которые позволят оптимизировать запрос подсчета?
 

Вложения

uuw

Client
Регистрация
04.06.2020
Сообщения
146
Благодарностей
54
Баллы
28
  • Спасибо
Реакции: fazan

М40

Новичок
Регистрация
24.03.2023
Сообщения
4
Благодарностей
4
Баллы
3
По умолчанию настройки MySQL то еще уг.
Как вариант база у тебя InnoDB, а по дефолту MySQL заточен под MySAM.
Вкури https://www.google.com/search?q=оптимизация+mysql
Добрый день! Очень заинтересовал ваш опыт с zenno. Хотелось бы пообщаться. Можете написать в тг? Мой ник тг: vsz32255. Почта: [email protected]
 
  • Спасибо
Реакции: Phoenix78

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)