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

fazan

Client
Регистрация
25.12.2014
Сообщения
105
Благодарностей
13
Баллы
18
Всем привет. На данный момент есть БД на удаленном хостинге. Написано с десяток разной сложности проектов работающих с данной БД.
Вот ее характеристики:
Сервер баз данных
Сервер: 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 795
Благодарностей
1 398
Баллы
113

uuw

Client
Регистрация
04.06.2020
Сообщения
145
Благодарностей
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
Сообщения
105
Благодарностей
13
Баллы
18
проблема именно в том что вам написал MySQL - Incorrect integer value
в данном столбце должно быть целое число, а не пустота или строка
Т.е. у меня один вариант?
- В проектах перед запросом к БД, делать проверку на пустоту всех переменных с типом INT. И если переменная пуста, то присваивать например 0.
 

fazan

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

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

fazan

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

uuw

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

fazan

Client
Регистрация
25.12.2014
Сообщения
105
Благодарностей
13
Баллы
18
Всем привет. Перенес БД на локальный ПК.
Некоторые запросы выполняются значительно дольше, чем они выполнялись ранее на хостинге.
Например Запрос для подсчета количества строк со значением 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
Сообщения
145
Благодарностей
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)