Базы данных: основные понятия
Содержание:
- Предыдущие версииPrevious versions
- MySQL: разрушаем стереотипы
- Лицензирование
- Пользователи, пароли сервера MySQL — добавление, изменение пользователей и паролей. Консоль
- Настройка
- Команды MySQL
- Несколько интересных особенностей MySQL
- Скачать SSMSDownload SSMS
- Установка MySQL
- Постраничная навигация с MySQL при большом количестве записей
- Хабраинтервью с Майклом Видениусом (MySQL)
- Работа с базой данных mysql из c++
- Как работают связи в базе данных
- Что может храниться в MySQL
- Выполнение запросов
- MySQL InnoDB, MyISAM etc.
- Клиенты администрирования MySQL
- Добавление записи
- Не удаётся подключиться к локальному серверу
- Создание современного API на PHP в 2020 году
Предыдущие версииPrevious versions
Эта статья применима только к последней версии SSMS.This article is for the latest version of SSMS only. Предыдущие версии SSMS можно скачать на .To download previous versions of SSMS, visit .
Примечание
В декабре 2021 г. выпуски SSMS до версии 18.6 перестанут использовать многофакторную проверку подлинности через Azure Active Directory.In December 2021, releases of SSMS prior to 18.6 will no longer authenticate through Azure Active Directory with MFA.
Чтобы и дальше использовать проверку подлинности Azure Active Directory с MFA, установите SSMS 18.6 или более поздней версии.To continue utilizing Azure Active Directory authentication with MFA, you need SSMS 18.6 or later.
MySQL: разрушаем стереотипы
В последнее время часто стал натыкаться на различные рассуждения людей, по поводу того, что MySQL — это плохо, это очень плохо — потому что… а вот дальше идут описания различных фич MySQL, которые четко документированы, но пользователь их просто не знает. Кто-то добавляет в БД данные без валидации и удивляется почему они сохранились в неверном формате, а кто-то описывает кучу особенностей myIsam движка, и на этих основаниях делает вывод, что MySQL это отстой — который невозможно использовать в реальных проектах. Всю документацию прочитать невозможно, и да — я с этим абсолютно согласен, но поверьте у нас есть куча других недокументированных и не менее интересных особенностей. Давайте начнем с малого, к примеру докажем, что NULL равно нулю.
Лицензирование
MySQL имеет двойное лицензирование. MySQL может распространяться в соответствии с условиями лицензии GPL. Однако по условиям GPL, если какая-либо программа использует библиотеки (или включает в себя другой GPL-код) MySQL, то она тоже должна распространяться по лицензии GPL. Это может расходиться с планами разработчиков, не желающих открывать исходные тексты своих программ. Для таких случаев предусмотрена коммерческая лицензия, которая также обеспечивает качественную сервисную поддержку. Для свободного программного обеспечения Oracle предоставляет отдельное исключение из правил, явным образом разрешающее использование и распространение MySQL вместе с ПО, распространяемым под лицензией из определённого Oracle списка.
Пользователи, пароли сервера MySQL — добавление, изменение пользователей и паролей. Консоль
Создание нового пользователя — подключение к серверу MySQL под root, переключение к базе данных, добавление пользователя, обновление привилегий:
# mysql -u root -p
mysql use mysql;
mysql INSERT INTO user (Host,User,Password)
VALUES('%',' username ', PASSWORD(' password '));
mysql flush privileges;
Изменений пользовательского пароля из консоли на удаленном хосте db1.example.org :
# mysqladmin -u username -h db1.example.org -p password ' new-password '
Изменение пользовательского пароля из консоли MySQL — подключение под root, обновление пароля, обновление привилегий:
# mysql -u root -p
mysql SET PASSWORD FOR ' user '@' hostname ' = PASSWORD(' passwordhere ');
mysql flush privileges;
Восстановление/изменение пароля root сервера MySQL — остановка MySQL, запуск без таблиц привилегий, подключение под root, установка нового пароля, выход и перезапуск MySQL.
# /etc/init.d/mysql stop
# mysqld_safe -skip-grant-tables &
# mysql -u root
mysql use mysql;
mysql update user set password=PASSWORD(" newrootpassword ") where User='root';
mysql ; flush privileges;
mysql quit
# /etc/init.d/mysql stop
# /etc/init.d/mysql start
Set a root password if there is on root password.
# mysqladmin -u root password newpassword
Обновление пароля root:
# mysqladmin -u root -p oldpassword newpassword
Установка права на подключение к серверу с хоста localhost с паролем » passwd » — подключение подroot, переключение к базе данных, установка привилегий, обновление привилегий:
# mysql -u root -p mysql use mysql; mysql grant usage on *.* to bob @localhost identified by ' passwd '; mysql flush privileges;
Установка привилегий пользователю на использование базы данных — подключение под root, переключение к базе данных, установка привилегий, обновление привилегий:
# mysql -u root -p
mysql use mysql;
mysql INSERT INTO db (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv) VALUES ('%','databasename','username','Y','Y','Y','Y','Y','N');
mysql flush privileges;
или
mysql grant all privileges on databasename .* to username @localhost; mysql flush privileges;
Обновление информации в базе данных:
mysql UPDATE SET Select_priv = 'Y',Insert_priv = 'Y',Update_priv = 'Y' where = user';
Удаление строки в таблице:
mysql DELETE from where = 'whatever';
Обновление привилегий в базе данных:
mysql flush privileges;
Настройка
Конфигурация сервера MySQL содержится в файле /etc/mysql/my.cnf.
Доступ к серверу из сети
По умолчанию сервер MySQL принимает соединения только с локальной машины. Для того, чтобы разрешить подключаться к нему с других машин замените строку
bind-address = 127.0.0.1
на
#разрешить подключатся с любого хоста bind-address = 0.0.0.0 #разрешить подключатся только с указанного IP bind-address = 192.168.1.23
Кодировки
В данном разделе используется распространённое решение проблемы с кодировкой. Стоит помнить, что данное решение не является правильным, хоть и помогает временно решить проблему. Для правильного использования кодировки создавайте или храните таблицы в любой удобной для хранения в СУБД кодировке, а вот клиент должен подключаться к СУБД с указанием той кодировки, с которй выводится текст или производится обработка данных.
По-умолчанию в Ubuntu MySQL устанавливается с кодировкой . В этом можно убедиться посмотрев вывод запроса:
SHOW VARIABLES LIKE 'char%';
character_set_client latin1 character_set_connection latin1 character_set_database latin1 character_set_filesystem binary character_set_results latin1 character_set_server latin1 character_set_system utf8 character_sets_dir /usr/share/mysql/charsets/
В связи с этим, даже используя при работе с сервером команду
SET names utf8;
и используя при создании таблиц
...DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
невозможно добиться полной поддержки кодировки utf8:
character_set_client utf8 character_set_connection utf8 ... character_set_server latin1 ... character_sets_dir /usr/share/mysql/charsets/
Кодировка по-умолчанию все равно останется latin1, что неудобно и может привести к ошибкам.
Чтобы сервер сразу загружался с нужной кодировкой, необходимо отредактировать файл /etc/mysql/my.cnf:
sudo nano -w etcmysqlmy.cnf
В секцию добавьте следующие строки:
skip-character-set-client-handshake character-set-server = utf8 init-connect='SET NAMES utf8' collation-server=utf8_general_ci
Так же желательно установить кодировку для клиента и . Для этого в секциях и необходимо добавить строчку:
default-character-set=utf8
Перезагрузите сервер MySQL:
sudo service mysql restart
После этого список переменных будет выглядеть так:
character_set_client utf8 character_set_connection utf8 character_set_database utf8 character_set_filesystem binary character_set_results utf8 character_set_server utf8 character_set_system utf8 character_sets_dir /usr/share/mysql/charsets/
Если на момент изменения настроек кодировки в базе уже присутствовали записи содержащие кириллицу, то они будут иметь неверную кодировку. Перед изменением кодировки убедитесь что в базе нет таблиц и данных, либо сделайте дамп всех данных из базы до внесения изменений настроек и восстановите после внесения изменений и перезагрузки MySQL.
Команды MySQL
SHOW
- SHOW DATABASES; — список баз данных
- SHOW TABLES ; — список таблиц в базе
- SHOW COLUMNS FROM таблица ; — список столбцов в таблице
- SHOW CREATE TABLE table_name; — показать структуру таблицы в формате «CREATE TABLE»
- SHOW INDEX FROM tbl_name; — список индексов
- SHOW GRANTS FOR user ; — привилегии для пользователя.
- SHOW VARIABLES; — значения системных переменных
-
SHOW FULL PROCESSLIST;
SHOW PROCESSLIST; — статистика по mysqld процессам. Удалить процесс: Синтаксис команды KILL
- SHOW STATUS; — общая статистика
- SHOW TABLE STATUS ; — статистика по всем таблицам в базе
DESCRIBE
Команда DESCRIBE предоставляет информацию о столбцах таблицы.
DESCRIBE таблица; сокращенный вариант команды SHOW COLUMNS FROM
Несколько интересных особенностей MySQL
В не очень далеком прошлом мне пришлось покопаться немного в исходном коде MySQL, и разобраться в некоторых аспектах его работы. В ходе работы лопаткой, и эксперимeнтов, я наткнулся на несколько очень интересных особенностей, часть из которых просто забавна, а в случае некоторых бывает очень интересно понять, чем руководствовался программист, который принимал решение сделать именно так.
Начнем с такого интересного типа, как ENUM.
Итак, у нас есть таблица, в ней есть два столбца. У первого, a, тип ENUM, у второго, b, INT. В таблице три строки, у всех трех значение b равно 1. Интересно, чему равны минимальный и максимальный элементы в столбце a?
Кажется странным, было бы разумно, если бы самым маленьким был ‘a’, а самым большим — ‘c’.
А что если выбрать минимум и максимум только среди тех строк, где b = 1? То есть, среди всех строк?
Вот так мы заставили MySQL поменять свое мнение о том, как сравнивать поля в ENUM, просто добавив предикат.
Разгадка такого поведения заключается в том, что в первом случае MySQL использует индекс, а во втором нет. Это, конечно, не объясняет, почему MySQL сравнивает ENUMы по разному для сортировки в индексе, и при обычном сравнении.
Второй пример проще и лаконичнее:
Когда я показал этот запрос своему коллеге, который занимается разработкой парсера SQL, его вопрос был не «почему этот запрос возвращает две строки», а «как надо написать SQL парсер так, чтобы такой запрос был валидным, без того, чтобы написать правило, специально разрешающее такой запрос».
Интересно, что далеко не любой SELECT в скобках сработает, в частности, UNION в скобках — это синтаксическая ошибка:
Еще несколько интересных примеров под катом
Скачать SSMSDownload SSMS
SSMS 18.7.1 является новейшей общедоступной (GA) версией SSMS.SSMS 18.7.1 is the latest general availability (GA) version of SSMS. Если у вас установлена предыдущая общедоступная версия SSMS 18, при установке SSMS 18.7.1 она будет обновлена.If you have a previous GA version of SSMS 18 installed, installing SSMS 18.7.1 upgrades it to 18.7.1.
Важно!
Начиная с версии SQL Server Management Studio (SSMS) 18.7, вместе с SSMS автоматически устанавливается Azure Data Studio.Beginning with SQL Server Management Studio (SSMS) 18.7, Azure Data Studio is automatically installed alongside SSMS. Средство Azure Data Studio теперь доступно пользователям SQL Server Management Studio со всеми его новыми возможностями и функциями.Users of SQL Server Management Studio are now able to benefit from the innovations and features in Azure Data Studio. Azure Data Studio — это кроссплатформенный инструмент с открытым кодом для настольных систем, предназначенный для работы в облачных, локальных или гибридных средах.Azure Data Studio is a cross-platform and open-source desktop tool for your environments, whether in the cloud, on-premises, or hybrid.
Дополнительные сведения см. в статьях Что такое Azure Data Studio? и Вопросы и ответы.To learn more about Azure Data Studio, check out What is Azure Data Studio or the FAQ.
- Номер выпуска: 18.7.1Release number: 18.7.1
- Номер сборки: 15.0.18358.0Build number: 15.0.18358.0
- Дата выпуска: 27 октября 2020 г.Release date: October 27, 2020
Если у вас есть замечания и предложения или вы хотите сообщить о проблемах, обратитесь к команде разработчиков SSMS через пользовательские отзывы на SQL Server.If you have comments or suggestions, or you want to report issues, the best way to contact the SSMS team is at SQL Server user feedback.
При установке SSMS 18.x не обновляются и не заменяются версии SSMS 17.x или более ранние.The SSMS 18.x installation doesn’t upgrade or replace SSMS versions 17.x or earlier. Среда SSMS 18.x устанавливается параллельно с предыдущими версиями, поэтому обе версии остаются доступными для использования.SSMS 18.x installs side by side with previous versions, so both versions are available for use. Но если у вас установлена предварительная версия SSMS 18.x, перед установкой SSMS 18.7.1 ее необходимо удалить.However, if you have a preview version of SSMS 18.x installed, you must uninstall it before installing SSMS 18.7.1. Чтобы узнать, установлена ли у вас предварительная версия, перейдите в окно Справка > О программе .You can see if you have the preview version by going to the Help > About window.
Если на компьютере есть несколько параллельных установок SSMS, всегда проверяйте, правильную ли версию вы запускаете.If a computer contains side-by-side installations of SSMS, verify you start the correct version for your specific needs. Последняя версия называется Microsoft SQL Server Management Studio 18 .The latest version is labeled Microsoft SQL Server Management Studio 18
Примечание
Если вы открываете локализованную версию этой страницы и хотите просмотреть актуальные материалы, посетите эту страницу на версии сайта на языке US-English.If you are accessing this page from a non-English language version, and want to see the most up-to-date content, please visit the US-English version of the site. С версии сайта US-English вы можете скачать SSMS на других .You can download different languages from the US-English version site by selecting .
Установка MySQL
Для установки MySQL нужно распаковать скачанный архив и запустить файл Setup.exe.
Чтобы начать установку нужно нажать кнопку Next.

