MySQL е пакет с отворен код. Функции и приложения на MySQL

Андрей Клочков

Какво е MySQL

Преди да решите дали да използвате MySQL пакета като сървър на база данни, първо трябва да разберете какво представлява той. MySQL е система за управление на релационна база данни.

MySQL поддържа SQL (Structured Query Language) и може да се използва като SQL сървър. Това означава, че можете да комуникирате със сървъра в SQL: клиентът изпраща заявка до сървъра, сървърът я обработва и дава на клиента само данните, които са получени в резултат на тази заявка. По този начин клиентът не трябва да изтегля данни и да извършва изчисления, както например в Microsoft Access.

Освен това MySQL е софтуер с отворен код, т.е. може свободно да се изучава и променя. Пакетът се разпространява при условията на GPL (General Public License) и може да бъде изтеглен безплатно от Интернет (http://www.mysql.com) за некомерсиална употреба.

С навлизането на интернет технологиите, които правят възможно създаването на динамични уеб страници, търсенето на СУБД, които биха били най-подходящи за това по отношение на скорост, надеждност и стабилност, нарасна неимоверно. И тук пакетът MySQL се оказа добър, който се оказа бърз, прост и надежден, но обаче за сметка на влошаването на функционалността (нека само да направим резервация, че разработчиците на MySQL обещават да добавят липсващите функции в следващите версии на програмата).

Като цяло, липсата на някои функции, които са били пожертвани за скорост и надеждност, не създава много проблеми за потребителите (въпреки че понякога има известен дискомфорт). За работа с пълноценна корпоративна база данни MySQL не успява, но MySQL се справя доста добре с ежедневните задачи.

недостатъци

Ето кратък списък с основните функции, които MySQL липсва.

Транзакции- ви позволява да комбинирате няколко SQL заявки в една работна единица и, ако някоя от заявките, включени в това звено, не успее, връщане назад, за да върнете данните в първоначалното им състояние. Нека обясним с пример.

Необходимо е да изтеглите пари от една сметка и да ги поставите в друга. За да направите това, трябва да изпълните две SQL заявки: първата е да теглите пари от една сметка, а втората е да ги кредитирате в друга сметка. Ако не приложите транзакции, тогава ако втората заявка не успее, парите ще бъдат изтеглени от сметката, но няма да бъдат кредитирани в друга сметка. Използването на транзакции ви позволява да връщате назад, сякаш парите изобщо не са били изтеглени от сметката.

Имайте предвид, че можете да емулирате транзакция с помощта на командата LOCK TABLES в MySQL. Тази команда заключва таблицата, докато заявките се изпълняват, като по този начин гарантира целостта на данните, но все още не може да бъде върната назад.

Тригери- служат за автоматизиране на наблюдението на състоянието и работата на базата данни. Тригерът се съхранява в базата данни и се задейства, когато настъпи определено събитие. Да вземем същия пример за превод на пари: ако втората заявка не успее, тригерът ще се задейства и ще се върне или ще изпрати съобщение до DBA.

Съхранени процедури- Това са няколко SQL команди, които се съхраняват в базата данни под определено име и заедно изпълняват определена функция. Съхранените процедури могат да се използват за разширяване на синтаксиса на SQL, за да прилича на общ език за програмиране (като Oracle PL / SQL). В нашия пример за превод на пари, две SQL заявки могат да бъдат записани под едно и също име и след това да извикат тази процедура, като й предадат два номера на сметки и сумата пари като параметри. Тогава и двете заявки ще бъдат изпълнени в една транзакция.

Вложени заявки- ви позволяват динамично да замествате стойности в условията за избор въз основа на резултатите от друга заявка. Според автора, ако по някакъв начин можете да се справите без всичко по-горе, тогава липсата на вложени заявки понякога много разваля живота. Например, за да разберете кой автомобил е превозил повече товари от средния за флота, трябва да направите следната SQL заявка:

ИЗБЕРЕТЕ авто ОТ автопарк КЪДЕ маса>!Повече от какво? Нямам представа каква е средната стойност!

За да направите това, средната стойност в полето за маса трябва да се изчисли:

ИЗБЕРЕТЕ AVG (маса) ОТ автопарк

Ако се поддържат вложени заявки, тогава двете заявки могат да бъдат вложени:

ИЗБЕРЕТЕ auto ОТ autopark WHERE massa> (ИЗБЕРЕТЕ AVG (massa) ОТ autopark)

Но в случая с MySQL средната стойност трябва да се намери отделно и да се замести с друга заявка директно в CGI скрипта, което несъмнено се отразява на производителността.

изявление на СЪЮЗ- просто казано, той комбинира изхода от няколко заявки в едно, с възможност за премахване на дублиращи се редове.

Каскадно опресняване на данните- ви позволява да изтривате и актуализирате свързани данни. Например, ако изтриете клиентски запис от базата данни, всички записи за поръчки за този клиент автоматично се изтриват от свързаните таблици.

Предимства

Сега нека изброим предимствата на MySQL.

Високоскоростно изпълнение.Благодарение на вътрешния многонишков механизъм, производителността на MySQL е много висока.

Сигурност.Доста високо ниво на сигурност се осигурява от базата данни mysql, която се създава при инсталиране на пакета и съдържа пет таблици. Използвайки тези таблици, можете да опишете кой потребител от кой домейн може да работи с коя таблица и какви команди може да използва. Паролите, съхранявани в база данни, могат да бъдат криптирани с помощта на вградената функция за парола на MySQL ().

Разрешително.В миналото лицензирането на MySQL беше малко объркващо; тази програма вече се разпространява безплатно за некомерсиални цели.

Отворен изходен код.Благодарение на това можете сами да добавите желаните функции към пакета, като разширите неговата функционалност според нуждите. Между другото, самите автори на MySQL могат да направят това вместо вас срещу заплащане. За да поръчате MySQL разширение от създателите на пакети, просто отидете на http://www.mysql.com и попълнете съответния формуляр.

Надеждност.Създателите на MySQL свършиха страхотна работа: доколкото знам, този пакет е доста стабилен и трудно се разбива. Не следя специално обобщението на резултатите от хакерските атаки върху MySQL, но никога не съм срещал (за разлика от същите уеб сървъри) съобщение, че MySQL е повреден в резултат на нечие злонамерено намерение.

Ресурси.Това може да зависи от различни фактори, но така или иначе нямате нужда от суперкомпютър.

общност.В резултат на отвореността на кода, безплатната програма, нейната стабилна и надеждна работа се формира общност от хора, които не само са лоялни към MySQL, но и участват по всякакъв възможен начин както в разработването на самия пакет, така и в обучението на по-малко опитни хора да работят с него. Има огромен брой пощенски списъци и конференции, където можете да получите безплатна помощ по всяко време на деня.

Преносимост.В момента има версии на програмата за най-често срещаните компютърни платформи. Това означава, че не сте принудени да използвате конкретна операционна система. Вие сами можете да изберете с какво да работите, например с Linux или Windows, но дори и да смените ОС, няма да загубите данните си и дори няма да имате нужда от допълнителни инструменти за прехвърлянето им.

Не знам дали това е недостатък или предимство, фактът, че MySQL няма графичен потребителски интерфейс (GUI). Например, намирам за по-удобно да напиша SQL заявка ръчно (между другото, резултатите от нейното изпълнение могат да бъдат пренасочени към файл), отколкото да използвам съветника за заявки, както в Microsoft SQL Server.

Има няколко GUI клиентски програми за MySQL, но те далеч не са перфектни и в по-голямата си част само забавят нещата. Ако предпочитате GUI, препоръчвам да изтеглите и изпробвате тези програми, за да насърчите техните създатели да подобрят допълнително своите продукти. Ето далеч от пълния списък с GUI програми:

  • Winmysqladmin - включен в Windows дистрибуцията на MySQL, има стандартен графичен интерфейс и ви позволява да администрирате MySQL;
  • MySqlManager - включен в Windows дистрибуцията на MySQL, носи клиентски функции (но авторът не успя да направи нищо сериозно с него);
  • MySQL Administrator за Windows е по-"напреднала" помощна програма на трета страна. Позволява ви да се регистрирате и свързвате с няколко MySQL сървъра едновременно, да създавате, изтривате и променяте структурата на бази данни и таблици, да създавате ключове в таблици, да пишете SQL заявки и да ги запазвате във файл:
  • XMySQL е MySQL клиент за X Window-подобни системи. Осигурява пълен достъп до таблици, позволява групови вмъквания и изтривания и има функционалност за дизайнер на заявки и администриране на пакети. Програмата може да бъде намерена на http://web.wt.net/~dblhack/.

По-пълен списък с всички видове помощни програми за MySQL (и той е много голям) е на http://www.mysql.com/downloads/. Там ще намерите много интересни и полезни неща: експортиране на данни от MySQL към Microsoft Access и обратно, ODBC драйвери и т.н.

Въпреки липсата на графичен интерфейс, MySQL идва с някои доста мощни инструменти за администриране на командния ред. По-долу е даден списък с тях с кратко описание на помощните програми.

  • MySQLAdmin е основният инструмент за администриране на MySQL. С него можете да създавате, унищожавате, променяте бази данни и да имате пълен контрол над вашия сървър.
  • MySQLDump е помощна програма за архивиране на данни.
  • MySQLAccess - Позволява ви да променяте таблици с права за достъп и да показвате съдържанието им в лесна за четене форма.
  • MySQLBug – В случай на грешка в MySQL, тази помощна програма генерира доклад за грешки за разработчиците на програми, като го изпраща и до пощенския списък на MySQL, така че специалистите да могат да помогнат за решаването на проблема ви.
  • MySQLImport - Импортира данни от файл с разделители в базата данни.
  • MySQLShow - показва структурата на базите данни и таблиците, от които са съставени.

Искам да обърна внимание на читателя към следното: сега има програми, които работят през CGI интерфейса, които предоставят почти пълен пакет от услуги за администриране на база данни. Тези програми се хостват на уеб сървъри и са просто CGI скриптове. Много често тези скриптове се намират в публично достъпни директории. Опасността е, че с помощта на търсачките всеки може да намери такива програми по име на файл и след това да прави каквото сърцето му пожелае с вашата база данни. Този проблем може лесно да бъде заобиколен чрез поставяне на тези скриптове в защитени с парола директории на сървъра. Но най-доброто решение е напълно да спрете да използвате такива програми на сървъра.

MySQL също има собствено разширение на SQL език. Тези функции могат да се използват в заявка по два начина. Първо, като извлечена стойност: функцията е включена в списъка с извлечени полета. Връщаната стойност на функцията ще бъде изчислена за всеки запис в таблицата и ще се покаже, сякаш е поле на таблица. Например, нека покажем заглавието на статията и нейната дължина:

SELECT title, LENGTH (заглавие) FROM таблица

В резултат на това получаваме две колони, където едната е взета от таблицата, а втората е изчислена.

Второ, функцията може да се използва като част от клаузата WHERE - в този случай тя ще замени константата в момента на изпълнение на заявката. Нека обясня с пример: трябва да намерите събития, случили се преди повече от ден.

SELECT събитие ОТ таблица WHERE време> (Unix_TIMESTAMP () - (60 * 60 * 24))

Тук функцията Unix_TIMESTAMP () изчислява текущото време, от което изваждаме един ден.

Приложение

Според автора най-подходящата сфера на приложение за MySQL е Интернет, благодарение на добрата система за сигурност на този пакет, стабилна работа и висока производителност. Ако вашият интернет проект ще свърши без транзакции, можете да използвате Postgres. Postgres в много отношения е подобен на MySQL, практически не му отстъпва по производителност, но има повече функционалност. Опитът обаче показва, че MySQL има достатъчно възможности за прости интернет проекти.

Що се отнася до използването на MySQL като корпоративна база данни, тук ситуацията не е особено благоприятна. Ще формулираме изискванията към SQL сървъра на корпоративната база данни, въз основа на спецификата на работата на служителите, и ще оценим от гледна точка на тези изисквания MySQL.

Възможност за работа с множество потребители.Това очевидно изискване трябва да бъде допълнено от факта, че интензивността на използване на базата данни в този случай ще бъде много по-висока, отколкото на уеб сървъра. Всъщност за един уебсайт 20 посетители едновременно се считат за голям успех, а в случай на корпоративна база дори малка компания може да се похвали с такъв показател. Специално внимание трябва да се обърне на факта, че корпоративната база данни използва по-сложни потребителски интерфейси от страниците на сайта; с други думи, изпраща заявки към сървъра по-интензивно. В технически план това означава, че имате нужда от заключване на нивото на променливия запис. Това е мястото, където MySQL не се справя добре: заключването се извършва на ниво таблица. Това означава по-специално, че ако някой въведе поръчка, тогава всички заявки (анализ на статистика, избор на записи за отчет и т.н.) ще трябва да изчакат, докато поръчката бъде завършена. В случай на корпоративна база данни, това отрича дори предимството на производителността на MySQL.

Контрол на целостта на данните на ниво SQL сървър.Корпоративната база данни има сложна схема за данни и е много трудно да се поддържа целостта на данните с помощта на клиентска програма: една релационна може да се присъедини към пет до седем таблици, а броят на таблиците може да бъде до 30-40. И в този случай липсата на способност на MySQL да каскадно обновява и изтрива записи в свързани таблици става от съществено значение.

Освен това вече споменахме, че корпоративната база данни използва по-сложен интерфейс и това обстоятелство генерира още две изисквания: поддръжка на всички стандартни SQL изрази (и полезни разширения), както и използване на съхранени процедури и тригери. Уви, и тук MySQL не ни прави щастливи.

Обобщавайки всичко по-горе, можем да заключим, че за повечето интернет проекти възможностите на MySQL СУБД са напълно достатъчни. Те ще бъдат достатъчни за съхраняване на адресната книга във вътрешната мрежа на предприятието.

Практическо използване на MySQL ++

Част 1. Откъде да започна

Поредица от съдържание:

По-голямата част от приложенията в една или друга степен използват база данни в процеса. При разработването на такива приложения инструментите, които опростяват взаимодействието с различни СУБД, са много полезни. Един от тези инструменти е библиотеката MySQL ++, която ви позволява ефективно да организирате достъп до MySQL бази данни от програми, написани на езика C ++. Ще се опитам да анализирам подробно функционалността на тази библиотека, нейните предимства и недостатъци. Ще започна с общите характеристики на MySQL ++.

1. Какво е MySQL ++

MySQL ++ е специализирана библиотека от така наречените обвиващи методи за MySQL C API. Основната цел на тази библиотека е да направи работата със SQL заявки толкова лесна, колкото работата със STL контейнери.

Най-новата версия на библиотеката MySQL ++ може да бъде намерена на официалния уебсайт. Въпреки това, за да избегнете допълнителни усложнения, най-добре е да се консултирате с хранилището на пакети за вашата дистрибуция.

1.1. Малко история

През 1998 г. Кевин Аткинсън започва да разработва библиотека, която според първоначалната му концепция ще осигури изпълнението на SQL заявки и обработката на техните резултати, без да е обвързана с някаква конкретна СУБД. Това беше отразено дори в оригиналното име - SQL ++. Всички версии преди 1.0 са плод на индивидуалната работа на Кевин.

През 1999 г. MySQL AB пое библиотеката. Първоначално Майкъл "Монти" Видениус свърши част от работата, след това делегира правомощията на друг служител на MySQL AB, Синиша Миливоевич. Бяха пуснати версии 1.0 и 1.1, след което Аткинсън официално прехвърли всички функции по поддръжката на библиотеката в ръцете на Миливоевич и напълно се оттегли от всяко участие в този проект. Milivoevich доведе библиотеката до версия 1.7.9, която беше пусната в средата на 2001 г. По това време стана очевидно, че е невъзможно да се внедри универсална библиотека от SQL заявки, независимо от конкретни реализации на СУБД. Фокусът на MySQL стана неизбежен.

След пускането на версия 1.7.9 настъпи период на известен застой в работата по MySQL, който продължи три години, до август 2004 г., когато Уорън Йънг пое контрола над ситуацията. Уорън незабавно пусна версия 1.7.10, поправи всички проблеми с компилацията при използване на GCC, поправи много грешки, добави нови функции. Като цяло, както се казва, "процесът започна" ...

В тази статия обмислям версия 3.0.9 на библиотеката MySQL ++. На официалния уебсайт тази версия е обявена като "най-новата стабилна" версия.

2. Кратко описание на основните обекти (връзка, заявка, резултати)

MySQL ++ осигурява поддръжка за повечето от различните начини и техники за работа с бази данни. И все пак, въпреки това разнообразие, има обобщена схема за използване на API за достъп до бази данни:

  • създаване (отваряне) на връзка с базата данни,
  • формиране и изпълнение на заявка,
  • при успешно изпълнение на заявката - обработка на резултатния набор - итеративно последователно преминаване през записите на този набор,
  • ако заявката е неуспешна, тогава е необходимо да се гарантира, че грешките (изключенията) се обработват.

Всеки от горните етапи съответства на йерархия на клас или клас на библиотеката MySQL ++. Нека ги разгледаме малко по-подробно.

2.1. Обект на свързване

Обектът Connection управлява връзката към MySQL сървъра. За да извършите каквито и да е операции в базата данни, ви е необходим поне един такъв обект. В едно приложение използването на всички други MySQL ++ обекти зависи (макар и не винаги директно) от екземпляра на Connection, така че докато вашата програма използва обектите на библиотеката MySQL ++, обектът Connection също трябва да съществува.

MySQL позволява няколко различни типа връзки между клиент и сървър: TCP / IP сокети, Unix домейн сокети, именувани канали. Базовият клас Connection поддържа всички тези типове връзки. Вие определяте кой тип връзка се изисква във всеки конкретен случай, като използвате параметрите, предадени на метода Connection :: connect (). Но ако предварително сте решили, че приложението ви ще работи само с един тип връзка, тогава на вашето внимание се предлагат специализирани подкласове с опростени интерфейси. Например, ако вашата програма възнамерява да има достъп само до сървъра на мрежовата база данни, можете да използвате подкласа TCPConnection.

2.2. Обект на заявка (заявка)

Най-често SQL заявките се създават с помощта на обект Query, който се инициализира от обект Connection.

Заявката работи почти като изходен поток в стандартен C ++, така че можете да записвате данни в него точно като std :: cout или std :: ostringstream. Това е най-близкият стил на C ++ до начина, по който MySQL ++ използва оформлението на низ за заявка. Библиотеката включва поточни манипулатори с контрол на типа данни, което значително опростява създаването на синтактично правилни SQL команди.

Друга функционална характеристика на Query са Template Queries, които до известна степен наподобяват функцията printf на езика C: образува се низ на заявка с включени в него тагове, указващи къде са вмъкнати елементи с променливи данни. Това е полезно, когато вашата програма използва множество заявки с една и съща структура - след като дефинирате един шаблон, можете да го използвате многократно в различни части на вашето приложение.

Третият метод за създаване на заявки е чрез използване на обекта Query във връзка със специализирани SQL структури (SSQLS), които ви позволяват да създавате C++ структури, които точно представят специфични схеми на база данни. Това дава на обекта Query информацията, от която се нуждае, за да формира общи SQL заявки.

2.3. Набори с резултати

Данните от полето в резултатния набор от заявка се съхраняват в специален клас с име String (аналогично на стандартния std :: string). Този клас предоставя оператори за автоматизирано преобразуване на обекти от набор от резултати във всеки базов тип C / C ++. В допълнение, MySQL ++ дефинира класове като DateTime, които можете да инициализирате с SQL данни DATETIME. За тези автоматични преобразувания се проверява тяхната коректност и в случай на грешки при конвертиране се задава подходящ предупредителен флаг или се генерира изключение (в зависимост от настройките на библиотеката).

За осигуряване на резултатите от изпълнението на SQL команди в библиотеката MySQL ++ се прилагат следните подходи.

2.3.1. Команди, които не връщат данни

Не всички SQL команди връщат данни. Пример за такава команда CREATE TABLE. За такива команди има специален тип резултат (SimpleResult), който връща само състоянието след изпълнението на командата: успешно завършване на командата, броят на редовете, засегнати от командата (ако има някакъв ефект) и т.н.

2.3.2. Запитвания, връщащи данни: MySQL ++ Структури от данни

Най-лесният начин да получите набор от резултати е да използвате метода Query :: store (). Този метод връща обект StoreQueryResult, който произлиза от std :: vector , който е контейнер с произволен достъп, съставен от редове. От своя страна всеки обект Row е аналогичен на вектор (std :: vector) от низове (от тип String), по един обект за всяко поле в резултантния набор. По този начин можете да мислите за StoreQueryResult като двуизмерен масив, т.е. за да получите петото поле от втория ред, можете просто да напишете резултат. Можете също да се обърнете към полетата по техните имена, така че е възможна и следната форма на запис: резултат ["цена"].

Малко по-малко удобен начин за работа с набор от резултати е да използвате метода Query :: use (), който връща обект UseQueryResult. Този клас функционира като стандартен STL итератор. В този случай произволният достъп до данните вече няма да работи - вие последователно преминавате през редовете на набора от резултати с ограничение в посоката: само от началото до края. Няма начин да се върнете към вече преминатите редове и не знаете колко реда има в даден набор, докато не стигнете до последния ред. Като компенсация за тези неудобства получавате по-рационално използване на RAM, тъй като няма нужда да зареждате целия комплект в паметта. Това е особено важно, ако трябва да работите с изключително големи набори от резултати.

2.3.3. Запитвания, връщащи данни: SSQLS специализирани структури

Достъпът до резултатите от заявката чрез MySQL ++ структури от данни е доста ниско ниво на абстракция - по-добро от използването на MySQL C API, но не много. Възможно е логиката на решението да се доближи до предметната област на проблема с помощта на специализирани структури SSQLS (Специализирани SQL структури). Тези SSQLS обекти ви позволяват да дефинирате C++ структури, които съответстват на структурите на таблиците в конкретна схема на база данни. Освен това е много по-лесно да свързвате SSQLS обекти със стандартни STL контейнери (и следователно с алгоритми).

Предимството на този метод е, че програмата ще трябва да включва минимално количество SQL код. Можете да изпълните заявка и да получите резултата под формата на C++ структури от данни, достъпът до които не се различава от достъпа до всяка друга структура. Достъпът до получените данни може да бъде организиран чрез обекта Row или можете да използвате библиотечни методи за "изхвърляне" на резултатите в STL контейнер - с последователен, произволен или асоциативен достъп - изборът е ваш.

Помислете за следния код:

вектор резултат; запитване<< "SELECT * FROM stock"; query.storein(result); for(vector << "Цена: " << i->цена<< endl;

Почти "чист" C ++ код, без излишни излишъци.

Ако по някаква причина е нежелателно или невъзможно да се създават SSQLS обекти, съответстващи на структурите на таблици на базата данни, тогава можете да използвате обекта Row и горният кодов фрагмент вече ще изглежда така:

вектор резултат; запитване<< "SELECT * FROM stock"; query.storein(result); for(vector:: итератор i = result.begin (); i! = резултат.край (); i ++) cout<< "Цена: " << i->на ("цена")<< endl;

Разликите са малки. Първият фрагмент изглежда по-сбит, но това не засяга вътрешната логика.

2.4. Грешки и изключения

По подразбиране библиотеката хвърля изключения, когато се срещнат грешки. Ако е необходимо, можете да конфигурирате персонализиран флаг за грешка, който да се задава вместо хвърляне на изключения, но не забравяйте, че изключенията предоставят по-подробна информация. Можете да хванете различни видове грешки в рамките на един блок try-catch.

3. Прост пример за използване на MySQL ++

Следващият пример показва как да създадете (отворите) връзка с база данни, да изпълните проста заявка и да покажете резултатите - всичко това, за което говорихме досега.

#включи #включи #включи използване на пространство от имена std; int main (int argc, char * argv) (// установяване на връзка с тестовата база данни mysqlpp :: Connection con (false); if (con.connect ("test_db", "localhost", "tdb_user", "tdb_password") ) ) (// изпълнете заявката и изведете получените резултати mysqlpp :: Query query = con.query ("изберете име от dvd"); if (mysqlpp :: StoreQueryResult res = query.store ()) (cout<< "Коллекция DVD: " << endl; for(size_t i = 0; i < res.num_rows(); i++) cout << res[i] << endl; } else { cerr << "Ошибка при получении списка DVD: " << query.error() << endl; return -1; } return 0; } else { cerr << "Ошибка при установлении соединения с БД: " << con.error << endl; return -1; } }

За да работи примерът, трябва да създадете MySQL база данни с име test_db, съдържаща таблица с име dvd. Тази таблица може да има например следната структура:

име VARCHAR (50) жанр ТЕКСТ (70) цена РЕАЛНО закупено ДАТА

След като тестовата база данни test_db бъде създадена, администраторът на MySQL трябва да създаде потребител с разрешения за работа в нея. Потребителското име и паролата за този потребител вече са посочени в горния примерен изходен код.

СЪЗДАДЕТЕ ПОТРЕБИТЕЛ [защитен с имейл] IDENTIFIEDBY "tdb_password"; ПРЕДОСТАВЯТЕ ВСИЧКИ ПРИВИЛЕГИИ НА test_db. * TO [защитен с имейл];

След това потребителят tdb_user, свързан към базата данни test_db на локалния хост, може да създаде описаната по-горе dvd таблица и всякакви други таблици за тестване в нея, да направи промени в тези таблици, да ги изтрие и да извърши други операции.

Що се отнася до самата програма, тя иска само полето за име от dvd таблицата и от резултантния набор от резултати res последователно извежда всички редове (DVD заглавия). Примерът е много прост, но илюстрира три от четирите стъпки, споменати в началото на тази статия. Четвъртият етап - обработка на изключения - ще бъде обсъден в една от следващите статии от поредицата.

4. Заключение

Дори след първи, доста бегъл поглед върху функционалните свойства и характеристики на библиотеката MySQL ++, става ясно, че тя може да осигури значителна помощ на разработчиците на приложения, които взаимодействат с MySQL сървъри. Библиотеката е лесно адаптивна към нуждите на програмиста, не съдържа излишни излишни елементи и лесно се "вписва" в изходния код на C ++.

Тази статия разгледа общите характеристики на библиотеката MySQL ++, нейната функционалност. Като илюстрация беше предоставен прост пример за изходен код, използващ MySQL ++ обекти. Следващата статия от поредицата ще бъде посветена на персонализирането и адаптирането на библиотеката MySQL ++ в различни проекти. Третата статия ще опише подробно изпълнението на SQL заявки и обработката на резултатите от тях. Темата на четвъртата статия е обработката на грешки и използването на транзакции. В петата статия ще разгледаме различните типове данни и как да работим с тях. Специализираните формуляри за заявки са отделени специално внимание в шести член. В последната, седма статия от поредицата, ще бъде демонстрирано практическото използване на библиотеката MySQL ++ в многонишкови приложения.

Изтеглете ресурси

static.content.url = http://www.site/developerworks/js/artrating/

Зона = Linux, с отворен код

Идентификатор на статията = 497598

ArticleTitle = Практически MySQL ++, част 1: Първи стъпки

От автора:Наричаха ли ви чайник? Е, това е поправимо! Всеки самовар някога е бил чайник! Или всеки професионалист някога е бил самовар? Не, пак нещо не е наред! Като цяло MySQL е за начинаещи.

Защо манекените имат нужда от MySQL

Ако сериозно ще свържете живота си с интернет, тогава още при първите стъпки в "мрежата" ще срещнете тази СУБД. MySQL може спокойно да се нарече система за управление на база данни "всички Интернет". Нито един повече или по-малко сериозен ресурс не може без него, той присъства в административния панел на всеки хостинг. И най-вече популярните CMS и дори самостоятелно направени двигатели се изграждат с нейно участие.

По принцип не можете без тази платформа. Но за да го изучавате, вие също се нуждаете от правилния подход, правилните инструменти и най-важното желание и търпение. Надявам се да имате достатъчно от последното. И бъдете подготвени за факта, че мозъкът ви ще заври и парата ще излезе от главата ви, като от истински чайник

Но MySQL е толкова труден за манекени, само ако започнете да го учите погрешно. Няма да направим такава грешка и ще започнем запознаването си с тази технология от самото начало.

Основни понятия

Първо, нека преминем през основните понятия, които ще споменем в тази публикация:

Базата данни (DB) е основната съставна единица на СУБД. Базата данни включва таблици, които се състоят от колони и записи (редове). Клетките, образувани на пресечната точка, съдържат структурирани данни от определен тип.

СУБД (система за управление на бази данни) - набор от всички софтуерни модули за администриране на база данни.

SQL е структуриран език за заявки, с помощта на който разработчикът "комуникира" с ядрото (сървъра) на СУБД. Както всеки език за програмиране, SQL има собствен синтаксис, набор от команди и оператори, поддържани типове данни.

Мисля, че имаме достатъчно теоретични познания за начало. Ще „нарисуваме“ липсващите пропуски в теорията с практиката. Сега остава само да изберете правилния софтуерен инструмент.

Намиране на подходящия инструмент

След като доста "рових" в цялата гама от MySQL обвивки за начинаещи, разбрах, че те просто не съществуват. Всички софтуерни продукти за администриране на СУБД изискват вече инсталиран сървър на база данни. Като цяло реших още веднъж да не изобретявам „скутера“ и избрах вътрешния пакет Denwer. Можете да го изтеглите на официалния сайт.

Той вече включва всички компоненти на СУБД, което позволява на начинаещ да започне практическо запознаване с MySQL веднага след проста и разбираема инсталация. В допълнение, Denwer включва няколко други инструмента, необходими за начинаещ разработчик: локален сървър, PHP.

Първите стъпки

Няма да описвам процеса на инсталиране на "джентълменския" комплект, тъй като там всичко се случва автоматично. След като стартирате инсталацията, имайте време само да натиснете необходимите клавиши. Точно това, от което се нуждаете в фиктивната версия на MySQL.

Когато инсталационният процес приключи, стартирайте локалния сървър, изчакайте няколко секунди. След това въведете localhost в адресната лента на вашия браузър.

На страницата "Ура, работи!" последвайте един от връзките на снимката. След това ще бъдете отведени до phpMyAdmin - обвивка за администриране на база данни.

Щраквайки върху връзката http://downloads.mysql.com/docs/world.sql.zip, ще изтеглите примерна тестова база данни от официалния уебсайт на MySQL. Отидете отново на phpMyAdmin, в главното меню в горната част отидете на раздела "Импортиране". В прозореца "Импортиране в текущо" в първия раздел ("Файл за импортиране") задайте стойността "Преглед на вашия компютър".

В прозореца на Explorer изберете архива с изтеглената примерна база данни. Не забравяйте да кликнете върху "OK" в долната част на главния прозорец.

Съветвам ви засега да не променяте посочените стойности на параметрите. Това може да доведе до неправилно показване на данните на импортирания източник. Ако phpMyAdmin даде грешка, че не може да разпознае алгоритъма за компресиране на базата данни, тогава го разархивирайте и повторете целия процес на импортиране отначало.

Ако всичко е минало добре, тогава в горната част ще се появи съобщението на програмата, че импортирането е било успешно, а вляво в списъка с DB има още една (дума).

Нека разгледаме структурата му отвътре, за да можете по-ясно да си представите с какво ще трябва да се справите.

Щракнете върху името на MySQL Database за начинаещи. Под него ще се покаже списък с таблици, от които се състои. Кликнете върху един от тях. След това отидете на горния елемент от менюто "Структура". Основната работна област показва структурата на таблицата: всички имена на колони, типове данни и всички атрибути.

РАБОТА С MySQL БАЗА ДАННИ С PHP

Лекция. Подготвен от В. С. Прохоров


1. СВЪРЗВАНЕ НА PHP СЦЕНАРИИ КЪМ MySQL таблици

Нека разгледаме най-често използваните функции, които ви позволяват да работите с MySQL база данни с помощта на PHP.

Когато PHP и MySQL взаимодействат, програмата взаимодейства с СУБД чрез набор от функции.

1.1 Свързване със сървъра. Функция mysql_connect

Преди да работите с базата данни, е необходимо да установите мрежова връзка с нея, както и да оторизирате потребителя. Това се прави с помощта на функцията mysql_connect ().

ресурс mysql_connect (]])

Тази функция установява мрежова връзка с базата данни MySQL, разположена на хоста на сървъра $ (по подразбиране това е localhost, т.е. текущия компютър) и връща идентификатора на отворената връзка. Цялата по-нататъшна работа се извършва с този идентификатор. Всички други функции, които приемат този идентификатор (дескриптор) като аргумент, ще идентифицират уникално избраната база данни. При регистрация се посочва потребителското име $ потребителско име и парола $ парола (по подразбиране потребителското име, от което се стартира текущият процес - при отстраняване на грешки скриптове: root и празна парола):

$ dbpasswd = ""; //Парола

// Показване на предупреждение

ехо ("

");

Променливите $ dblocation, $ dbuser и $ dbpasswd съхраняват името на сървъра, потребителското име и паролата.

1.2 Прекъсване на връзката със сървъра. Функция mysql_close

Връзката със сървъра MySQL ще бъде автоматично затворена, когато скриптът приключи или когато функцията mysql_close бъде извикана

bool mysql_close ()

Тази функция прекъсва връзката с MySQL сървъра и връща true, ако операцията е успешна, и false в противен случай. Функцията приема като аргумент манипулатор на връзката към базата данни, върната от функцията mysql_connect.

$ dblocation = "localhost"; // Име на сървъра

$ dbuser = "корен"; //Потребителско име

$ dbpasswd = ""; //Парола

// Свързване към сървъра на базата данни

// Потиска изхода за грешка със символа @, преди да извикате функцията

$ dbcnx = @ mysql_connect ($ dblocation, $ dbuser, $ dbpasswd);

if (! $ dbcnx) // Ако дескрипторът е 0, връзката не е установена

// Показване на предупреждение

ехо ("

Сървърът на базата данни в момента не е наличен, така че страницата не може да се покаже правилно.");

if (mysql_close ($ dbcnx)) // затваряне на връзката

echo („Връзката с базата данни е прекратена“);

echo ("Не може да се завърши връзката");

1.3 Създаване на база данни. Функция СЪЗДАВАНЕ НА БАЗА ДАННИ

Командата - създаване на база данни е достъпна само за администратора на сървъра и на повечето хостинги не може да бъде изпълнена:

CREATE DATABASE Име на база данни

Създава нова база данни с име DatabaseName.

Пример за работа с тази функция:

@mysql_query ("СЪЗДАВАНЕ НА БАЗА ДАННИ $ dbname");

Препоръчва се навсякъде да се използват апострофи ("SQL - команда") като разделители за редове, съдържащи SQL - команди. Това може да гарантира, че нито една променлива $ - не е случайно интерполирана (т.е. не е заменена със стойността си) и безопасността на скриптовете ще се увеличи.

Командата за създаване на база данни CREATE DATABASE е достъпна само за суперпотребителя и на повечето хостинг сайтове е невъзможно обикновен потребител да я изпълни. Той е достъпен само за администратора на сървъра.

За експериментиране, нека създадем тестова база данни, като изпълним SQL заявка от командния ред. За да направите това, трябва да влезете в MySQL и да въведете в командния ред на MySQL:

mysql> създайте тестова база данни;

След това трябва да напишете:

mysql> използвайте тестова база;

Създадена база данни:



1.4 Избор на база данни. Функция mysql_select_db

Преди да изпратите първата заявка към MySQL сървъра, трябва да посочите с коя база данни ще работим. Функцията mysql_select_db е предназначена за това:

bool mysql_select_db (низ $ database_name [, ресурс $ link_identifier])

Той уведомява PHP, че по-нататъшните операции на връзката $ link_identifier ще използват базата данни $ database_name.

Използването на тази функция е еквивалентно на извикване на командата use в SQL заявка, тоест функцията mysql_select_db избира база данни за по-нататъшна работа и всички следващи SQL заявки се прилагат към избраната база данни. Функцията приема като аргументи името на базата данни за избор, базата_име и ресурса на дескриптора на връзката. Функцията връща true, ако операцията е успешна и false в противен случай:

// Код за връзка с база данни

ако (! @mysql_select_db ($ dbname, $ dbcnx))

// Показване на предупреждение

ехо ("

Базата данни в момента не е налична, така че страницата не може да се покаже правилно.");

1.5 Обработка на грешки

Ако в процеса на работа с MySQL възникнат грешки (например скобите не са балансирани в заявката или няма достатъчно параметри), тогава съобщението за грешка и неговият номер могат да бъдат получени с помощта на двете функции, описани по-долу.

Важно е да използвате тези функции внимателно и своевременно, защото в противен случай може да бъде трудно да отстраните грешките в скриптовете си.

● Функция:

int mysql_errno ()

връща номера на последната регистрирана грешка. Идентификаторът на връзката $ link_identifier може да бъде пропуснат, ако по време на операцията на скрипта е установена само една връзка.

● Функция:

низ mysql_error ()

връща не число, а низ, съдържащ текста на съобщението за грешка. Той е полезен за целите на отстраняване на грешки. Обикновено mysql_error се използва във връзка с конструкцията or die (), например:

@mysql_connect ("localhost", "user", "password")

or die ("Грешка при свързване към базата данни:" .mysql_error ());

Операторът @, както обикновено, служи за потискане на стандартното предупреждение, което може да възникне в случай на грешка.

В последните версии на PHP предупрежденията за функцията на MySQL не се записват по подразбиране.

1.6 Автоматизиране на връзката с MySQL. Файл ( config.php )

Обикновено на сайта има няколко скрипта, които се нуждаят от достъп до една и съща база данни.

Препоръчително е кодът, отговорен за свързването с MySQL, да се отдели в отделен файл и след това да се включи с необходимите скриптове с помощта на функцията за включване.

Има смисъл да поставите функциите за свързване, избор и създаване на база данни в същия файл (config.php), където са декларирани променливи с името на сървъра $ dblocation, потребителско име $ dbuser, парола $ dbpasswd и име на база данни $ dbname:

Списък config.php:

//config.php код на файла, съдържащ параметрите за свързване със сървъра и избор на база данни

// отпечатва съобщения за грешка при свързване в браузъра

$ dblocation = "localhost"; // Име на сървъра

$ dbname = "вмъкнете име на база данни" // Име на базата данни: създадено или вече съществуващо

$ dbuser = "корен"; // Потребителско име на базата данни

$ dbpasswd = ""; //Парола

// Свързване към сървъра на базата данни

// Потиска изхода за грешка със символа @, преди да извикате функцията

[защитен с имейл] _connect ($ dblocation, $ dbuser, $ dbpasswd);

if (! $ dbcnx) // Ако манипулаторът е 0, връзката със сървъра на базата данни не е установена

// Показване на предупреждение

ехо ("

Сървърът на базата данни в момента не е наличен, така че страницата не може да се покаже правилно.

");

// Създаване на база данни $ dbname - само суперпотребител може да направи това

// Ако базата данни вече съществува, ще има нефатална грешка

@mysql_query ("СЪЗДАЙТЕ БАЗА ДАННИ, ако не съществува $ dbname ');

// Код за свързване към базата данни: избираме недвусмислено новосъздадена база данни или съществуваща база данни

// Потиска изхода за грешка със символа @, преди да извикате функцията

ако ( [защитен с имейл] _select_db ($ dbname, $ dbcnx)) // Ако дескрипторът е 0, не е установена връзка с базата данни

// Показване на предупреждение

ехо ("

Базата данни в момента не е налична, така че страницата не може да се покаже правилно.

");

// Малка помощна функция, която отпечатва съобщение

// за грешка в случай на грешка в заявката към базата данни

грешка на функцията ($ съобщение)

ехо ("");



2. ИЗПЪЛНЕНИЕ НА ЗАЯВКИ КЪМ БАЗА ДАННИ

2.1 Създаване на таблица. Функция СЪЗДАВАНЕ НА ТАБЛИЦА:

CREATE TABLE Име на таблица (тип FieldName, FieldName тип,)

Тази команда създава нова таблица в базата данни с колони (полета), дефинирани от техните имена (FieldName) и посочените типове. След като създадете таблица, можете да добавите записи към нея, състоящи се от полетата, изброени в тази команда.

Обява test_11.php. Програмата, която създава нова таблица в базата данни:

включва "config.php"; // Свържете се със сървъра и изберете база данни

mysql_query ("СЪЗДАЙТЕ ТАБЛИЦА, ако не съществуват хора

id INT AUTO_INCREMENT ПЪРВИЧЕН КЛЮЧ,

или умре ("MySQL грешка:" .mysql_error ());



Този скрипт създава нова таблица с хора с две полета. Първото поле е от тип INT (цяло число) и името е id. Вторият е типът TEXT (текстов низ) и името на името.

Ако таблицата съществува, или die () ще се задейства.

Незадължителната клауза if not exists, ако е посочена, казва на MySQL сървъра да не генерира съобщение за грешка, ако таблица с посоченото име вече съществува в базата данни.

Оптимално използване на MySQL

Въведение

За да започнете да работите с MySQL, трябва да изтеглите тази база данни, да инсталирате, конфигурирате и проучите документацията.

В процеса на предоставяне на хостинг услуги, ние обръщаме внимание на най-често срещаните грешки, които потребителите допускат при разработването на своите виртуални сървъри. Едно от "трудните" места за типичен уеб администратор е работата с MySQL сървър. Обикновено изучаването на принципите на функциониране на SQL и методите за работа с бази данни се извършва според литературата, от която се избират само нещата, които са релевантни към момента на четене - как да се свържете с базата данни, как да направите запитване, как да актуализирате информация или да добавите нов запис към базата данни и т.н.

Този подход, разбира се, дава желания резултат - интерфейсите на потребителския уебсайт се интегрират с базата данни. Въпреки това, потребителите не винаги мислят за това колко оптимално работи тяхната база данни, как да оптимизират процесите, протичащи при работа с MySQL, и какво ще бъде функционирането на виртуален сървър с повишено натоварване, "приток" на потребители в резултат, например за "промоция" на сайта.

Тази статия ще ви помогне да оптимизирате работата си с MySQL СУБД. Представеният материал не претендира да бъде подробно описание на оптимизацията на MySQL като цяло, а само привлича вниманието към най-честите грешки, допускани от потребителите и казва как да ги избегне. Можете да научите повече за тънкостите на конфигурирането на MySQL на специализирани страници, връзки към които са дадени в края на тази статия.

Какви данни трябва да се съхраняват в MySQL

Не се опитвайте да поставите цялата информация, която имате в базата данни. Например, не е нужно да съхранявате снимки там, въпреки че MySQL го позволява. Поставяйки двоични изображения на графични файлове в базата данни, вие само ще забавите работата на вашия сървър. Четенето на файл с изображение от диска е много по-лесно и по отношение на изразходваните ресурси, по-икономично от свързването от скрипт към SQL, отправяне на заявка, получаване на изображение, обработката му и, издаване на необходимите http-заглавки, показване го на посетител на уеб сървър. Във втория случай операцията по показване на картина ще изисква няколко пъти повече ресурси на процесора, паметта и диска. Също така си струва да запомните, че има механизми за кеширане на уеб документи, които позволяват на потребителя да пести трафик, а с динамично генериране на съдържание вие ​​всъщност лишавате посетителите си от тази удобна възможност.

Вместо снимки е по-добре да съхранявате информация в MySQL, въз основа на която можете да генерирате връзки към статични снимки в документи, динамично създадени от скриптове.

Оптимизиране на заявки

В ситуации, в които наистина трябва да получите само определена част от данни от MySQL, можете да използвате клавиша LIMIT за функцията SELECT. Това е полезно, когато например искате да покажете резултатите от търсене на нещо в базата данни. Да приемем, че базата данни съдържа списък с продукти, които предлага вашият онлайн магазин. Донякъде нехуманно е да се показва целия списък със стоки в желаната категория по отношение на потребителя - не всеки има бързи канали за комуникация с интернет, а издаването на допълнителни сто килобайта информация често принуждава потребителя да похарчи повече от един минута чакане за резултатите от зареждането на страницата. В такива ситуации информацията се дава на части от, да речем, 10 позиции. Грешно е да изберете цялата информация от базата данни и да филтрирате изхода от скрипта. Много по-оптимално би било да направите заявка за формуляра

изберете добро, цена от книги ограничение 20,10

В резултат на това MySQL ще ви "даде" 10 записа от базата данни, започвайки от 20-та позиция. След като предоставите резултата на потребителя, направете връзки "Следващи 10 продукта", като параметър, предайте на скрипта следващата позиция, от която ще се показва списъкът с продукти, и използвайте този номер при генериране на заявка към MySQL.

Също така трябва да запомните, че когато пишете заявки към база данни (SQL заявки), трябва да поискате само информацията, която наистина ви е необходима. Например, ако в базата данни има 10 полета и в момента наистина трябва да получите само две от тях, вместо заявка

изберете * от име_на_таблица

използвайте конструкция като

изберете поле1, поле2 от име_таблица

По този начин няма да претоварвате MySQL с ненужна работа, да заемате допълнителна памет и да извършвате допълнителни дискови операции.

Трябва също да използвате клавиша WHERE, където трябва да получите информация, която съответства на определен шаблон. Например, ако трябва да получите от базата данни полета с имената на книги, автор на Иванов, трябва да използвате конструкция като

изберете заглавие от книги, където автор = "Иванов"

Има и клавиш LIKE, който ви позволява да търсите полета, чиито стойности са "подобни" на даден модел:

изберете заглавие от книги, където автор като "Иванов%"

В този случай MySQL ще покаже заглавията на книги със стойности на полето за автор, започващи с „Иванов“

.

Ресуроемки операции

Трябва обаче да се помни, че има операции, чието изпълнение само по себе си изисква повече ресурси, отколкото за нормалните заявки. Например, използването на операция DISTINCT на функция SELECT консумира много повече процесорно време от нормалното SELECT. DISTINCT се опитва да намери уникални стойности, като често прави много сравнения, замествания и изчисления. Освен това, колкото по-голямо е количеството данни, към което се прилага DISTINCT (в края на краищата, вашата база данни нараства с течение на времето), толкова по-бавно ще се изпълнява такава заявка и нарастването на ресурсите, необходими за изпълнение на такава функция, далеч не е пряко пропорционално на обема на съхраняваните и обработвани данни, но много по-бързо.

Индекси

Индексите се използват за по-бързо търсене по стойността на едно от полетата. Ако не е създаден индекс, MySQL сканира всички полета последователно от първия запис до последния, сравнявайки избраната стойност с оригинала. Колкото по-голяма е таблицата и колкото повече полета съдържа, толкова по-дълго отнема изборът. Ако дадена таблица има индекс на въпросната колона, тогава MySQL може бързо да се позиционира до физическото местоположение на данните, без да се налага да прави пълно сканиране на таблицата. Например, ако таблицата има 1000 реда, тогава скоростта на търсене ще бъде поне 100 пъти по-бърза. Тази скорост ще бъде още по-висока, ако има нужда да се адресират всички 1000 колони наведнъж, т.к в този случай не се губи време за позициониране на твърдия диск.

В какви ситуации е препоръчително да създадете индекс:

  1. Бързо търсене на редове при използване на клаузата WHERE
  2. Намерете редове от други таблици, когато извършвате обединяване
  3. Намиране на MIN () или MAX () стойност за индексирано поле
  4. Сортиране или групиране на таблицата в случай, че се използва индексирано поле
  5. В някои случаи необходимостта от достъп до файла с данни е напълно загубена. Ако всички използвани полета за дадена таблица са числови и образуват левостранен индекс за някакъв ключ, тогава стойностите могат да бъдат върнати изцяло от индексното дърво с много по-бърза скорост.
  6. Ако запитвания като
    SELECT * FROM tbl_name WHERE col1 = val1 И col2 = val2;
    и има смесен индекс за col1 и col2, тогава данните ще бъдат върнати директно. Ако са създадени отделни индекси за col1 и col2, тогава оптимизаторът ще се опита да намери най-ограничения индекс, като определи кой индекс може да намери по-малко редове и ще използва този индекс за извличане на данните.
    Ако таблицата има смесен индекс, тогава ще се използва всяко ляво съвпадение спрямо съществуващия индекс. Например, ако има смесен индекс от 3 полета (col1, col2, col3), тогава търсенето в индекс може да се извърши на полетата (col1), (col1, col2) и (col1, col2, col3).

Повече за индексирането

Поддръжка за свързване

Както вероятно знаете, за да работите с MySQL сървъра, първо трябва да установите връзка с него, като предоставите потребителско име и парола. Процесът на установяване на връзка може да отнеме много повече време от директната обработка на заявка към базата данни след установяване на връзката. Следвайки логиката, е необходимо да избягвате ненужни връзки към базата данни, без да прекъсвате връзката с нея, където може да се направи, ако в бъдеще планирате да продължите да работите със SQL сървъра. Например, ако вашият скрипт е установил връзка с базата данни, направил е подбор на данни за анализ, не е необходимо да затваряте връзката с базата данни, ако планирате да поставите резултатите от анализа в базата данни по време на работа на същата скрипт.

Възможно е също така да се поддържа така наречената постоянна (постоянна) връзка с базата данни, но това е напълно възможно при използване на по-сложни среди за програмиране от php или perl в нормален CGI режим, когато интерпретаторът на съответния език се стартира веднъж от уеб сървъра, за да изпълни входящата заявка.