MySQL is een open source pakket. MySQL-functies en -toepassingen

Andrey Klochkov

Wat is MySQL

Voordat u beslist of u het MySQL-pakket als databaseserver wilt gebruiken, moet u eerst weten wat het is. MySQL is een relationeel databasebeheersysteem.

MySQL ondersteunt SQL (Structured Query Language) en kan als SQL-server worden gebruikt. Dit betekent dat je in SQL met de server kunt communiceren: de client stuurt een verzoek naar de server, de server verwerkt het en geeft de klant alleen de gegevens die naar aanleiding van dit verzoek zijn ontvangen. De klant hoeft dus geen gegevens te downloaden en berekeningen uit te voeren, zoals bijvoorbeeld in Microsoft Access.

Bovendien is MySQL open source software, d.w.z. het kan vrij worden bestudeerd en gewijzigd. Het pakket wordt gedistribueerd onder de voorwaarden van de GPL (General Public License) en kan gratis worden gedownload van internet (http://www.mysql.com) voor niet-commercieel gebruik.

Met de komst van internettechnologieën die het mogelijk maken om dynamische webpagina's te maken, is de vraag naar DBMS'en die hier qua snelheid, betrouwbaarheid en stabiliteit het meest geschikt voor zijn enorm toegenomen. En hier bleek het MySQL-pakket goed te zijn, dat snel, eenvoudig en betrouwbaar bleek te zijn, maar door de verslechtering van de functionaliteit (laten we gewoon een reservering maken dat de MySQL-ontwikkelaars beloven de ontbrekende functies toe te voegen in de volgende versies van het programma).

Over het algemeen levert het ontbreken van sommige functies die zijn opgeofferd voor snelheid en betrouwbaarheid niet veel problemen op voor gebruikers (hoewel er soms wat ongemak is). Voor het werken met een volwaardige bedrijfsdatabase schiet MySQL tekort, maar MySQL kan de dagelijkse taken redelijk goed aan.

nadelen

Hier is een korte lijst van de belangrijkste functies die MySQL mist.

Transacties- u kunt meerdere SQL-query's combineren in één werkeenheid en, als een van de query's in deze unit mislukt, terugdraaien om de gegevens in de oorspronkelijke staat terug te brengen. Laten we het uitleggen met een voorbeeld.

Het is noodzakelijk om geld van de ene rekening op te nemen en op een andere te zetten. Om dit te doen, moet u twee SQL-query's uitvoeren: de eerste is om geld van de ene rekening op te nemen en de tweede is om ze op een andere rekening te crediteren. Als u geen transacties toepast, wordt het geld, als het tweede verzoek mislukt, van de rekening afgeschreven, maar niet op een andere rekening bijgeschreven. Door het gebruik van transacties kunt u terugdraaien, alsof het geld helemaal niet van de rekening is afgeschreven.

Merk op dat u een transactie kunt emuleren met de opdracht LOCK TABLES in MySQL. Deze opdracht vergrendelt de tabel terwijl de query's worden uitgevoerd, waardoor de gegevensintegriteit wordt gegarandeerd, maar kan nog steeds niet worden teruggedraaid.

Triggers- dienen om het toezicht op de status en werking van de database te automatiseren. De trigger wordt opgeslagen in de database en wordt geactiveerd wanneer een bepaalde gebeurtenis plaatsvindt. Laten we hetzelfde voorbeeld van geldoverdracht nemen: als het tweede verzoek mislukt, wordt een trigger geactiveerd en ofwel teruggedraaid ofwel een bericht naar de DBA gestuurd.

Opgeslagen procedures- Dit zijn meerdere SQL-commando's die onder een bepaalde naam in de database worden opgeslagen en samen een bepaalde functie vervullen. Opgeslagen procedures kunnen de SQL-syntaxis uitbreiden zodat deze lijkt op een algemene programmeertaal (zoals Oracle PL / SQL). In ons voorbeeld van geldoverdracht kunnen twee SQL-query's onder dezelfde naam worden opgeslagen en deze procedure vervolgens aanroepen, waarbij twee rekeningnummers en het geldbedrag als parameters worden doorgegeven. Dan zouden beide verzoeken in één transactie worden uitgevoerd.

Geneste zoekopdrachten- hiermee kunt u dynamisch waarden in de selectievoorwaarden vervangen op basis van de resultaten van een andere zoekopdracht. Volgens de auteur, als je op de een of andere manier zonder al het bovenstaande kunt, bederft de afwezigheid van geneste vragen het leven soms erg. Als u bijvoorbeeld wilt weten welke auto meer vracht heeft vervoerd dan het gemiddelde voor het wagenpark, moet u de volgende SQL-query uitvoeren:

KIES auto VAN autopark WAAR massa> Meer dan wat? Ik heb geen idee wat het gemiddelde is!

Hiervoor moet de gemiddelde waarde in het massaveld worden berekend:

SELECT AVG (massa) UIT autopark

Als geneste query's worden ondersteund, kunnen de twee query's worden genest:

SELECT auto FROM autopark WHERE massa> (SELECT AVG (massa) FROM autopark)

Maar in het geval van MySQL moet de gemiddelde waarde afzonderlijk worden gevonden en rechtstreeks in het CGI-script in een andere query worden vervangen, wat ongetwijfeld van invloed is op de prestaties.

UNION-verklaring- Simpel gezegd, het combineert de uitvoer van verschillende zoekopdrachten in één, met de mogelijkheid om dubbele rijen te elimineren.

Trapsgewijze gegevensvernieuwing- hiermee kunt u gerelateerde gegevens verwijderen en bijwerken. Als u bijvoorbeeld een klantrecord uit de database verwijdert, worden alle orderrecords voor die klant automatisch verwijderd uit de gerelateerde tabellen.

Voordelen:

Laten we nu de voordelen van MySQL opsommen.

Prestaties op hoge snelheid. Dankzij het interne multithreading-mechanisme zijn de MySQL-prestaties erg hoog.

Veiligheid. Een redelijk hoog beveiligingsniveau wordt geboden door de mysql-database, die wordt gemaakt wanneer het pakket wordt geïnstalleerd en vijf tabellen bevat. Aan de hand van deze tabellen kun je beschrijven welke gebruiker van welk domein met welke tabel kan werken en welke commando's hij kan gebruiken. Wachtwoorden die zijn opgeslagen in een database kunnen worden gecodeerd met behulp van de ingebouwde MySQL-wachtwoordfunctie ().

Vergunning. In het verleden was MySQL-licentieverlening een beetje verwarrend; dit programma wordt nu gratis verspreid voor niet-commerciële doeleinden.

Open source-code. Hierdoor kunt u zelf de gewenste functies aan het pakket toevoegen en de functionaliteit naar behoefte uitbreiden. Overigens kunnen de MySQL-auteurs dit tegen betaling zelf voor je doen. Om een ​​MySQL-extensie te bestellen bij de pakketmakers, gaat u gewoon naar http://www.mysql.com en vult u het juiste formulier in.

Betrouwbaarheid. De makers van MySQL hebben geweldig werk geleverd: voor zover ik weet is dit pakket vrij stabiel en moeilijk te breken. Ik volg niet specifiek de samenvatting van de resultaten van hackeraanvallen op MySQL, maar ik ben nog nooit (in tegenstelling tot dezelfde webservers) een bericht tegengekomen dat MySQL is beschadigd als gevolg van iemands kwade bedoelingen.

Bronnen. Dit kan van verschillende factoren afhangen, maar een supercomputer heb je sowieso niet nodig.

Gemeenschap. Als gevolg van de openheid van de code, het gratis programma, het stabiele en betrouwbare werk ervan, heeft zich een gemeenschap van mensen gevormd die niet alleen loyaal zijn aan MySQL, maar ook op alle mogelijke manieren deelnemen, zowel aan de ontwikkeling van het pakket zelf als aan om minder ervaren mensen ermee te leren werken. Er is een enorm aantal mailinglijsten en conferenties waar u op elk moment van de dag gratis hulp kunt krijgen.

Draagbaarheid. Momenteel zijn er versies van het programma voor de meest voorkomende computerplatforms. Dit betekent dat u niet wordt gedwongen in een specifiek besturingssysteem. Je kunt zelf kiezen waar je mee wilt werken, bijvoorbeeld met Linux of Windows, maar ook als je het besturingssysteem vervangt, raak je je data niet kwijt en heb je zelfs geen extra tools nodig om het over te zetten.

Ik weet niet of het een nadeel of een voordeel is, het feit dat MySQL geen grafische gebruikersinterface (GUI) heeft. Ik vind het bijvoorbeeld handiger om een ​​SQL-query handmatig te schrijven (de resultaten van de uitvoering ervan kunnen trouwens worden omgeleid naar een bestand) dan om de query-wizard te gebruiken, zoals in Microsoft SQL Server.

Er zijn verschillende GUI-clientprogramma's voor MySQL, maar ze zijn verre van perfect en vertragen meestal alleen maar. Als je de voorkeur geeft aan een GUI, raad ik aan deze programma's te downloaden en uit te proberen om hun makers aan te moedigen hun producten verder te verbeteren. Hier is een verre van volledige lijst van GUI-programma's:

  • Winmysqladmin - opgenomen in de Windows-distributie van MySQL, heeft een standaard grafische interface en stelt u in staat MySQL te beheren;
  • MySqlManager - opgenomen in de Windows-distributie van MySQL, heeft clientfuncties (maar de auteur was niet in staat om er iets serieus mee te doen);
  • MySQL Administrator voor Windows is een meer "geavanceerd" hulpprogramma van derden. Hiermee kunt u zich registreren en verbinding maken met meerdere MySQL-servers tegelijk, de structuur van databases en tabellen maken, verwijderen en wijzigen, sleutels in tabellen maken, SQL-query's schrijven en deze in een bestand opslaan:
  • XMySQL is een MySQL-client voor X Window-achtige systemen. Biedt volledige toegang tot tabellen, laat bulksgewijs invoegen en verwijderen toe, en heeft een queryontwerper en pakketbeheerfunctionaliteit. Het programma is te vinden op http://web.wt.net/~dblhack/.

Een meer complete lijst van allerlei hulpprogramma's voor MySQL (en het is erg groot) is beschikbaar op http://www.mysql.com/downloads/. Daar vind je heel wat interessante en nuttige dingen: data-export van MySQL naar Microsoft Access en vice versa, ODBC-stuurprogramma's, enz.

Ondanks het ontbreken van een grafische interface, wordt MySQL geleverd met een aantal behoorlijk krachtige beheertools voor de opdrachtregel. Hieronder vindt u een lijst met korte beschrijvingen van de hulpprogramma's.

  • MySQLAdmin is de belangrijkste MySQL-beheertool. Hiermee kunt u databases maken, vernietigen, wijzigen en heeft u volledige controle over uw server.
  • MySQLDump is een hulpprogramma voor gegevensback-up.
  • MySQLAccess - Hiermee kunt u tabellen met toegangsrechten wijzigen en hun inhoud in een gemakkelijk leesbare vorm weergeven.
  • MySQLBug - In het geval van een bug in MySQL, genereert dit hulpprogramma een bugrapport voor programmaontwikkelaars, en stuurt dit ook naar de MySQL-mailinglijst zodat specialisten kunnen helpen bij het oplossen van uw probleem.
  • MySQLImport - Importeert gegevens uit een gescheiden bestand in de database.
  • MySQLShow - toont de structuur van databases en tabellen waaruit ze zijn samengesteld.

Ik wil de aandacht van de lezer vestigen op het volgende: nu zijn er programma's die werken via de CGI-interface, die een bijna compleet pakket aan databasebeheerdiensten bieden. Deze programma's worden gehost op webservers en zijn gewoon CGI-scripts. Heel vaak bevinden deze scripts zich in openbaar toegankelijke mappen. Het gevaar is dat iedereen met behulp van zoekmachines dergelijke programma's op bestandsnaam kan vinden en vervolgens met uw database kan doen wat hun hartje begeert. Dit probleem kan eenvoudig worden omzeild door deze scripts in met een wachtwoord beveiligde mappen op de server te plaatsen. Maar de beste oplossing is om helemaal te stoppen met het gebruik van dergelijke programma's op de server.

MySQL heeft ook zijn eigen SQL-taalextensie. Deze functies kunnen op twee manieren in een query worden gebruikt. Ten eerste als een opgehaalde waarde: de functie wordt opgenomen in de lijst met opgehaalde velden. De retourwaarde van de functie wordt berekend voor elk record in de tabel en weergegeven alsof het een tabelveld is. Laten we bijvoorbeeld de titel van het artikel en de lengte ervan weergeven:

KIES titel, LENGTH (titel) UIT tabel

Als resultaat krijgen we twee kolommen, waarvan er één uit de tabel is gehaald en de tweede is berekend.

Ten tweede kan de functie worden gebruikt als onderdeel van de WHERE-component - in dit geval zal het de constante vervangen op het moment dat de query wordt uitgevoerd. Laat me het uitleggen met een voorbeeld: je moet gebeurtenissen vinden die meer dan een dag geleden hebben plaatsgevonden.

SELECT event FROM tabel WHERE time> (Unix_TIMESTAMP () - (60 * 60 * 24))

Hier berekent de functie Unix_TIMESTAMP () de huidige tijd, waarvan we één dag aftrekken.

Sollicitatie

Volgens de auteur is internet het meest geschikte toepassingsgebied voor MySQL, dankzij het goede beveiligingssysteem van dit pakket, de stabiele werking en de hoge prestaties. Als uw internetproject geen transacties meer heeft, kunt u Postgres gebruiken. Postgres is in veel opzichten vergelijkbaar met MySQL, praktisch niet onderdoen voor prestaties, maar het heeft meer functionaliteit. De ervaring leert echter dat MySQL voldoende mogelijkheden heeft voor eenvoudige internetprojecten.

Wat betreft het gebruik van MySQL als bedrijfsdatabase is de situatie hier niet erg gunstig. We zullen de vereisten voor de SQL-server van de bedrijfsdatabase formuleren op basis van de specifieke kenmerken van het werk van medewerkers, en vanuit het oogpunt van deze vereisten MySQL evalueren.

De mogelijkheid om met meerdere gebruikers te werken. Deze voor de hand liggende eis moet worden aangevuld met het feit dat het databasegebruik in dit geval veel hoger zal zijn dan op de webserver. Inderdaad, voor een website wordt 20 bezoekers tegelijkertijd als een groot succes beschouwd, en in het geval van een zakelijke basis kan zelfs een klein bedrijf bogen op een dergelijke indicator. Er moet speciale aandacht worden besteed aan het feit dat de bedrijfsdatabase complexere gebruikersinterfaces gebruikt dan de pagina's op de site; met andere woorden, het stuurt verzoeken intensiever naar de server. In technische termen betekent dit dat je een slot nodig hebt op het niveau van het veranderlijke record. Dit is waar MySQL het niet goed doet: het vergrendelen gebeurt op tafelniveau. Dit betekent met name dat als iemand een bestelling invoert, alle vragen (statistieken analyseren, records selecteren voor een rapport, etc.) moeten wachten tot de bestelling is afgerond. In het geval van een bedrijfsdatabase doet dit zelfs het prestatievoordeel van MySQL teniet.

Controle van gegevensintegriteit op SQL-serverniveau. Een bedrijfsdatabase heeft een complex gegevensschema en het is erg moeilijk om de gegevensintegriteit te handhaven door middel van een clientprogramma: één relationeel kan vijf tot zeven tabellen samenvoegen en het aantal tabellen kan oplopen tot 30-40. En in dit geval wordt het gebrek aan vermogen van MySQL om updates en verwijderingen van records in gerelateerde tabellen trapsgewijs te laten verlopen, essentieel.

Bovendien hebben we al vermeld dat de bedrijfsdatabase een complexere interface gebruikt, en deze omstandigheid genereert nog twee vereisten: ondersteuning voor alle standaard SQL-instructies (en nuttige uitbreidingen), evenals het gebruik van opgeslagen procedures en triggers. Helaas maakt MySQL ons hier ook niet blij.

Als we al het bovenstaande samenvatten, kunnen we concluderen dat voor de meeste internetprojecten de mogelijkheden van het MySQL DBMS voldoende zijn. Ze zullen voldoende zijn om het adresboek op te slaan in het interne netwerk van de onderneming.

Praktisch gebruik van MySQL ++

Deel 1. Waar te beginnen

Inhoud serie:

De overgrote meerderheid van de applicaties maakt in meer of mindere mate gebruik van een database in het proces. Bij het ontwikkelen van dergelijke applicaties zijn tools die de interactie met verschillende DBMS'en vereenvoudigen, erg handig. Een van deze tools is de MySQL++-bibliotheek, waarmee u de toegang tot MySQL-databases effectief kunt organiseren vanuit programma's die zijn geschreven in de C++-taal. Ik zal proberen de functionaliteit van deze bibliotheek, de voor- en nadelen ervan, in detail te analyseren. Ik zal beginnen met de algemene kenmerken van MySQL++.

1. Wat is MySQL ++

MySQL++ is een gespecialiseerde bibliotheek van zogenaamde wrapper-methoden voor de MySQL C API. Het belangrijkste doel van deze bibliotheek is om het werken met SQL-query's net zo eenvoudig te maken als het werken met STL-containers.

De meest recente versie van de MySQL++-bibliotheek is te vinden op de officiële website. Om bijkomende complicaties te vermijden, is het echter het beste om de pakketrepository voor uw distributie te raadplegen.

1.1. Een beetje geschiedenis

In 1998 begon Kevin Atkinson met het ontwikkelen van een bibliotheek die, volgens zijn oorspronkelijke concept, de uitvoering van SQL-query's en de verwerking van hun resultaten zou bieden zonder gebonden te zijn aan een bepaald DBMS. Dit kwam zelfs tot uiting in de oorspronkelijke naam - SQL ++. Alle versies vóór 1.0 zijn het resultaat van Kevin's individuele werk.

In 1999 nam MySQL AB de bibliotheek over. Aanvankelijk deed Michael "Monty" Widenius een deel van het werk, daarna delegeerde hij de bevoegdheid aan een andere MySQL AB-medewerker, Sinisha Milivojevic. Versie 1.0 en 1.1 werden uitgebracht, waarna Atkinson officieel alle functies van het onderhouden van de bibliotheek in handen van Milivoevich overdroeg en zichzelf volledig afsloot van elke deelname aan dit project. Milivoevich bracht de bibliotheek naar versie 1.7.9, die werd uitgebracht medio 2001. Tegen die tijd werd het duidelijk dat het onmogelijk was om een ​​universele bibliotheek met SQL-query's te implementeren, onafhankelijk van specifieke DBMS-implementaties. De MySQL-focus is onvermijdelijk geworden.

Na de release van versie 1.7.9 was er een periode van enige stagnatie in het werk aan MySQL, dat drie jaar duurde, tot augustus 2004, toen Warren Young de situatie onder controle kreeg. Warren bracht onmiddellijk versie 1.7.10 uit, loste alle compilatieproblemen op bij het gebruik van GCC, loste veel bugs op en voegde nieuwe functies toe. In het algemeen, zoals ze zeggen, "het proces is begonnen" ...

In dit artikel overweeg ik versie 3.0.9 van de MySQL++-bibliotheek. Op de officiële website wordt deze release aangekondigd als de "laatste stabiele" release.

2. Korte beschrijving van de belangrijkste objecten (verbinding, vraag, resultaten)

MySQL ++ biedt ondersteuning voor de meeste verschillende manieren en technieken om met databases te werken. En toch, ondanks deze diversiteit, is er een algemeen schema voor het gebruik van de API voor toegang tot databases:

  • het maken (openen) van een verbinding met de database,
  • het opstellen en uitvoeren van een verzoek,
  • bij succesvolle uitvoering van het verzoek - verwerking van de resultaatset - iteratieve sequentiële doorloop van de records van deze set,
  • als het verzoek niet succesvol is, dan is het noodzakelijk om ervoor te zorgen dat fouten (uitzonderingen) worden afgehandeld.

Elk van de bovenstaande fasen komt overeen met een klasse of klassenhiërarchie van de MySQL++-bibliotheek. Laten we ze in wat meer detail bekijken.

2.1. Verbindingsobject

Het Connection-object beheert de verbinding met de MySQL-server. Om bewerkingen in de database uit te voeren, hebt u ten minste één zo'n object nodig. In een toepassing hangt het gebruik van alle andere MySQL++-objecten (hoewel niet altijd rechtstreeks) af van de Connection-instantie, dus zolang uw programma de MySQL++-bibliotheekobjecten gebruikt, moet het Connection-object ook bestaan.

MySQL maakt verschillende soorten verbindingen tussen client en server mogelijk: TCP / IP-sockets, Unix-domeinsockets, named pipes. De basis Connection-klasse ondersteunt al deze typen verbindingen. U bepaalt welk type verbinding in elk specifiek geval nodig is met behulp van de parameters die zijn doorgegeven aan de methode Connection :: connect (). Maar als u van tevoren hebt besloten dat uw applicatie met slechts één type verbinding zal werken, dan worden gespecialiseerde subklassen met vereenvoudigde interfaces onder uw aandacht aangeboden. Als uw programma bijvoorbeeld alleen toegang wil tot de netwerkdatabaseserver, kunt u de subklasse TCPConnection gebruiken.

2.2. Query-object (query)

Meestal worden SQL-query's gemaakt met behulp van een Query-object dat is geïnitialiseerd door een Connection-object.

Query werkt bijna als een uitvoerstroom in standaard C ++, dus u kunt er gegevens naar schrijven net als std :: cout of std :: ostringstream. Dit is de C++-stijl die het dichtst in de buurt komt van de manier waarop MySQL++ de lay-out van de queryreeks gebruikt. De bibliotheek bevat stream-manipulators met controle over het gegevenstype, wat het maken van syntactisch correcte SQL-opdrachten aanzienlijk vereenvoudigt.

Een ander functioneel kenmerk van Query is Template Queries, dat tot op zekere hoogte lijkt op de printf-functie van de C-taal: er wordt een querystring gevormd met daarin opgenomen tags, die aangeven waar variabele data-items worden ingevoegd. Dit is handig wanneer uw programma meerdere query's met dezelfde structuur gebruikt. Als u eenmaal één sjabloon heeft gedefinieerd, kunt u deze meerdere keren hergebruiken in verschillende delen van uw toepassing.

De derde methode voor het maken van query's is door het Query-object te gebruiken in combinatie met Specialized SQL Structures (SSQLS), waarmee u C++-structuren kunt maken die nauwkeurig specifieke databaseschema's vertegenwoordigen. Dit geeft het Query-object de informatie die het nodig heeft om generieke SQL-query's te vormen.

2.3. Resultatensets

De veldgegevens in de queryresultatenset worden opgeslagen in een speciale klasse met de naam String (analoog aan de standaard std :: string). Deze klasse biedt operators voor de geautomatiseerde conversie van resultaatset-objecten naar elk C / C ++-basistype. Daarnaast definieert MySQL++ klassen zoals DateTime die u kunt initialiseren met SQL DATETIME-gegevens. Voor deze automatische conversies wordt hun juistheid gecontroleerd en in geval van conversiefouten wordt een passende waarschuwingsvlag gezet of een uitzondering gegenereerd (afhankelijk van de bibliotheekinstellingen).

Om de resultaten te leveren van het uitvoeren van SQL-opdrachten in de MySQL++-bibliotheek, zijn de volgende benaderingen geïmplementeerd.

2.3.1. Opdrachten die geen gegevens retourneren

Niet alle SQL-opdrachten retourneren gegevens. Een voorbeeld van zo'n CREATE TABLE commando. Voor dergelijke opdrachten is er een speciaal type resultaat (SimpleResult) dat alleen de status retourneert nadat de opdracht is uitgevoerd: de succesvolle voltooiing van de opdracht, het aantal regels dat door de opdracht wordt beïnvloed (als er enig effect werd geïmpliceerd), enz. .

2.3.2. Query's die gegevens retourneren: MySQL ++ gegevensstructuren

De eenvoudigste manier om een ​​resultatenset te krijgen, is door de methode Query :: store () te gebruiken. Deze methode retourneert een StoreQueryResult-object dat is afgeleid van std :: vector , een container met willekeurige toegang die bestaat uit rij-rijen. Elk Row-object is op zijn beurt analoog aan een vector (std :: vector) van strings (van het type String), één object voor elk veld in de resultatenset. Op deze manier kunt u StoreQueryResult zien als een tweedimensionale array, d.w.z. om het vijfde veld van de tweede regel te krijgen, kun je eenvoudig resultaat schrijven. U kunt de velden ook met hun naam aanduiden, dus het volgende recordformulier is ook mogelijk: resultaat ["prijs"].

Een iets minder handige manier om met een resultatenset te werken, is door de methode Query :: use () te gebruiken, die een UseQueryResult-object retourneert. Deze klasse functioneert als een standaard STL-iterator. In dit geval werkt willekeurige toegang tot de gegevens niet meer - u loopt achtereenvolgens door de rijen van de resultatenset met een beperking in de richting: alleen van het begin tot het einde. Er is geen manier om terug te gaan naar de rijen die al zijn doorlopen, en je weet niet hoeveel rijen er in een bepaalde set zitten totdat je de laatste rij hebt bereikt. Als compensatie voor deze ongemakken krijg je een rationeler gebruik van RAM, aangezien het niet nodig is om de hele set in het geheugen te laden. Dit is vooral belangrijk als je met extreem grote resultatensets moet werken.

2.3.3. Query's die gegevens retourneren: gespecialiseerde SSQLS-structuren

Toegang tot queryresultaten via MySQL ++ -gegevensstructuren is een vrij laag abstractieniveau - beter dan het gebruik van de MySQL C API, maar niet veel. Het is mogelijk om de logica van de oplossing dichter bij het onderwerp van het probleem te brengen met behulp van gespecialiseerde structuren SSQLS (Specialized SQL Structures). Met deze SSQLS-objecten kunt u C++-structuren definiëren die overeenkomen met de tabelstructuren in een specifiek databaseschema. Daarnaast is het veel makkelijker om SSQLS-objecten te docken met standaard STL-containers (en dus met algoritmen).

Het voordeel van deze methode is dat het programma een minimale hoeveelheid SQL-code moet bevatten. U kunt een query uitvoeren en het resultaat krijgen in de vorm van C ++ -gegevensstructuren, toegang die niet anders is dan toegang tot een andere structuur. Toegang tot de ontvangen gegevens kan worden georganiseerd via het Row-object, of u kunt de bibliotheekmethoden aanroepen om de resultaten in een STL-container te "dumpen" - met sequentiële, willekeurige of associatieve toegang - de keuze is aan u.

Beschouw het volgende stukje code:

vector resultaat; vraag<< "SELECT * FROM stock"; query.storein(result); for(vector << "Цена: " << i->prijs<< endl;

Bijna "schone" C++-code, geen franje.

Als, om wat voor reden dan ook, het maken van SSQLS-objecten die overeenkomen met databasetabelstructuren ongewenst of onmogelijk is, dan kunt u het Row-object gebruiken en het bovenstaande codefragment ziet er nu als volgt uit:

vector resultaat; vraag<< "SELECT * FROM stock"; query.storein(result); for(vector:: iterator i = resultaat.begin (); i! = resultaat.einde (); ik ++) schat<< "Цена: " << i->tegen ("prijs")<< endl;

De verschillen zijn klein. Het eerste fragment oogt beknopter, maar dit tast de interne logica niet aan.

2.4. Fouten en uitzonderingen

Standaard genereert de bibliotheek uitzonderingen wanneer er fouten worden aangetroffen. Indien nodig kunt u een aangepaste foutvlag configureren die moet worden ingesteld in plaats van uitzonderingen te genereren, maar onthoud dat uitzonderingen meer gedetailleerde informatie bieden. U kunt verschillende soorten fouten opvangen binnen een enkel try-catch-blok.

3. Een eenvoudig voorbeeld van het gebruik van MySQL ++

Het volgende voorbeeld laat zien hoe u een databaseverbinding maakt (opent), een eenvoudige query uitvoert en de resultaten weergeeft - waarover we tot nu toe hebben gesproken.

#erbij betrekken #erbij betrekken #erbij betrekken namespace std; gebruiken; int main (int argc, char * argv) (// verbinding maken met de testdatabase mysqlpp :: Connection con (false); if (con.connect ("test_db", "localhost", "tdb_user", "tdb_password" ) ) (// voer de query uit en geef de verkregen resultaten weer mysqlpp :: Query query = con.query ("select name from 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; } }

Om het voorbeeld te laten werken, moet u een MySQL-database maken met de naam test_db die een tabel met de naam dvd bevat. Deze tabel kan bijvoorbeeld de volgende opbouw hebben:

naam VARCHAR (50) genre TEKST (70) prijs ECHT gekocht DATUM

Nadat de testdatabase test_db is gemaakt, moet de MySQL-beheerder een gebruiker maken met machtigingen om erin te werken. De gebruikersnaam en het wachtwoord voor deze gebruiker zijn al gespecificeerd in de bovenstaande voorbeeldbroncode.

GEBRUIKER MAKEN [e-mail beveiligd] GEDENTIFICEERD DOOR "tdb_password"; VERLENEN ALLE VOORRECHTEN OP test_db. * TO [e-mail beveiligd];

Daarna kan de gebruiker tdb_user, verbonden met de test_db-database op de lokale host, de eerder beschreven dvd-tabel en alle andere tabellen maken om erin te testen, wijzigingen in deze tabellen aanbrengen, ze verwijderen en andere bewerkingen uitvoeren.

Wat betreft het programma zelf, het vraagt ​​alleen om het naamveld van de dvd-tabel, en vanuit de resulterende resultatenset worden alle regels (dvd-titels) opeenvolgend uitgevoerd. Het voorbeeld is heel eenvoudig, maar het illustreert drie van de vier stappen die aan het begin van dit artikel zijn genoemd. De vierde fase - het afhandelen van uitzonderingen - zal worden besproken in een van de volgende artikelen in de serie.

4. Conclusie

Zelfs na een eerste, nogal vluchtige blik op de functionele eigenschappen en kenmerken van de MySQL++-bibliotheek, wordt het duidelijk dat deze belangrijke hulp kan bieden aan ontwikkelaars van applicaties die interageren met MySQL-servers. De bibliotheek is eenvoudig aan te passen aan de behoeften van de programmeur, bevat geen onnodige franje en "past" gemakkelijk in de C++-broncode.

Dit artikel onderzocht de algemene kenmerken van de MySQL++-bibliotheek, de functionaliteit ervan. Ter illustratie werd een eenvoudig voorbeeld van broncode met MySQL++-objecten gegeven. Het volgende artikel in de serie zal gewijd zijn aan het aanpassen en aanpassen van de MySQL++ bibliotheek in verschillende projecten. Het derde artikel beschrijft in detail de uitvoering van SQL-query's en de verwerking van hun resultaten. Het onderwerp van het vierde artikel is foutafhandeling en het gebruik van transacties. In het vijfde artikel zullen we kijken naar de verschillende soorten data en hoe ermee te werken. Gespecialiseerde aanvraagformulieren krijgen speciale aandacht in het zesde artikel. In het laatste, zevende artikel van de serie wordt het praktische gebruik van de MySQL++-bibliotheek in multithreaded toepassingen gedemonstreerd.

Bronnen downloaden

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

Zone = Linux, Open source

Artikel-ID = 497598

Artikeltitel = Praktische MySQL ++, Deel 1: Aan de slag

Van de auteur: Ben je een theepot genoemd? Nou, dit is op te lossen! Elke samovar was ooit een theepot! Of was elke professional ooit een samovar? Nee, er is weer iets mis! Al met al is MySQL voor beginners.

Waarom dummies MySQL nodig hebben

Als je serieus je leven gaat verbinden met internet, dan kom je bij de allereerste stappen in het "web" dit DBMS tegen. MySQL kan gerust het "all Internet" databasebeheersysteem worden genoemd. Geen enkele min of meer serieuze bron kan zonder, het is aanwezig in het beheerderspaneel van elke hosting. En vooral populaire CMS en zelfs zelfgemaakte engines worden met haar deelname gebouwd.

Over het algemeen kun je niet zonder dit platform. Maar om het te bestuderen, heb je ook de juiste aanpak, de juiste tools en vooral verlangen en geduld nodig. Ik hoop dat je veel van de laatste hebt. En wees voorbereid op het feit dat je hersenen gaan koken, en stoom uit je hoofd zal tuimelen, zoals uit een echte theepot

Maar MySQL is alleen zo moeilijk voor dummies als je het verkeerd begint te leren. We zullen zo'n fout niet maken en we zullen vanaf het begin kennis maken met deze technologie.

Basisconcepten

Laten we eerst de basisconcepten doornemen die we in dit bericht zullen noemen:

Database (DB) is de belangrijkste samenstellende eenheid van het DBMS. De database bevat tabellen die bestaan ​​uit kolommen en records (rijen). De cellen die op de kruising worden gevormd, bevatten gestructureerde gegevens van een bepaald type.

DBMS (databasebeheersysteem) - een set van alle softwaremodules voor databasebeheer.

SQL is een gestructureerde querytaal, met behulp waarvan de ontwikkelaar "communiceert" met de kern (server) van het DBMS. Zoals elke programmeertaal heeft SQL zijn eigen syntaxis, een reeks opdrachten en operators, ondersteunde gegevenstypen.

Ik denk dat we voldoende theoretische kennis hebben om mee te beginnen. We zullen de ontbrekende gaten in theorie met de praktijk "schilderen". Nu hoeft u alleen nog de juiste softwaretool te kiezen.

Het juiste gereedschap vinden

Na vrij veel te hebben "gerommeld" in het hele assortiment MySQL-shells voor beginners, realiseerde ik me dat deze gewoon niet bestaan. Alle softwareproducten voor DBMS-beheer vereisen een reeds geïnstalleerde databaseserver. Over het algemeen besloot ik nogmaals om de "scooter" niet opnieuw uit te vinden en koos ik voor het binnenlandse Denwer-pakket. Je kunt het downloaden op de officiële website.

Het bevat al alle componenten van het DBMS, waardoor een beginner direct na een eenvoudige en begrijpelijke installatie praktische kennis kan maken met MySQL. Daarnaast bevat Denwer verschillende andere tools die nodig zijn voor een beginnende ontwikkelaar: lokale server, PHP.

De eerste stappen

Ik zal het installatieproces van de "gentlemen's" -set niet beschrijven, omdat daar alles automatisch gebeurt. Na het starten van de instalah, heb je alleen tijd om op de benodigde toetsen te drukken. Precies wat je nodig hebt in de dummy-versie van MySQL.

Wanneer het installatieproces voorbij is, start u de lokale server, wacht een paar seconden. Typ daarna localhost in de adresbalk van uw browser.

Op de pagina "Hoera, het werkt!" volg een van de links in de afbeelding. Vervolgens wordt u naar phpMyAdmin geleid - een shell voor databasebeheer.

Als u op de link http://downloads.mysql.com/docs/world.sql.zip klikt, downloadt u een voorbeeldtestdatabase van de officiële MySQL-website. Ga opnieuw naar phpMyAdmin, ga in het hoofdmenu bovenaan naar het tabblad "Importeren". Stel in het venster "Importeren naar huidig" in het eerste gedeelte ("Bestand om te importeren") de waarde "Bladeren op uw computer" in.

Selecteer in het verkennervenster het archief met de gedownloade voorbeelddatabase. Vergeet niet op "Ok" te klikken onderaan het hoofdvenster.

Ik raad je aan om de opgegeven parameterwaarden voorlopig niet te wijzigen. Dit kan leiden tot een onjuiste weergave van de gegevens van de geïmporteerde bron. Als phpMyAdmin een foutmelding geeft dat het het databasecompressiealgoritme niet kan herkennen, pak het dan uit en herhaal het hele importproces vanaf het begin.

Als alles goed is gegaan, dan verschijnt bovenaan de programmamelding dat de import is gelukt, en links in de DB-lijst staat er nog een (woord).

Laten we de structuur van binnenuit bekijken, zodat u zich beter kunt voorstellen waar u mee te maken krijgt.

Klik op de naam van MySQL Database for Beginners. Een lijst met tabellen waaruit het bestaat, wordt eronder weergegeven. Klik op een van hen. Ga dan naar het bovenste menu-item "Structuur". Het hoofdwerkgebied toont de structuur van de tabel: alle kolomnamen, gegevenstypen en alle attributen.

WERKEN MET EEN MySQL DATABASE MET PHP

Lezing. Bereid door VS Prokhorov


1. PHP-SCENARIO'S VERBINDEN MET MySQL-tabellen

Laten we eens kijken naar de meest gebruikte functies waarmee u met behulp van PHP met een MySQL-database kunt werken.

Wanneer PHP en MySQL op elkaar inwerken, werkt het programma samen met het DBMS via een reeks functies.

1.1 Verbinding maken met de server. Functie mysql_connect

Voordat u met de database gaat werken, moet u er een netwerkverbinding mee tot stand brengen en de gebruiker autoriseren. Dit wordt gedaan met behulp van de functie mysql_connect ().

bron mysql_connect (]])