Выберем выборочную установку – Custom.

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

После этого для установки сервера нужно нажать Install.

Далее необходимо дождаться окончания процесса установки.

Выбрав пункт Skip Sing-Up, отклоняем предложение зарегистрироваться и нажимаем кнопку Next.

Отметим, что настройка сервера MySQL сервера будет произведена сразу, и нажмем Finish.

Запустим утилиту настройки MySQL сервера.

Выберем первый пункт Детальная конфигурация – Detailed Configuration.

Выберем пункт Машина разработчика – Developer Machine и нажмем кнопку Next.

Далее укажем тип таблиц, который будет назначен по умолчанию. Выберем Многофункциональную базу данных – Multifunctional Database.

Укажем диск и папку для хранения данных из таблиц InnoDB. Выберем диск, который имеет фaйловую систему NTFS и достаточный объем свободного пространства (рекомендуется около 1 Гб).

Укажем число пользователей, которые смогут одновременно выполнять подключение к серверу. Остановимся на пункте Decision Support (DSS). Число подключений ограничено 20.

Отметим поддержку TCP/IP соединений и укажем номер порта 3306 – через него будет происходить связь с сервером.
Обратим внимание, что опцию Enable Strict Mode рекомендуется оставлять включенной

Далее выберем ручной выбор кодировки, которая используется по умолчанию – пункт Manual Selected Default Character Set / Collation, и укажем cp1251 – соответствует Cyrillic Windows.

Чтобы MySQL сервер запускался как служба Windows, рекомендуется отметить пункт Install As Windows Service.
Теперь укажем имя сервиса – Service Name: MySQL – оставим по умолчанию (в случае, если не установлена другая версия MySQL).
Поле Launch the MySQL Server automatically используется для запуска сервера MySQL в автоматическом режиме при старте системы. Если планируется запуск сервера вручную, нужно снять галочку.
Отметим пункт Include Bin Directory in Windows PATH, чтобы PHP смог найти необходимые для него файлы MySQL.

По умолчанию программа установки создает пользователя root с правами администратора, для которого вводим пароль и подтверждаем его.
Поле Enable root access from remote machines используется для подключения к базе данных удаленно с правами администратора root.

Для создания конфигурации нажимаем Execute.

Процесс установки успешно завершен.

Постраничная навигация с MySQL при большом количестве записей
Рано или поздно многие крупные проекты сталкиваются с проблемами производительности при постраничной навигации по записям. Некоторые из них решают эту проблему ограничением количества доступных для просмотра записей (скажем, не больше 1000). Вполне приемлемое решение. Но в этом случаем могут возникнуть проблемы с индексированием сайта сторонними поисковиками, которые и представляют наибольшую угрозу. В этой статье я хотел бы отказаться от привычной для всех панели навигации вида «1..2..3..4..» в пользу простой «вперед… назад» (будет проще объяснить), но это не проблема реализовать подобное и с первым вариантом.
Более точно определить тему, назвав, какое количество записей считать достаточно большим для появления тормозов, не получится, так как эта цифра для всех разная и сильно зависит от того, насколько быстрые у Вас жесткие диски, сколько памяти, и какая часть Ваших данных уже закеширована в ней и тд. Но если Вы и Ваши сервера ощущают, что n-ная страница при выводе даётся тяжелее первой, и при этом не знаете, что с этим делать – статья для Вас. Но для начала, я хотел бы на пальцах объяснить, почему ОНО работает медленно.
Кстати, тест происходит на виртуальной машинке, работаю я с СУБД под рутом, версия MySQL – 5.0.32.
Хабраинтервью с Майклом Видениусом (MySQL)
К сожалению, несмотря на то, что ваши вопросы Монти были отправлены задолго до конца декабря, ответить на них он сумел несколько позже запланированного срока, что, впрочем, не умаляет интересности и актуальности его ответов (англоязычный оригинал ответов Майкла на ваши вопросы можно скачать здесь (RTF-файл, 16,6 Кбайт); ниже дан наш перевод, он может быть не идеален, так что буду рад, если укажете на возможные ошибки).
Напомню, что Майкл «Монти» Видеинус — это один из основных разработчиков популярной СУБД MySQL, которую, в свою очередь, хочет заиметь Oracle Corporation. Такое положение дел Монти по понятным причинам совершенно не устраивает, в связи с чем он в прошлом году опубликовал у себя в блоге соответствующую заметку, обращаясь за помощью к комьюнити.Итак, Монти, вы получили вопросы от Habrahabr.ru? Люди волнуются, что вы так долго не отвечаете.
Я только что заметил. Прошу прощения за задержку, добавлял поддержку иностранных языков на helpmysql.org, это заняло почти всё моё время в последние дни.Как вы пришли к идее создания MySQL в 1994 году? Почему вообще решили этим заняться? Что не устраивало в существующих решениях?
MySQL была основана на более старой программе для баз данных Unireg, которую я начал разрабатывать в 1982-м. Это был генератор приложений на основе tty (screen). С помощью Unireg мы создавали прикладные программы для наших клиентов.
В 1993-м нам понадобилось обеспечить клиентам доступ к их базам Unireg через интернет. Чтобы решить эту проблему, я сделал поверх Unireg слой SQL (поскольку я полагал, что SQL будет легко встроить в скрипты HTML), а также драйвер ODBC.
Другими словами, первоначальной задачей MySQL было решение наших собственных проблем, чтобы предоставить клиентам доступ к данным.
В качестве альтернативного варианта мы рассматривали Sybase, но эта СУБД была недостаточно быстрой (по сравнению с Unireg) и её нельзя было легко встраивать в HTML-страницы.
Работа с базой данных mysql из c++
November 1, 2007
-
#include <windows.h>
-
#include <mysql.h>
Примечание:mysql_connect
-
#define USE_OLD_FUNCTIONS
mysql_connect()mysql_connectmysql_get_client_info
-
#include "stdafx.h"
-
#include <stdio.h>
-
#include <windows.h>
-
#include <mysql.h>
-
MYSQL mysql;
-
MYSQL_RES *res;
-
MYSQL_ROW row;
-
void die(void){ -
printf("%s\n", mysql_error(&mysql)); -
exit();
-
}
-
void main(void){ -
unsigned int i = ;
-
if (!mysql_init (&mysql)) abort ();
-
if (!(mysql_real_connect(&mysql,"localhost","root","", "kadry", 3306 , NULL , )))
-
die();
-
if (mysql_select_db(&mysql,"kadry"))
-
die();
-
if (mysql_query(&mysql,"SELECT * FROM students"))
-
die();
-
if (!(res = mysql_store_result(&mysql)))
-
die();
-
while((row = mysql_fetch_row(res))) { -
for (i = ; i < mysql_num_fields(res); i++)
-
printf("%s\t",rowi); -
printf ("\n"); -
}
-
if (!mysql_eof(res))
-
die ();
-
mysql_free_result(res);
-
mysql_close(&mysql);
-
}
Возможно потребуется подключение файла winbase.h. строке 7Строка 8Строка 9Строка 11строке 12Строка 18Строка 19Строка 21Строка 23
-
typedef char **MYSQL_ROW;
<strong>Строка 32</strong> – необязательная и проверяет что мы действительно пролистали все записи. <strong>Строка 34</strong> – служит для освобождения захваченных ресурсов. <strong>Строка 35</strong> – закрываем соединение с сервером базы данных.
Примечание:
-
SELECT * FROM Students LIMIT , 100
mysql_fetch_rowmysql_store_resultmysql_use_result
-
if (!(res = mysql_use_result(&mysql)))
-
die();
-
// … и дальше то же что было раньше …
Примечание: Недостатками являютсяКритически важно:
-
mysql_query(&mysql,"SELECT * FROM students");
-
result = mysql_use_result(&mysql);
-
while((row = mysql_fetch_row(result))){ -
// … обработка текущей записи …
-
}
-
if(!mysql_eof(result)) { // mysql_fetch_row() -
printf("Error: %s\n", mysql_error(&mysql)); // ошибка получения всех записей -
}
Критически важно:
Как работают связи в базе данных
Связи между таблицами показывают, как одни данные могут зависеть от других. В зависимости от того, как вы настроите связи, база может получать разные результаты и искать данные. В связи может участвовать одна запись, а может сразу много.
Один к одному. Это самый простой вид связи, который говорит: одной записи из этой таблицы соответствует только одна запись из другой таблицы. Если мы сделаем новую таблицу с фотографиями клиентов, то каждой фотографии будет соответствовать только один клиент и наоборот.
Один ко многим. Когда у нас есть таблица с клиентами и таблица с их покупками, тут работает связь «один ко многим». Это значит, что у нас одной записи о клиенте соответствует несколько записей об их покупках, например, если он их сделал в разное время. Благодаря этой связи мы можем вывести все покупки для каждого клиента в отдельности.
Ещё пример — художники и картины. Каждая картина принадлежит только одному художнику, но одному художнику может принадлежать много разных картин.
Многие ко многим. А вот это хитрая связь — для неё нужна отдельная таблица. Смысл такой: мы делаем промежуточную таблицу, в которой соединяем данные из одной таблицы с данными из другой. Получается, что в новой таблице как бы нет данных — в ней только связи.
Допустим, вы ведёте свой список дел в ежедневнике, где можно ставить метки для дел. Метки помогают понять, что за дело перед вами, и выглядят примерно так: «в дороге», «позвонить», «на неделе», «подписать у Иваныча» и «за компьютером». Их можно назначить любой задаче — одну метку, две или все сразу. Получается так:
- одна метка может стоять на множестве разных задач
- у одной задачи может быть много разных меток.
Это значит, что мы связали множество меток со множеством задач и теперь можем искать одно через другое.
Что может храниться в MySQL
В MySQL может храниться что угодно, если вы можете настроить связи между данными. Вы можете хранить в такой базе заметки, фото, музыку, списки дел, задачи на год и все лекции по теории вероятности. Весь вопрос в том, чтобы вы понимали, как вы будете это использовать дальше.
Например, все наши статьи в «Коде» хранятся в MySQL-базе, с которой мы работаем через Вордпресс. Там же есть информация и об авторах, и о картинках для статей, о дате публикации и о многом другом. Чтобы вы прочитали эту статью, сайт обратился к базе данных, взял оттуда статью, правильно её обработал и показал вам.
Другие используют MySQL для работы с клиентской базой — в бизнесе, поликлиниках или системах учёта товаров.
Самой базе всё равно, что в ней хранится и как вы этим пользуетесь. База данных — это просто способ связать данные вместе, а потом найти в них то, что нужно.
Выполнение запросов
Установив соединение и определив кодировку мы готовы выполнить свои первые SQL-запросы. Вы уже умеете составлять корректные SQL команды и выполнять их через консольный или визуальный интерфейс MySQL-клиента.
Те же самые запросы можно отправлять без изменений и из PHP-сценария. Помогут в этом несколько встроенных функций языка.
Два вида запросов
Следует разделять все SQL-запросы на две группы:
- Чтение информации (SELECT).
- Модификация (UPDATE, INSERT, DELETE).
При выполнении запросов из среды PHP, запросы из второй группы возвращают только результат их исполнения: успех или ошибку.
Запросы первой группы при успешном выполнении возвращают специальный ресурс результата. Его, в свою очередь, можно преобразовать в ассоциативный массив (если нужна одна запись) или в двумерный массив (если требуется список записей).
MySQL InnoDB, MyISAM etc.
Краткое описание современных движков хранения данных в MySQL- совместимых СУБД система управления базами данных.
InnoDB — основной движок для MySQL, который с версии 5.5 стал дефолтным. Поддерживает транзакции, репликацию, построчную блокировку. В отличие от таблиц MyISAM, где для каждой таблицы создается один файл данных, данные InnoDB в настройках по умолчанию хранятся в больших совместно используемых файлах. То есть данные для всех таблиц и всех баз данных хранятся в одном файле, изменить это можно с помощью настроек опции innodb_file_per_table (Как включить MySQL innodb_file_per_table?).
Чтобы уменьшить размер своей базы данных с движком InnoDB, необходимо воспользоваться mysqldump, чтобы сделать дамп всех своих таблиц, создать новую базу данных и импортировать таблицы в новую базу данных. Уменьшение таблицы Innodb
- MyISAM — не поддерживает транзакции и внешние связи (foreign key), но зато может похвастаться полнотекстовыми индексами и быстротой вставки данных. На Select запросах MyISAM медленнее, чем InnoDB. Долгое время был стандартным для всех версий MySQL, а потому до сих пор является самым популярным.
- MERGE — MyISAM движок для разнесения данных в одной таблице на несколько разных.
- CVS — специализированный движок на случай, когда требуется хранить и обрабатывать большие массивы строковых данных, разделяемых запятой. Данные можно править обычным текстовым редактором.
- MEMORY — движок, использующийся для хранения данных не на диске, а в памяти. Информация из базы доступна только во время работы сервера, но это дает колоссальный прирост в производительности.
- Federated/FederatedX — этот движок специализируется на прозрачном разнесении данных по нескольким серверам (физическим) на уровне таблицы.
- PBXT — призванный заменить InnoDB новый движок, в котором реализованы полная поддержка транзакций, многоверсионность, автоматическая обработка дедлоков. Движок оптимизирован для большого количества одновременных транзакций.
- Blackhole — служебный движок, представляющий собой, по сути, /dev/null для СУБД и фактически не производящий никаких записей на диск. Используется для репликации.
- Archive — используется в тех случаях, когда необходимо хранить большие массивы данных без изменений. Для эффективности хранения используется сжатие, что приводит к медлительности во время выборок. Движок хорошо подходит для долговременного хранения логов и другой служебной информации.
- XtraDB — расширенная и исправленная в некоторых проблемных местах InnoDB от компании Percona.
- BlitzDB — еще одна замена для MyISAM с хорошей производительностью за счет встроенного построчного кэширования и автоматического восстановления после сбоев. Движок не поддерживает транзакции.
- NDB — движок для кластера, обладающий, впрочем, кучей проблем и удручающе плохой производительностью.
- Falcon — легендарный движок от компании MySQL AB, разрабатываемый еще со времен Sun, когда было принято решение заменить оракловский InnoDB.
- SphinxSE — полнотекстовый движок от создателя поискового сервера Sphinx. Лучший вариант для полнотекстового поиска и индексации по правилам русского языка. Легко оперирует терабайтами данных, обеспечивая при этом все возможности современной БД.
- Aria — замена для MyISAM с поддержкой транзакций и улучшенной работой с памятью. Движок гарантирует целостность данных и при этом не уступает в скорости MyISAM.
- BDB(BerkeleyDB) — для совместимости с BerkeleyDB.
Клиенты администрирования MySQL
-
Emma
aptitude install emma
- Nerocode SQLWave GUI Client for MySQL Database Server. OS: Windows
- MySQL Navigator.
-
HeidiSQL. Использование Wine
-
SQLyog — запускается помощью Использование Wine
Добавление записи
Вернёмся к нашему проекту — дневнику наблюдений за погодой. Начнём практическую работу с заполнения таблиц данными. Для начала добавим хотя бы один город в таблицу cities.
Выражение используется для добавления новых записей в таблицу базы данных.
Составим корректный SQL-запрос на вставку записи с именем города, а затем выполним его путём передачи этого запроса в функцию , чтобы добавить новые данные в таблицу.
Обратите внимание, что первым параметром для функциии передаётся ресурс подключения, полученный от функции , вторым параметром следует строка с SQL-запросом.
При запросах на изменение данных (не SELECT) результатом выполнения будет логическое значение — true или false. будет означать, что запрос выполнить не удалось
Для получения строки с описанием ошибки существует функция .
Функция insert id: как получить идентификатор добавленной записи
Следующим шагом будет добавление погодной записи для нового города.
Погодные записи хранит таблица weather_log, но, чтобы сослаться на город, необходимо знать идентификатор записи из таблицы cities.
Здесь пригодится функция .
Она принимает единственный аргумент — ресурс соединения, а возвращает идентификатор последней добавленной записи.
Теперь у нас есть всё необходимое, чтобы добавить погодную запись.
Вот как будет выглядеть комплексный пример с подключением к MySQL и добавлением двух новых записей:
Не удаётся подключиться к локальному серверу
Одной из распространённых ошибок подключения клиента к серверу является «ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock’ (2)».
Эта ошибка означает, что на хосте не запущен сервер MySQL () или вы указали неправильное имя файла сокета Unix или порт TCP/IP при попытке подключения.
Убедитесь, что сервер работает. Проверьте процесс с именем на хосте сервера, используя команды ps или grep, как показано ниже.
Если эти команды не показывают выходных данных, то сервер БД не работает. Поэтому клиент не может подключиться к нему. Чтобы запустить сервер, выполните команду .
Чтобы проверить состояние службы MySQL, используйте следующую команду:
Если в результате выполнения команды произошла ошибка службы MySQL, вы можете попробовать перезапустить службу и ещё раз проверить её состояние.
Если сервер работает (как показано) и вы по-прежнему видите эту ошибку, вам следует проверить, не заблокирован ли порт TCP/IP брандмауэром или любой другой службой блокировки портов.
Head of Development/Team Lead
ZenSupplies, Удалённо, От 250 000 до 300 000 ₽
tproger.ru
Вакансии на tproger.ru
Для поиска порта, который прослушивается сервером, используйте команду .
Создание современного API на PHP в 2020 году
Recovery Mode
Итак, на примере этого API, я хочу показать современную PHP архитектуру для высоконагруженных проектов. Когда проект еще в самом начале, и не то, что бизнеслогика (взаимоотношения с базой данных) не прописана, но и сама бизнес модель не очень ясна, построение эффективной IT архитектуры может идти только одним путем: необходимо жестко разделить frontend и backend.
Что обычно делали в таких ситуациях два-три года назад? Брался монолитный фрейворк типа Laravel или Yii2, вся бизнес модель разбивалась, худо-бедно, на блоки, а эти блоки уже имплементировались как модули фреймворка. В итоге еще через 3 года получалась огромная не поворотная машина, которая сама по себе медленная, а становилась почти невыносимо медленной, в которой фронтенд рендится через бэкенд посредством классической MVC архитеркутуры (пользователь отправил запрос, контроллер его подхватил, вызвал модель, та в свою очередь чего-то там натворила с базой данных, вернула все контроллеру, а тот наконец-то вызвал вьювер, вставил туда данные из модели и отдал это все пользователю, который уже успел открыть очередную банку пива…). А… ну еще особо продвинутые ребята, они не просто вьюверели Tweeter Bootstrap, а во вьювер вкручивали на самом деле очень хорошие библиотеки типа JQuery или вместо вьювера использовали какой-нибудь фронтенд фреймворк. В итоге поддерживать такой БеЛаЗ становилось все сложнее, а ввести нового программиста в команду было очень сложно, ибо не все рождаются Энштейнами. Добавим сюда тотальное отсутствие документации разработчика (камменты в 9000 файлах почитаешь — там все есть!) и в итоге, смотря на это все, становилось по-настоящему грустно…








