Базы данных: основные понятия

Предыдущие версии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

  1. #include <windows.h>
  2. #include <mysql.h>

Примечание:mysql_connect

  1. #define USE_OLD_FUNCTIONS

mysql_connect()mysql_connectmysql_get_client_info

  1. #include "stdafx.h"
  2. #include <stdio.h>
  3. #include <windows.h>
  4. #include <mysql.h>
  5. MYSQL mysql;
  6. MYSQL_RES *res;
  7. MYSQL_ROW row;
  8. void die(void){
  9.    printf("%s\n", mysql_error(&mysql));
  10.    exit();
  11. }
  12. void main(void){
  13.     unsigned int i = ;
  14.     if (!mysql_init (&mysql)) abort ();
  15.     if (!(mysql_real_connect(&mysql,"localhost","root","", "kadry", 3306 , NULL , )))
  16.        die();
  17.     if (mysql_select_db(&mysql,"kadry")) 
  18.        die();
  19.     if (mysql_query(&mysql,"SELECT * FROM students"))
  20.        die();
  21.     if (!(res = mysql_store_result(&mysql))) 
  22.        die();
  23.     while((row = mysql_fetch_row(res))) {
  24.         for (i =  ; i < mysql_num_fields(res); i++)
  25.            printf("%s\t",rowi);
  26.         printf ("\n");
  27.      }
  28.      if (!mysql_eof(res)) 
  29.         die ();
  30.      mysql_free_result(res);
  31.      mysql_close(&mysql);
  32. }

Возможно потребуется подключение файла winbase.h. строке 7Строка 8Строка 9Строка 11строке 12Строка 18Строка 19Строка 21Строка 23

  1. typedef char **MYSQL_ROW;
 <strong>Строка 32</strong> – необязательная и проверяет что мы действительно пролистали все записи.
 <strong>Строка 34</strong> – служит для освобождения захваченных ресурсов.
 <strong>Строка 35</strong> – закрываем соединение с сервером базы данных.

Примечание:

  1. SELECT * FROM Students LIMIT , 100

mysql_fetch_rowmysql_store_resultmysql_use_result

  1. if (!(res = mysql_use_result(&mysql))) 
  2.     die();
  3.  // … и дальше то же что было раньше …

Примечание: Недостатками являютсяКритически важно:

  1. mysql_query(&mysql,"SELECT * FROM students");
  2. result = mysql_use_result(&mysql);
  3. while((row = mysql_fetch_row(result))){
  4. // … обработка текущей записи …
  5. }
  6. if(!mysql_eof(result)) { // mysql_fetch_row()
  7.   printf("Error: %s\n", mysql_error(&mysql)); // ошибка получения всех записей
  8. }

Критически важно:

Как работают связи в базе данных

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

Один к одно­му. Это самый про­стой вид свя­зи, кото­рый гово­рит: одной запи­си из этой таб­ли­цы соот­вет­ству­ет толь­ко одна запись из дру­гой таб­ли­цы. Если мы сде­ла­ем новую таб­ли­цу с фото­гра­фи­я­ми кли­ен­тов, то каж­дой фото­гра­фии будет соот­вет­ство­вать толь­ко один кли­ент и наоборот.

Один ко мно­гим. Когда у нас есть таб­ли­ца с кли­ен­та­ми и таб­ли­ца с их покуп­ка­ми, тут рабо­та­ет связь «один ко мно­гим». Это зна­чит, что у нас одной запи­си о кли­ен­те соот­вет­ству­ет несколь­ко запи­сей об их покуп­ках, напри­мер, если он их сде­лал в раз­ное вре­мя. Бла­го­да­ря этой свя­зи мы можем выве­сти все покуп­ки для каж­до­го кли­ен­та в отдельности.

Ещё при­мер — худож­ни­ки и кар­ти­ны. Каж­дая кар­ти­на при­над­ле­жит толь­ко одно­му худож­ни­ку, но одно­му худож­ни­ку может при­над­ле­жать мно­го раз­ных картин. 

Мно­гие ко мно­гим. А вот это хит­рая связь — для неё нуж­на отдель­ная таб­ли­ца. Смысл такой: мы дела­ем про­ме­жу­точ­ную таб­ли­цу, в кото­рой соеди­ня­ем дан­ные из одной таб­ли­цы с дан­ны­ми из дру­гой. Полу­ча­ет­ся, что в новой таб­ли­це как бы нет дан­ных — в ней толь­ко связи.

Допу­стим, вы ведё­те свой спи­сок дел в еже­днев­ни­ке, где мож­но ста­вить мет­ки для дел. Мет­ки помо­га­ют понять, что за дело перед вами, и выгля­дят при­мер­но так: «в доро­ге», «позво­нить», «на неде­ле», «под­пи­сать у Ива­ны­ча» и «за ком­пью­те­ром». Их мож­но назна­чить любой зада­че — одну мет­ку, две или все сра­зу. Полу­ча­ет­ся так:

  • одна мет­ка может сто­ять на мно­же­стве раз­ных задач
  • у одной зада­чи может быть мно­го раз­ных меток. 

Это зна­чит, что мы свя­за­ли мно­же­ство меток со мно­же­ством задач и теперь можем искать одно через другое.

Что может храниться в MySQL

В MySQL может хра­нить­ся что угод­но, если вы може­те настро­ить свя­зи меж­ду дан­ны­ми. Вы може­те хра­нить в такой базе замет­ки, фото, музы­ку, спис­ки дел, зада­чи на год и все лек­ции по тео­рии веро­ят­но­сти. Весь вопрос в том, что­бы вы пони­ма­ли, как вы буде­те это исполь­зо­вать дальше.

Напри­мер, все наши ста­тьи в «Коде» хра­нят­ся в MySQL-базе, с кото­рой мы рабо­та­ем через Ворд­пресс. Там же есть инфор­ма­ция и об авто­рах, и о кар­тин­ках для ста­тей, о дате пуб­ли­ка­ции и о мно­гом дру­гом. Что­бы вы про­чи­та­ли эту ста­тью, сайт обра­тил­ся к базе дан­ных, взял отту­да ста­тью, пра­виль­но её обра­бо­тал и пока­зал вам.

Дру­гие исполь­зу­ют MySQL для рабо­ты с кли­ент­ской базой — в биз­не­се, поли­кли­ни­ках или систе­мах учё­та товаров. 

Самой базе всё рав­но, что в ней хра­нит­ся и как вы этим поль­зу­е­тесь. База дан­ных — это про­сто спо­соб свя­зать дан­ные вме­сте, а потом най­ти в них то, что нужно.

Выполнение запросов

Установив соединение и определив кодировку мы готовы выполнить свои первые SQL-запросы. Вы уже умеете составлять корректные SQL команды и выполнять их через консольный или визуальный интерфейс MySQL-клиента.
Те же самые запросы можно отправлять без изменений и из PHP-сценария. Помогут в этом несколько встроенных функций языка.

Два вида запросов

Следует разделять все SQL-запросы на две группы:

  1. Чтение информации (SELECT).
  2. Модификация (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 файлах почитаешь — там все есть!) и в итоге, смотря на это все, становилось по-настоящему грустно…

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *