MySQL - кратко

GuDron

dumpz.ws
Admin
Регистрация
28 Янв 2020
Сообщения
7,564
Реакции
1,435
Credits
24,411
MySQL: Перечисления enums и установка sql_mode в значение traditional

Тип данных ENUMS может в вести в заблуждение, потому что он может принимать несколько значений, а это легко ведет к ошибкам. Объект ENUMS может быть равен определенному значению, значению NULL, а также может интерпретироваться, как пустая строка.

Конечно, вы получите предупреждение, если что-то неверно. К счастью это легко устраняется. Установите параметр mysql_mode в значение TRADITIONAL. Вуаля!

Чтобы изменить режим SQL (SQL Mode), используйте следующий код:

Код:
//Запуск mysqld в режиме
$--sql-mode=”modes”
//или
$sql-mode=”modes” (my.ini для Windows / my.cnf для Unix)
//Изменение во время выполнения, несколько режимов разделяются запятой
$set [GLOBAL|SESSION] sql_mode='modes'
//TRADITIONAL эквивалентно следующим режимам:
STRICT_TRANS_TABLES, STRICT_ALL_TABLES, NO_ZERO_IN_DATE,
ERROR_FOR_DIVISION_BY_ZERO и NO_AUTO_CREATE_USER
 

GuDron

dumpz.ws
Admin
Регистрация
28 Янв 2020
Сообщения
7,564
Реакции
1,435
Credits
24,411
MySQL: Выявите медленные запросы

То, что MySQL по умолчанию не отслеживает и не протоколирует медленные запросы, не значит, что вы не можете сделать это сами. MySQL имеет много функций, которые по умолчанию не включены, но могут быть очень полезны. Чтобы разрешить функцию slow-query-log отредактируйте конфигурационный файл my.cnf и затем запустите следующие команды, находясь в mysqld:

Код:
$long_query_time = 1
$log-slow-queries = /var/log/mysql/mysql-slow-query.log
Строка 1 означает, что любой запрос, длящийся более 1 секунды, будет занесен в лог. По умолчанию, параметр установлен в «0». После внесения данного изменения, сервер необходимо перезапустить, чтобы изменения вступили в силу.

Теперь, когда вы имеете возможность выявлять «долгие» запросы, используйте команду EXPLAIN (Для просмотра ссылки Войди или Зарегистрируйся), которая была обсуждена ранее, чтобы выяснить, почему это происходит.
 

GuDron

dumpz.ws
Admin
Регистрация
28 Янв 2020
Сообщения
7,564
Реакции
1,435
Credits
24,411
MySQL: Кэш запросов: оптимизируйте ваши запросы

Кэширование запросов на MySQL-серверах обычно включено. Это связано с тем, что когда дело доходит до улучшения производительности, кэширование запросов является одним из наиболее эффективных методов, доступных для движков баз данных.

Один и тот же запрос может выполняться несколько раз. И гораздо быстрее запросить готовый результат из кэша. Однако, для запроса CURDATE (текущая дата) это недоступно. Чтобы реализовать кэширование для CURDATE, просто добавьте перед запросом PHP-строку:

Код:
//CURDATE не определена
$query = 'SELECT id FROM table WHERE publish_date = CURDATE()';
 

GuDron

dumpz.ws
Admin
Регистрация
28 Янв 2020
Сообщения
7,564
Реакции
1,435
Credits
24,411
MySQL: Добавляйте ключевое слово explain к запросам select

Любой, кто пользуется MySQL, в не зависимости от того, опытный он или новичок, оценит удобство и простоту этого совета. Добавив ключевое слово EXPLAIN, можно более точно указать MySQL на то, что должен сделать ваш запрос. EXPLAIN может уточнить, как будут сканироваться ваши таблицы, использоваться индексы и тому подобное.

Создайте сложный запрос SELECT с объединениями и добавьте EXPLAIN перед ним. Результат вы сможете оценить сразу же. Используйте этот трюк, чтобы сэкономить время.
 

GuDron

dumpz.ws
Admin
Регистрация
28 Янв 2020
Сообщения
7,564
Реакции
1,435
Credits
24,411
MySQL: Определяйте where с параметром limit

Допустим, что вы ищете одну строку, но запрос делается ко всем таблицам. Почему бы не оптимизировать производительность путем добавления параметра LIMIT 1 и возврата только той части, которая была запрошена? Этот метод, вместо просмотра всей таблицы (таблиц) или индексов, остановит поиск после нахождения искомой строки.
 

GuDron

dumpz.ws
Admin
Регистрация
28 Янв 2020
Сообщения
7,564
Реакции
1,435
Credits
24,411
MySQL

Auto insert with TimeStamp
Код:
CREATE TABLE test ( 
  id INTEGER, 
  txt VARCHAR(20), 
  ts1 TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 
  ts2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

Copy Database
Код:
mysqldump -u root -p db1 > dump.sql
mysqladmin -u root -p create db2
mysql -u root -p db2 < dump.sql

Create User
Код:
mysql> grant all privileges on DBNAME.* to USERNAME@localhost identified by 'PASSWORD';
mysql> grant all privileges on DBNAME.* to USERNAME@"%" identified by 'PASSWORD';
mysql> flush privileges;

--all DB
mysql> grant all privileges on *.* to USERNAME@localhost identified by 'PASSWORD';
mysql> grant all privileges on *.* to USERNAME@"%" identified by 'PASSWORD';
mysql> flush privileges;

Delete User
Код:
mysql> drop user USERNAME;
or
mysql> delete from mysql.user where user = 'USERNAME';

Change Password
Код:
--User
mysql> set password for USER@"%" = password('PASSWORD');
mysql> set password for USER@localhost = password('PASSWORD');
 
--root
mysql> set password for root=password('PASSWORD');
mysql> set password for root@localhost=password('PASSWORD');

CSV Import / Export
Код:
ERROR 1045 (28000) at line 1: Access denied for user 'USER'@'localhost' (using password: YES)
mysql> grant file on *.* to USER@localhost;

Tips
Код:
--Create table as same data and type
mysql> create  table newtable as select * from orgtable;
 
--Create table with same type. data is null.
mysql> create  table newtable as select * from orgtable where id is null;

Export to CSV
Код:
# mysql -uUSER -pPASS DATABASE -e "select * from TABLE;" | sed -e 's/^/"/g' | sed -e 's/$/"/g' | sed -e 's/\t/","/g' > /tmp/test.csv