We moeten de accommodaties selecteren die 3 sterren hebben, en in land met ID 10 zitten.



Vergelijkbare documenten
opstarthandleiding mysqlworkbench November 2012 Fons van Kesteren HVA- CMD- V1 Datamodelleren

Koppeling met een database

[TOETS SQL INLEIDING]

Zelftest SQL Workshop

Les 2 Eenvoudige queries

Databases - Inleiding

Toon TITEL, JAAR en PLATVORM van GAMES die voor het jaar 2000 uitkwamen op Nintendo 64

SQL & Relationele datamodellen in interactieve media

Les 10 : Aanmaken van een database (deel2).

6. Het maken van een database

V2 SQL Herkansing. Bart van der Schoor # nov-2005

Structured Query Language (SQL)

En hoe gaan ze dit allemaal terugvinden?

Introductie (relationele) databases

Zelftest SQL. Document: n0453test.fm 19/04/2012. ABIS Training & Consulting P.O. Box 220 B-3000 Leuven Belgium

MEMO. De database server zit op piekmomenten aan een heel hoog CPU gebruik:

9. MYSQL. Daarin zien we het administratie paneel van mysql.

Meer succes met je website

SQL & Datamodelleren

Simon de schildpad J van Weert 1

Bijlage interview meisje

VMBO-ICT-Route examen 2009 Naam: Marc Schattorie Datum:

Les 11 : Basis SQL (deel2).

Zonnepanelen Hoe krijg je de data op je website?

Wij zijn Kai & Charis van de Super Student en wij geven studenten zin in de toekomst.

Katholieke Hogeschool Kempen Campus Geel Departement Handelswetenschappen en Bedrijfskunde 3de jaar Toegepaste Informatica

SQL Aantekeningen 3. Maarten de Rijke 22 mei 2003

Connect Social Business. Plan van Aanpak voor mijn stage bij ConnectSB

Sparse columns in SQL server 2008

Technische nota AbiFire Rapporten maken via ODBC

Zelftest DB2 for z/os basiscursus

12. Meer dan één tabel gebruiken en sub-queries

Van CaseTalk naar een database in SQLite studio

1 Labo 4 H 8 Jobs, Alerts en Operators H 9 Monitoring en Troubleshooting

Groepswerk Technieken voor Datamodellering

Tinus Plotseling MySQL

Dataconversie met Oracle Spatial

1. * Database worden vaak gebruikt in Client-Server architectuur.

Digitale producten. Een nest van oplichters?

Inhoudsopgave Disclaimer... 3 Voorwoord... 4 Inleiding... 5 Het downloaden van XAMPP... 7 Het installeren van XAMPP... 8 Joomla installeren op

TECHNISCHE UNIVERSITEIT EINDHOVEN. Faculteit Wiskunde en Informatica

11 dingen die je nu kunt doen om meer te gaan verkopen

SQL SERVER Werking van Database Snapshots

16. Back-up en Restore

Feedback Project Ergonomisch Ontwerpen

Javascript oefenblad 1

Wat is PDD-nos? VOORBEELDPAGINA S. Wat heb je dan? PDD-nos is net als Tourette een neurologische stoornis. Een stoornis in je hersenen.

Zelftest SQL Workshop

Simon de schildpad J van Weert 1

Opname hulp. Stap voor stap uitleg over het opnemen van een Babbel - voor kinderen. Videoverhalen over kinderboeken, voor en door kinderen, 8+

SQL manipulatietaal. We kunnen er data mee toevoegen, wijzigen en verwijderen uit een database.

Data Warehouse Script Generator Doel

Workshop Handleiding. Verhalen schrijven. wat is jouw talent?

Beheer van databanken

Kies File>New>Blank Page>PHP. Je kunt eventueel nog een stylesheet koppelen. Definieer nu eerst een site! Dat betekent: Site>New Site

Procesverslag. Save Energy Leiden. Dennis Wagenaar v 1.0

Test Joomla op je PC 1

Snellezen. Ter illustratie

2 Ik en autisme VOORBEELDPAGINA S

Data Manipulatie. Query Talen. / Informatica

Opzetten van een evenement

Laser Focus. De 6 Concentratie Technieken Die Ze Je Niet Op Je Opleiding Leren..

Les 15 : updaten van gegevens in de database (deel2).

HET BELANGRIJKSTE OM TE WETEN OM MEER ZELFVERTROUWEN TE KRIJGEN

Les 3 - maandag 3 januari De Wilgenstam kleutergroep van meester Jasper