Deze functie brengt een netwerkverbinding tot stand met de MySQL-database die zich op de $ serverhost bevindt (standaard is dit localhost, d.w.z. de huidige computer) en retourneert de identifier van de open verbinding. Alle verdere werkzaamheden worden met deze identifier uitgevoerd. Alle andere functies die deze identifier (descriptor) als argument gebruiken, zullen de geselecteerde database op unieke wijze identificeren. Bij het registreren worden de gebruikersnaam $ gebruikersnaam en wachtwoord $ wachtwoord opgegeven (standaard de gebruikersnaam van waaruit het huidige proces wordt gestart - bij het debuggen van scripts: root en een leeg wachtwoord):

$ dbpasswd = ""; //Wachtwoord

// Geef een waarschuwing weer

echo ("

");

De variabelen $ dblocation, $ dbuser en $ dbpasswd slaan de servernaam, gebruikersnaam en wachtwoord op.

1.2 Verbinding met de server verbreken. Functie mysql_close

De verbinding met de MySQL-server wordt automatisch gesloten wanneer het script eindigt, of wanneer de functie mysql_close wordt aangeroepen

bool mysql_close ()

Deze functie verbreekt de verbinding met de MySQL-server en retourneert waar als de bewerking is geslaagd en anders onwaar. De functie heeft als argument een ingang naar de databaseverbinding die wordt geretourneerd door de functie mysql_connect.

$ dblocation = "lokale host"; // Server naam

$ dbuser = "root"; //Gebruikersnaam

$ dbpasswd = ""; //Wachtwoord

// Maak verbinding met de databaseserver

// Onderdruk foutoutput met het @-symbool voordat u de functie oproept

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

if (! $ dbcnx) // Als de descriptor 0 is, is de verbinding niet tot stand gebracht

// Geef een waarschuwing weer

echo ("

De databaseserver is momenteel niet beschikbaar, dus de pagina kan niet correct worden weergegeven.");

if (mysql_close ($ dbcnx)) // sluit de verbinding

echo ("Databaseverbinding verbroken");

echo ("Kan verbinding niet voltooien");

1.3 Aanmaken van een databank. CREATE DATABASE functie

Het commando - maak een database is alleen beschikbaar voor de serverbeheerder en kan op de meeste hostings niet worden uitgevoerd:

MAAK DATABASE Databasenaam

Maakt een nieuwe database met de naam DatabaseName.

Een voorbeeld van het werken met deze functie:

@mysql_query ("MAAK DATABASE $ dbname");

Het wordt aanbevolen om overal apostrofs ("SQL - commando") te gebruiken als scheidingstekens voor regels die SQL - commando's bevatten. Dit kan ervoor zorgen dat er geen $ - variabele per ongeluk wordt geïnterpoleerd (d.w.z. niet vervangen door zijn waarde), en de veiligheid van de scripts zal toenemen.

Het CREATE DATABASE-commando voor het maken van een database is alleen beschikbaar voor de supergebruiker en op de meeste hostingsites is het onmogelijk voor een gewone gebruiker om het uit te voeren. Het is alleen beschikbaar voor de serverbeheerder.

Laten we om te experimenteren een testbase-database maken door een SQL-query uit te voeren vanaf de opdrachtregel. Om dit te doen, moet u inloggen op MySQL en de MySQL-opdrachtregel typen:

mysql> database-testbase maken;

Daarna typt u:

mysql> gebruik testbase;

Database aangemaakt:



1.4 Databaseselectie. Functie mysql_select_db

Voordat je de eerste query naar de MySQL-server stuurt, moet je specificeren met welke database we gaan werken. De functie mysql_select_db is hiervoor bedoeld:

bool mysql_select_db (string $ database_name [, resource $ link_identifier])

Het meldt PHP dat verdere bewerkingen op de $ link_identifier-verbinding de $ database_name-database zullen gebruiken.

Het gebruik van deze functie komt overeen met het aanroepen van het use-commando in een SQL-query, dat wil zeggen, de functie mysql_select_db selecteert een database voor verder werk en alle volgende SQL-query's worden toegepast op de geselecteerde database. De functie neemt als argumenten de naam van de te selecteren database, databasenaam en de verbindingsdescriptorbron. De functie retourneert waar als de bewerking is geslaagd en anders onwaar:

// Database verbindingscode

if (! @mysql_select_db ($ dbname, $ dbcnx))

// Geef een waarschuwing weer

echo ("

De database is momenteel niet beschikbaar, dus de pagina kan niet correct worden weergegeven.");

1.5 Foutafhandeling

Als er tijdens het werken met MySQL fouten optreden (de haakjes zijn bijvoorbeeld niet gebalanceerd in de query of er zijn niet genoeg parameters), dan kunnen de foutmelding en het nummer ervan worden verkregen met behulp van de twee hieronder beschreven functies.

Het is belangrijk om deze functies zorgvuldig en tijdig te gebruiken, omdat het anders moeilijk kan zijn om uw scripts te debuggen.

● Functie:

int mysql_errno ()

retourneert het nummer van de laatste geregistreerde fout. De verbindingsidentificatie $ link_identifier kan worden weggelaten als er slechts één verbinding tot stand is gebracht tijdens de scriptbewerking.

● Functie:

tekenreeks mysql_error ()

retourneert geen getal, maar een tekenreeks die de tekst van het foutbericht bevat. Het is handig voor foutopsporingsdoeleinden. Gewoonlijk wordt mysql_error gebruikt in combinatie met de of die () constructie, bijvoorbeeld:

@mysql_connect ("localhost", "gebruiker", "wachtwoord")

of sterven ("Fout bij het verbinden met de database:" .mysql_error ());

De @-operator dient, zoals gebruikelijk, om de standaardwaarschuwing te onderdrukken die bij een fout zou kunnen optreden.

In recente versies van PHP worden MySQL-functiewaarschuwingen niet standaard vastgelegd.

1.6 De verbinding met MySQL automatiseren. Bestand ( config.php )

Meestal zijn er meerdere scripts op de site die toegang tot dezelfde database nodig hebben.

Het wordt aanbevolen om de code die verantwoordelijk is voor het verbinden met MySQL in een apart bestand te splitsen en dit vervolgens met de benodigde scripts op te nemen met behulp van de functie include.

Het is logisch om de functies voor het verbinden, selecteren en maken van een database in hetzelfde bestand (config.php) te plaatsen waar variabelen met de servernaam $ dblocation, gebruikersnaam $ dbuser, wachtwoord $ dbpasswd en databasenaam $ dbname worden gedeclareerd:

Lijst config.php:

//config.php code van het bestand met de parameters om verbinding te maken met de server en de database te selecteren

// drukt verbindingsfoutberichten af ​​naar de browser

$ dblocation = "lokale host"; // Server naam

$ dbname = "databasenaam invoegen" // Databasenaam: aangemaakt of reeds bestaand

$ dbuser = "root"; // Database gebruikersnaam

$ dbpasswd = ""; //Wachtwoord

// Maak verbinding met de databaseserver

// Onderdruk foutoutput met het @-symbool voordat u de functie oproept

[e-mail beveiligd] _connect ($ dblocation, $ dbuser, $ dbpasswd);

if (! $ dbcnx) // Als de handle 0 is, is de verbinding met de databaseserver niet tot stand gebracht

// Geef een waarschuwing weer

echo ("

De databaseserver is momenteel niet beschikbaar, dus de pagina kan niet correct worden weergegeven.

");

// Creëer database $ dbname - alleen superuser kan dit doen

// Als de database al bestaat, zal er een niet-fatale fout zijn

@mysql_query ("CREATE DATABASE indien niet bestaat $ dbname ');

// Code om verbinding te maken met de database: we selecteren ondubbelzinnig een nieuw gemaakte database of een bestaande database

// Onderdruk foutoutput met het @-symbool voordat u de functie oproept

indien ( [e-mail beveiligd] _select_db ($ dbname, $ dbcnx)) // Als descriptor 0 is, is er geen databaseverbinding tot stand gebracht

// Geef een waarschuwing weer

echo ("

De database is momenteel niet beschikbaar, dus de pagina kan niet correct worden weergegeven.

");

// Een kleine hulpfunctie die een bericht afdrukt

// over een fout in het geval van een fout in de databasequery

functie puterror ($ bericht)

echo ("");



2. VERVULLING VAN VERZOEKEN AAN DE DATABANK

2.1 Een tabel maken. Functie MAAK TABEL:

MAAK TABEL Tabelnaam (Type veldnaam, type veldnaam)

Met deze opdracht wordt een nieuwe tabel in de database gemaakt met kolommen (velden) gedefinieerd door hun naam (FieldName) en de opgegeven typen. Nadat u een tabel hebt gemaakt, kunt u er records aan toevoegen, bestaande uit de velden die in deze opdracht worden vermeld.

Vermelding test_11.php. Het programma dat een nieuwe tabel in de database maakt:

include "config.php"; // Maak verbinding met de server en selecteer database

mysql_query ("CREATE TABLE indien niet bestaat mensen

id INT AUTO_INCREMENT PRIMAIRE SLEUTEL,

of sterven ("MySQL-fout:" .mysql_error ());



Dit script maakt een nieuwe tabel met personen met twee velden. Het eerste veld is van het type INT (integer) en de naam is id. De tweede is het TEXT-type (tekstreeks) en de naamnaam.

Als de tafel bestaat, zal of die () vuren.

De optionele clausule indien niet bestaat, indien opgegeven, vertelt de MySQL-server om geen foutbericht te genereren als er al een tabel met de opgegeven naam in de database bestaat.

Optimaal gebruik van MySQL

Invoering

Om met MySQL aan de slag te gaan, moet u deze database downloaden, installeren, configureren en de documentatie bestuderen.

Bij het leveren van hostingdiensten besteden we aandacht aan de meest voorkomende fouten die gebruikers maken bij het ontwikkelen van hun virtuele servers. Een van de "harde" plekken voor een typische webmaster is het werken met een MySQL-server. Gewoonlijk wordt de studie van de principes van het functioneren van SQL en methoden van werken met databases uitgevoerd volgens de literatuur, waaruit alleen dingen worden geselecteerd die relevant zijn op het moment van lezen - hoe verbinding te maken met de database, hoe een opvragen, hoe u informatie kunt bijwerken of een nieuw record aan de database kunt toevoegen, enzovoort.

Deze aanpak geeft natuurlijk het gewenste resultaat - de interfaces van de gebruikerswebsite worden uiteindelijk geïntegreerd met de database. Gebruikers denken echter niet altijd na over hoe optimaal hun database werkt, hoe de processen die optreden bij het werken met MySQL kunnen worden geoptimaliseerd en wat het functioneren van een virtuele server zal zijn met een verhoogde belasting, "instroom" van gebruikers als gevolg, bijvoorbeeld van "promotie" van de site.

Dit artikel helpt u bij het optimaliseren van uw werk met het MySQL DBMS. Het gepresenteerde materiaal pretendeert niet een gedetailleerde beschrijving te zijn van MySQL-optimalisatie in het algemeen, maar vestigt alleen de aandacht op de meest voorkomende fouten die door gebruikers worden gemaakt en vertelt hoe deze kunnen worden vermeden. U kunt meer leren over de fijne kneepjes van het configureren van MySQL op gespecialiseerde pagina's, waarnaar u aan het einde van dit artikel links vindt.

Welke gegevens moeten worden opgeslagen in MySQL

Probeer niet alle informatie die je hebt in de database te zetten. U hoeft daar bijvoorbeeld geen afbeeldingen op te slaan, hoewel MySQL dit wel toestaat. Door binaire afbeeldingen van grafische bestanden in de database te plaatsen, vertraagt ​​u het werk van uw server alleen maar. Het lezen van een bestand met een afbeelding van schijf is veel gemakkelijker en, in termen van verbruikte bronnen, zuiniger dan het verbinden van een script met SQL, een verzoek doen, een afbeelding verkrijgen, het verwerken en, na het uitgeven van de nodige http-headers, tonen het aan een webserverbezoeker. In het tweede geval vereist het weergeven van een afbeelding meerdere malen meer bronnen van de processor, het geheugen en de schijf. Het is ook de moeite waard om te onthouden dat er mechanismen zijn voor het cachen van webdocumenten waarmee de gebruiker op verkeer kan besparen, en met het genereren van dynamische inhoud ontneemt u uw bezoekers deze handige kans.

In plaats van afbeeldingen is het beter om informatie op te slaan in MySQL, op basis waarvan u links kunt genereren naar statische afbeeldingen in documenten die dynamisch zijn gemaakt door scripts.

Zoekopdrachten optimaliseren

In situaties waarin u echt maar een bepaald deel van de gegevens uit MySQL moet halen, kunt u de LIMIT-toets gebruiken voor de SELECT-functie. Dit is handig wanneer u bijvoorbeeld de resultaten van een zoekopdracht naar iets in de database wilt tonen. Stel dat de database een lijst bevat met producten die uw online winkel aanbiedt. Het is enigszins onmenselijk om de hele lijst met goederen in de gewenste categorie weer te geven in relatie tot de gebruiker - niet iedereen heeft snelle communicatiekanalen met internet, en de uitgifte van honderd kilobytes extra informatie dwingt de gebruiker vaak om meer dan één minuut wachten op de resultaten van het laden van de pagina. In dergelijke situaties wordt informatie gegeven in delen van bijvoorbeeld 10 posities. Het is verkeerd om alle informatie uit de database te selecteren en de uitvoer te filteren op het script. Het zou veel optimaler zijn om een ​​query op het formulier te maken

selecteer goed, prijs uit boeken limiet 20,10

Dientengevolge zal MySQL u 10 records uit de database "geven" vanaf de 20e positie. Nadat u het resultaat aan de gebruiker heeft gegeven, maakt u links "Volgende 10 producten", waarbij u de volgende positie doorgeeft aan het script als parameter, van waaruit de lijst met producten wordt weergegeven, en dit nummer gebruikt bij het genereren van een query naar MySQL.

Houd er ook rekening mee dat u bij het schrijven van databasequery's (SQL-query's) alleen om de informatie moet vragen die u echt nodig heeft. Als er bijvoorbeeld 10 velden in de database zijn, en op dit moment hoeft u er maar twee te krijgen, in plaats van een query

selecteer * uit tabelnaam

gebruik een constructie zoals

selecteer veld1, veld2 van tabelnaam

U zult MySQL dus niet overbelasten met onnodig werk, extra geheugen in beslag nemen en extra schijfbewerkingen uitvoeren.

U moet ook de WHERE-toets gebruiken waar u informatie moet krijgen die overeenkomt met een bepaalde sjabloon. Als u bijvoorbeeld uit de databasevelden moet komen met de namen van boeken die zijn geschreven door Ivanov, moet u een constructie gebruiken zoals

selecteer titel van boeken waar auteur = "Ivanov"

Er is ook een LIKE-toets, waarmee u kunt zoeken naar velden waarvan de waarden "vergelijkbaar" zijn met een bepaald patroon:

selecteer titel van boeken waar auteur zoals "Ivanov%"

In dit geval geeft MySQL de titels van boeken weer met de auteursveldwaarden die beginnen met "Ivanov"

.

Resource-intensieve operaties

Houd er echter rekening mee dat er bewerkingen zijn waarvan de uitvoering op zich meer middelen vereist dan voor normale query's. Het gebruik van een DISTINCT-bewerking op een SELECT-functie kost bijvoorbeeld veel meer CPU-tijd dan een normale SELECT. DISTINCT probeert unieke waarden te vinden, vaak door veel vergelijkingen, vervangingen en berekeningen uit te voeren. Bovendien, hoe meer de hoeveelheid gegevens waarop DISTINCT wordt toegepast (uw database groeit immers in de loop van de tijd), hoe langzamer een dergelijk verzoek zal worden uitgevoerd en de groei van de middelen die nodig zijn om een ​​dergelijke functie uit te voeren, zal verre van direct zijn. evenredig met de hoeveelheid opgeslagen en verwerkte gegevens, maar veel sneller.

Indexen

Indexen worden gebruikt om sneller te zoeken op de waarde van een van de velden. Als er geen index wordt gemaakt, scant MySQL alle velden opeenvolgend van het allereerste record tot het allerlaatste, waarbij de geselecteerde waarde wordt vergeleken met het origineel. Hoe groter de tabel en hoe meer velden deze bevat, hoe langer de selectie duurt. Als een bepaalde tabel een index heeft op de betreffende kolom, kan MySQL zichzelf snel positioneren naar de fysieke locatie van de gegevens zonder een volledige tabelscan te hoeven doen. Als de tabel bijvoorbeeld 1000 rijen heeft, zal de zoeksnelheid minstens 100 keer sneller zijn. Deze snelheid zal nog hoger zijn als het nodig is om alle 1000 kolommen tegelijk te adresseren, omdat in dit geval wordt er geen tijd verspild aan het plaatsen van de harde schijf.

In welke situaties is het raadzaam om een ​​index aan te maken:

  1. Snel zoeken naar rijen bij gebruik van de WHERE-component
  2. Vind rijen uit andere tabellen bij het uitvoeren van een join
  3. De MIN () of MAX () waarde vinden voor een geïndexeerd veld
  4. De tabel sorteren of groeperen als een geïndexeerd veld wordt gebruikt
  5. In sommige gevallen gaat de noodzaak om toegang te krijgen tot het gegevensbestand volledig verloren. Als alle gebruikte velden voor een tabel numeriek zijn en een linkszijdige index vormen voor een bepaalde sleutel, dan kunnen waarden in een veel sneller tempo volledig uit de indexstructuur worden geretourneerd.
  6. Als vragen zoals
    SELECTEER * VAN tbl_name WAAR col1 = val1 EN col2 = val2;
    en er is een gemengde index voor col1 en col2, dan worden de gegevens direct geretourneerd. Als er aparte indexen worden gemaakt voor col1 en col2, dan zal de optimizer proberen de meest beperkte index te vinden door te bepalen welke index minder rijen kan vinden, en zal die index gebruiken om de gegevens op te halen.
    Als de tabel een gemengde index heeft, wordt elke linkszijdige overeenkomst met de bestaande index gebruikt. Als er bijvoorbeeld een gemengde index is van 3 velden (col1, col2, col3), dan kan de indexzoekactie worden uitgevoerd op de velden (col1), (col1, col2) en (col1, col2, col3).

Meer over indexeren

Verbindingsondersteuning

Zoals u waarschijnlijk weet, moet u om met de MySQL-server te werken eerst een verbinding ermee tot stand brengen en een gebruikersnaam en wachtwoord opgeven. Het proces van het tot stand brengen van een verbinding kan veel langer duren dan de directe verwerking van een verzoek aan de database nadat de verbinding tot stand is gebracht. Als u de logica volgt, is het noodzakelijk om onnodige verbindingen met de database te vermijden, zonder de verbinding met de database te verbreken waar dit kan, als u in de toekomst van plan bent om met de SQL-server te blijven werken. Als uw script bijvoorbeeld een verbinding met de database tot stand heeft gebracht, een selectie van gegevens voor analyse heeft gemaakt, hoeft u de verbinding met de database niet te sluiten als u van plan bent de analyseresultaten in de database te plaatsen tijdens de werking van hetzelfde script.

Het is ook mogelijk om een ​​zogenaamde persistente (persistente) verbinding met de database te onderhouden, maar dit is volledig mogelijk bij gebruik van complexere programmeeromgevingen dan php of perl in de normale CGI-modus, wanneer de interpreter van de bijbehorende taal eenmaal wordt gestart door de webserver om aan het inkomende verzoek te voldoen.