begaafdheid Survivalgids Tessa Kieboom Danielle Verheye in samenwerking met Luc Descamps

FAQ Aura Client/Server

Een website maken met databasetoegang.

Ebook Nooit Meer Afgeleid. Auteur: Mark Tigchelaar. Nooit Meer Afgeleid Mark Tigchelaar 1

Databank - Basis 1. Inhoud. Computervaardigheden en Programmatie. Hoofdstuk 4 Databank - Basis. Terminologie. Navigeren door een Venster

EXAMEN juni 2016 Gegevensbanken

SPOT EEN JOB! Op bezoek bij een interimkantoor. Inhoud. Doelgroep. Vakgebied. Materialen. Doelen STERKE SCHAKELS

Connect Social Business. Plan van Aanpak voor mijn stage bij ConnectSB

Data Definition Language

SQL STATEMENTS. Deze kolom kan grote stukken tekst aan en is bedoeld om tekst erin de plaatsen. Geheel getal, bijvoorbeeld 8, 63, 835 NUMERIC

hoofdstuk 9 referentiële integriteit waarborgen overige constraints 9.1 Referentiële integriteit relationele databases 9.1

Zorg dat je een onderwerp kiest, waarvan je echt meer wilt weten. Dat is interessanter, leuker en makkelijker om mee bezig te zijn.

SEO search engine optimalisatie

Foto s up- en downloaden naar en van foto.intranet.vub.ac.be

Bekijkjetoekomstnu.nl

Dag 12: Extensies installeren

Foutcontrole met Javascript

Theorieboek. leeftijd, dezelfde hobby, of ze houden van hetzelfde. Een vriend heeft iets voor je over,

DATAMODEL SQL. Middelbare School. Versie 1.0 Datum 30 oktober 2010 Auteur Mark Nuyens, studentnummer: Groep TDI 1

21ST CENTURY SKILLS. Bewijsstukken. Kristel Pire

18 tips om te werken aan je eigen inzetbaarheid

DÉ 3 GEHEIMEN OM DIRECT PRODUCTIEVER TE WORDEN. Geschreven door Janny Brusselers

A1) Kennismakingsgesprek over sociale media en internetgebruik

Verwerkingsopdrachten bijhet hoofdstuk Mondelinge opdrachten geven Doelstelling 3.

> NASLAG WERKWINKEL LEERLINGEN IN DE SCHOOLRAAD Studiedag Leerlingen en school: partners in crime?

User accounts maken in een Wandy Hotspot, d.m.v. een batch.

Automatische Installatie op IIS server

Connect Social Business

Dialogen website Motiveren tot rookstop

Thinking of development

Lucas 10: Mag Jezus jouw naaste zijn?

Klant Adres Woonplaats Telefoon Stoelen Tafels Kasten Banken Opbergers Doorzon Tulpendreef 9 Wassenaar LACK, 7 stuks (div.

Het onze Vader. Naam:

Transcriptie:

MySQL talk

Trage website? Het optimaliseren van een bestaande website die een MySQL database heeft is niet altijd even makkelijk. Het probleem kan namelijk op veel verschillende plekken zitten: de database layout, de queries, de php code zelf, een externe service, javascript,... Vandaag ga ik uiteraard vertellen over het database optimalisatie deel. 't Is de database! Vaak situeert het probleem zich in de database of is de manier om de data op te halen niet altijd even goed in orde. Op zich is het 'goed' wanneer de website traag is doordat de database of de queries niet in orde zijn, dat betekent dat je door een paar optimalisaties aan te brengen aan de database, de website al sneller laat lopen. Dus je moet geen ellenlange code aanpassen (al dan niet door iemand anders geschreven) en loopt dus veel minder kans om fouten te creëren. Al bij al is het dus een goede zaak wanneer het probleem zich op database niveau situeert. Eerste manier van optimaliseren De allereerste manier van optimaliseren is vaak niet mogelijk, maar voor de volledigheid geef ik het even mee: upgrade de MySQL server installatie van 4.x naar 5.x. Ik heb zelf persoonlijk ondervonden dat de aanpassingen van 4 naar 5 een grote stap voorwaarts zijn. Zo heb ik bij het testen van een paar voorbeeld queries voor jullie niets meer te optimaliseren, ze draaiden al tegen volle snelheid. Het is dus vaak de moeite om de software op de server up-to-date te houden, voor zowel security als snelheid. Maar helaas is dit zoals gezegd vaak niet mogelijk. Tweede manier van optimaliseren In MySQL 4 was de plaatsing van je condities soms zeer belangrijk en moest je alles zo narrow mogelijk maken. Ondanks de grote verbeteringen van 4 naar 5 blijft het toch belangrijk om hier over na te denken. Zo kun je door wat na te denken het aantal resultaten waar rekening mee gehouden moet worden flink verminderen. Natuurlijk zal het vaak niet uitmaken hoe je je queries gaat opbouwen, het zullen vooral de indexen zijn die de grote verbeteringen gaan opleveren, maar op een gegeven punt kun je niet meer indexen leggen en zul je toch de queries moeten optimaliseren. Daarom is het dus toch vrij belangrijk om dit te doen. Voorbeeld: We moeten de accommodaties selecteren die 3 sterren hebben, en in land met ID 10 zitten. SELECT a.id, a.name, a.price, a.image_url, c.id AS country_id, c.name AS country_name, r.id AS region_id, r.name AS region_name, ci.id AS city_id, ci.name AS city_name

FROM accomodations a cities ci ci.id = a.city_id regions r r.id = a.region_id countries c c.id = a.country_id accomodations_info ai ai.accomodation_id = a.id WHERE ai.name = 'stars' ai.value = '3' c.id = 10 Deze query ziet er op zich niet zo spectaculair uit, en dat is ook zo. Maar om iets te verbeteren moet je niet gewoon deze query bekijken, maar ontdekken wat er gaat gebeuren bij het uitvoeren ervan. Dit kun je zeer simpel doen door het EXPLAIN statement te gebruiken. De output daarvan zal je de nodige informatie geven die we nu gaan gebruiken. En dit is de output van het EXPLAIN statement op onze query: Wat meer uitleg over deze output. Allereerst zie je het select type. In dit geval hebben we te doen met SIMPLE queries. Er zijn er nog vele andere bv. UNI, SUBQUERY, DERIVED, etc. Op zich zul je in 90% van de gevallen met een SIMPLE query te maken hebben. Het volgende interessante is het type. Ook hier zijn er vele soorten: const, eq_ref, ref, fulltext, range, etc... De meest voorkomende types zijn ook diegene die in dit voorbeeld staan, vandaar dat ik even wat meer uitleg ga geven over deze 3 types en nog een paar andere: Const: Dit wil zeggen dat er maar 1 rij gematcht zal worden, vaak omdat er een conditie op de primary key gezet zal worden. Dit type is dus ongelooflijk snel Eq_ref: Dit is het 2de snelste type. Dit wil zeggen dat er slechts 1 andere rij zal gematcht worden bij een rij, dit type duid dus een 1 op 1 relate. Ref: Deze is niet meer zo snel als de vorige, maar het kan slechter. Dit wil zeggen dat er voor geen 1 op 1 relatie meer is, maar dat er toch slechts een bepaald aantal resultaten gematcht zullen worden. INDEX: Dit is het op 1 na slechtste type, deze join moet de volledige index afgaan om een resultaat te bekomen. ALL: Dit is het allerslechtste wat er kan zijn. Deze join wil zeggen dat er een full table scan moet gebeuren en dus zelfs geen index gebruikt zal worden. Wanneer

je dit ziet is er werk aan de winkel en moet je proberen om ten minste een index te leggen. De laatste 2 zijn niet optimaal, maar vooral het ALL type is zeker en vast te vermijden. De rest van de kolommen van de output spreken voor zich denk ik. Om verder te gaan met de query: Zoals je ziet worden hier tot 1714 rijen gematcht bij de accomodations. Op zich is dit al heel goed, maar het kan veel beter, met slechts een minieme, maar toch logische aanpassing. Dit is de nieuwe, aangepaste query: SELECT a.id, a.name, a.price, a.image_url, c.id AS country_id, c.name AS country_name, r.id AS region_id, r.name AS region_name, ci.id AS city_id, ci.name AS city_name FROM accomodations a cities ci ci.id = a.city_id regions r r.id = a.region_id countries c c.id = a.country_id accomodations_info ai ai.accomodation_id = a.id WHERE ai.name = 'stars' ai.value = '3' ci.country_id = 10 Er is dus enkel een verandering op de join, in plaats van hem op het land te leggen, leggen we hem op de stad. En dit is de output van het EXPLAIN statement: Zoals je ziet worden hier maar maximum 463 rijen overwogen, in plaats van de 1714. Op zich is dit niet zo'n grote verbetering, maar stel je voor dat er meer data in de database komt te staan, dan moet de eerste query steeds meer dan 4x meer werk doen dan de 2de. Dit maakt het feit dat het type van de join (Const => Ref) er op achteruit gaat toch een de moeite.

Bij een kleine resultset is dit eerlijk gezegd vaak te verwaarlozen, maar het maakt wel degelijk uit. Hoe beslis je welke velden je gaat matchen? Wel, vaak is het een kwestie van logisch na te denken. Er zijn meer steden dan landen, en elke stad heeft een land. In de eerste query gaan we eerst een join leggen van alle accomodaties op de steden, daarna op de regio's en daarna op het land. Dit komt er op neer dat eerst alle steden moeten gelinkt worden aan alle accomodaties, etc... Door de conditie op stad niveau te leggen gaan we er niet meer van uit dat alle steden in acht genomen worden, maar enkel de steden met het correcte land. Als je nadenkt over hoeveel steden er ter wereld zijn, snap je wel dat dit een gigantisch verschil kan zijn. Misschien dat sommigen onder jullie aan het denken zijn 'Zou de country_id conditie niet beter thuishoren op de accomodations tabel?'. Nee, simpelweg omdat er meer data in die tabel zit. Ook al zet je een index op country_id, deze index is sowieso groter, en het overlopen van die index zal zeker en vast meer tijd vragen dan het overlopen van de index op de country_id gegevens van de stad wanneer je met een propvolle database te maken hebt. Hoe kun je dit allemaal weten? Je moet gewoon de database een beetje kennen. Een korte analyse is zeker en vast nodig indien je als buitenstaander een query moet optimaliseren, maar als je de database zelf ontwikkeld hebt zal dit vaak vanzelf komen. Derde manier van optimaliseren De volgende manier van optimalisatie is ook een eenvoudige, maar toch vaak vergeten stap: indexen leggen. We nemen even onze bekende query: SELECT a.id, a.name, a.price, a.image_url, c.id AS country_id, c.name AS country_name, r.id AS region_id, r.name AS region_name, ci.id AS city_id, ci.name AS city_name FROM accomodations a cities ci ci.id = a.city_id regions r r.id = a.region_id countries c c.id = a.country_id accomodations_info ai ai.accomodation_id = a.id WHERE ai.name = 'stars' ai.value = '3' ci.country_id = 10 Zoals je ziet zijn er redelijk wat joins en condities. Als we gewoon de standaard database opstellen leggen we vaak wel een primary key vast, wat automatisch een PK index tot

gevolg heeft. Maar vaak is dit niet voldoende. Als we in het geval van deze query geen extra indexen leggen zullen er zeker en vast problemen ontstaan qua performance. Vaak weten we niet goed hoe we dit probleem moeten aanpakken, maar het komt gewoon neer op even goed en logisch nadenken. Stel dat de database uit dit voorbeeld een gewone standaard database is, met een PK index en niets anders en we gaan indexen leggen dan beginnen we bij het begin: - FK's: Foreign keys zullen vrij vaak gebruikt worden, deze zitten namelijk steeds in de join voorwaarde. Het is daarom zeer aan te raden om een index te leggen op de velden: a.city_id a.region_id a.country_id ai.accomodation_id ci.country_id Op deze manier zullen de join condities al veel sneller verlopen en zal de load van de database server zakken. - Condities (WHERE): Dit is een moeilijker punt. Vaak leggen we op allerhande plekken condities op en zijn we geneigd om toch maar een extra index op veld X te leggen, want dat zal toch wel ergens gebruikt worden. Dit is echter géén goede denkpiste! Een index zou namelijk in het geheugen moeten blijven zitten om snel te zijn. Ga je echter nutteloze indexen leggen, zal het geheugen snel vol raken en zal de server de indexen gaan bewaren op de schijf, wat uiteraard veel trager zal zijn. Het is daarom belangrijk om enkel te indexen als het uitmaakt. In het voorbeeld van deze query leggen we een index op: ai.name ai.value Mag dit zomaar een index zijn? Nee, je moet weten om welk soort veld het gaat, in dit geval zijn het 'TEXT' velden, deze moeten dus een fulltext index krijgen om te kunnen werken. Op een veld met een fixed size (int, varchar, etc..) kun je wel een gewone index leggen. Dankzij deze indexen zal de query veel sneller uitgevoerd worden, de load zakken en is er veel minder LOCK tijd op de tabellen. Allemaal zeer goede zaken. Slot Hopelijk was deze MySQL talk interessant en heeft hij jullie wat bijgebracht! Hoewel het enorm simpele zaken zijn, vergeten we deze dingen heel vaak. Ik hoop dat deze simpele talk toch de moeite waard was. Vragen?