Ο Θοδωρής Βλαχάκης κρατάει τη βάση ενός συνεργείου αυτοκινήτων στην Κατερίνη. Η μηνιαία κατάσταση με τα οχήματα που έχουν ξεπεράσει τον χρόνο από το τελευταίο σέρβις έκανε 38 δευτερόλεπτα να βγει, πάνω σε 18.000 εγγραφές, σε μηχάνημα που δεν έκανε τίποτε άλλο. Μία γραμμή προστέθηκε στη βάση και η ίδια κατάσταση βγήκε σε 55 χιλιοστά του δευτερολέπτου, χωρίς να αλλάξει ούτε ένας χαρακτήρας στο ερώτημα.
Μια βάση δεν είναι μέρος για να μπαίνουν πράγματα. Είναι ένα σύνολο υποσχέσεων για το τι θα ισχύει ακόμη μετά από μια διακοπή ρεύματος, και ένα σύνολο ανταλλαγών για το τι θα είναι γρήγορο. Κάθε υποθέμα εδώ είναι το ένα ή το άλλο, και το πρακτικό μισό είναι να ξέρετε ποιο από τα δύο πληρώνετε αυτή τη στιγμή.
Η γραμμή που έκοψε 38 δευτερόλεπτα
Το ερώτημα ζητάει τα οχήματα των οποίων το τελευταίο σέρβις είναι παλαιότερο από έναν χρόνο. Χωρίς βοήθεια, η βάση έχει έναν τρόπο να απαντήσει: να διαβάσει και τις 18.000 γραμμές και να ελέγξει κάθε ημερομηνία. Ένα ευρετήριο είναι δεύτερο αντίγραφο της στήλης, κρατημένο ταξινομημένο, και με αυτό η βάση πηδάει κατευθείαν στην οριακή ημερομηνία και διαβάζει μόνο τις 420 γραμμές μετά από εκείνη. Όλη η επισκευή ήταν CREATE INDEX ON vehicles (last_service).
Δεν είναι δωρεάν, και γι' αυτό καμία βάση δεν φτιάχνει ευρετήρια παντού από μόνη της: το αντίγραφο πρέπει να μένει αληθινό. Κάθε εισαγωγή και κάθε ενημέρωση σε εκείνη τη στήλη γράφει τώρα δύο φορές, μία στη γραμμή και μία στο αντίγραφο. Σε πίνακα που διαβάζεται συνέχεια και γράφεται σπάνια, η ανταλλαγή είναι εξαιρετική. Σε πίνακα που δέχεται μια εγγραφή το δευτερόλεπτο και διαβάζεται μια φορά τον μήνα, είναι ανάποδη.
Η εντολή που τελειώνει τη συζήτηση είναι το EXPLAIN, που ρωτάει τη βάση τι σκοπεύει να κάνει πριν το κάνει. Απαντάει με το σχέδιο: σειριακή σάρωση 18.000 γραμμών, ή σάρωση ευρετηρίου 420. Το διάβασμα αυτής της εξόδου είναι η πιο μεταφέρσιμη δεξιότητα του θέματος, και είναι τελικά αυτό για το οποίο υπάρχει η SQL.
Τρία γεγονότα που βγάζουν τις περισσότερες λάθος απαντήσεις
Το πρώτο επιστρέφει σιωπηλά τίποτα. Το NULL δεν ισούται με NULL, οπότε μόνο το IS NULL δουλεύει. Το NULL δεν σημαίνει μηδέν ούτε κενό. Σημαίνει άγνωστο, και δύο άγνωστα δεν κηρύσσονται ίσα, οπότε το WHERE last_service = NULL δεν είναι σφάλμα και δεν ταιριάζει με καμία γραμμή. Ο Θοδωρής είχε ακριβώς αυτό σε παλιότερη εκδοχή, και η κατάσταση έβγαινε άδεια: κανένα όχημα δεν χρωστούσε σέρβις, πράγμα που το πίστεψαν δύο μήνες.
Το δεύτερο κρεμάει το μηχάνημα. Μια σύνδεση χωρίς συνθήκη ON είναι κάθε γραμμή απέναντι σε κάθε γραμμή. Η σύνδεση 18.000 οχημάτων με 5.200 πελάτες χωρίς να ειπωθεί πώς σχετίζονται ζητάει 93.600.000 γραμμές, και η βάση θα το κάνει, επειδή είναι νόμιμο αίτημα. Το σύμπτωμα δεν είναι μήνυμα λάθους. Είναι ένα ερώτημα που δεν έχει γυρίσει.
Το τρίτο μετράει όταν κάτι αποτυγχάνει στη μέση. Μια συναλλαγή γίνεται ολόκληρη ή καθόλου. Η μεταβίβαση ενός οχήματος σε νέο ιδιοκτήτη είναι δύο εγγραφές, και μια διακοπή ανάμεσά τους αφήνει όχημα που δεν ανήκει σε κανέναν. Τυλιγμένες σε BEGIN και COMMIT, ή προσγειώνονται και οι δύο ή καμία, και ενδιάμεση κατάσταση δεν υπάρχει για να τη δει κανείς. Σε αυτό δείχνει η λέξη βάση, και γι' αυτό ο Σχεδιασμός βάσης προηγείται κάθε εργαλείου.
Η σύνθεση αποφασίζει αν το άτονο βρίσκει το τονισμένο
Το συνεργείο έχει αναζήτηση πελάτη, και ο υπάλληλος στον πάγκο πληκτρολογεί χωρίς τόνους, γιατί έτσι γράφουν όλοι όταν βιάζονται. Η γραμμή στη βάση λέει «Άννα Ζέρβα». Το αν θα βρεθεί δεν το αποφασίζει το ερώτημα. Η σύνθεση της στήλης αποφασίζει αν το άτονο βρίσκει το τονισμένο, και τη σύνθεση την επέλεξε όποιος έτρεξε την εγκατάσταση, συνήθως χωρίς να το ξέρει.
Μετρημένο πάνω σε MySQL 8.4, στις 8 Σεπτεμβρίου 2026, με τρεις συγκρίσεις που κάνει κάθε ελληνική αναζήτηση:
- «Άννα» ίσο με «αννα»: αληθές σε
utf8mb4_general_ci,utf8mb4_unicode_ciκαιutf8mb4_0900_ai_ci, ψευδές σεutf8mb4_0900_as_csκαιutf8mb4_bin - το «Παπάς» ίσο με τον εαυτό του γραμμένο με μεσαίο σίγμα στο τέλος, δηλαδή U+03C2 απέναντι σε U+03C3 στην ίδια θέση: το ίδιο ακριβώς αποτέλεσμα στις ίδιες πέντε συνθέσεις
- «ΟΔΟΣ» ίσο με «οδος», δηλαδή κεφαλαία απέναντι σε πεζά: πάλι το ίδιο
Δύο πράγματα βγαίνουν από αυτό. Το πρώτο είναι ότι μια στήλη φτιαγμένη ως utf8mb4_bin, επειδή κάποιος ήθελε «ακριβή σύγκριση», σταματάει να βρίσκει τα μισά ελληνικά ονόματα και δεν βγάζει κανένα σφάλμα. Το δεύτερο είναι ότι η ανεκτική σύνθεση κάνει και το ανάποδο: δύο πελάτες με ονόματα που διαφέρουν μόνο στον τόνο γίνονται διπλοεγγραφή που ο κανόνας μοναδικότητας δεν την πιάνει, ή αντίστροφα απορρίπτεται ως διπλή μια εγγραφή που δεν είναι.
Η σειρά
Τέσσερα σκαλιά, και το καθένα είναι αόρατο αν ξεκινήσατε από πάνω του
Σχεδόν όλοι μπαίνουν στο τρίτο σκαλί, επειδή είναι εκείνο που έχει όνομα μέσα σε μια αγγελία εργασίας.
- 04Το άλλο σχήμαΈγγραφα και κλειδιά, όταν η σταθερή γραμμή είναι πράγματι λάθος δοχείο.Προσπεράστε τα τρία πρώτα και αυτό είναι μαντεψιά
- 03Το σύστημαΠοιο προϊόν, ποια διάλεκτος, και τι κάνει σε μια διακοπή.Συνήθως έχει επιλεγεί πριν φτάσετε
- 02Το σχήμαΠοιοι είναι οι πίνακες, τι είναι μοναδικό, και τι δεν επιτρέπεται να λείπει.Προσπεράστε το και κανένα ευρετήριο δεν σας σώζει
- 01Η γλώσσαΕρωτήσεις κατευθείαν, και διάβασμα του σχεδίου με το οποίο απαντάει η βάση.Προσπεράστε την και ο αντιστοιχιστής είναι αδιαφανής
Τα σκαλιά δεν είναι δυσκολία. Το πρώτο μαθαίνεται πιο εύκολα από όλα και αναβάλλεται πιο συχνά από όλα, επειδή ένας αντιστοιχιστής γράφει υποφερτά ερωτήματα για έναν αρχάριο και σταματάει να το κάνει ακριβώς εκεί όπου αρχίζει να μετράει.
Η σειρά, και γιατί σχεδόν όλοι μπαίνουν από το τρίτο σκαλί
Η σειρά που δουλεύει είναι πρώτα η γλώσσα, ύστερα το σχήμα, ύστερα το σύστημα. Σχεδόν κανείς δεν την ακολουθεί, επειδή το σύστημα είναι αυτό που ονομάζει μια αγγελία και το σχήμα δεν το ονομάζει τίποτα.
Ανάποδα, η αποτυχία έχει υπογραφή. Κάποιος μαθαίνει έναν αντιστοιχιστή αντικειμένων πριν από την ίδια τη γλώσσα των ερωτημάτων, φτιάχνει εφαρμογή που δουλεύει, και ύστερα συναντάει μια αργή οθόνη για την οποία δεν μπορεί να σκεφτεί, επειδή το στρώμα που γράφει τα ερωτήματα στη θέση του είναι τώρα το στρώμα που κρύβει τι αργεί. Ο αντιστοιχιστής δεν φταίει και τα Δεδομένα μέσα στον κώδικα είναι πραγματικό υποθέμα. Απλώς είναι αδιάβαστο για όποιον δεν είδε ποτέ τι παράγει.
Το ελληνικό κόλλημα: η κανονικοποίηση εξετάστηκε, το πλάνο όχι
Στην Ελλάδα το κόλλημα έχει σχολικό όνομα. Η κανονικοποίηση, οι πρώτες τρεις κανονικές μορφές και τα διαγράμματα οντοτήτων διδάσκονται και εξετάζονται, σε ΕΠΑΛ και σε πανεπιστήμιο, με ερωτήσεις που έχουν σωστή απάντηση σε χαρτί. Το πλάνο εκτέλεσης δεν εξετάζεται πουθενά, επειδή χρειάζεται μηχάνημα, δεδομένα και χρόνο. Έτσι ένας απόφοιτος φτάνει με σωστό σχήμα και χωρίς κανένα ένστικτο για το κόστος του, και το πρώτο αργό ερώτημα το διαβάζει ως πρόβλημα του διακομιστή.
Το δεύτερο κόλλημα είναι η επιλογή συστήματος πριν γίνει γνωστό το σχήμα των δεδομένων, και συνήθως την αποφασίζει το τελευταίο άρθρο που διάβασε κάποιος. Η τίμια θέση είναι ότι το NoSQL απαντάει σε πραγματική ερώτηση, και η ερώτηση είναι αν τα δεδομένα έχουν σταθερό σχήμα και σχέσεις που μετράνε. Του Θοδωρή έχουν: τα οχήματα ανήκουν σε πελάτες, οι επισκευές ανήκουν και στα δύο, και κάθε κατάσταση που βγάζει είναι μια σύνδεση. Μια αποθήκη εγγράφων θα του έκανε την πρώτη εβδομάδα γρηγορότερη και τον τέταρτο μήνα πολύ χειρότερο.
Τι ανοίγετε το 2026, και τι κοστίζει σε ευρώ
Το SQLite είναι το σωστό μέρος για να μάθει κανείς, και όλο και πιο συχνά το σωστό μέρος για να τρέξει κάτι στα αλήθεια. Είναι ένα αρχείο, δεν θέλει διακομιστή, βρίσκεται σε κοινό κτήμα, και αντικατέστησε τη συνήθεια να επινοεί κανείς μορφή αρχείου και να γράφει αναλυτή για αυτήν. Ένα συνεργείο στο μέγεθος της Κατερίνης μπορεί να τρέχει πάνω του μόνιμα, από τον ίδιο υπολογιστή που κόβει τα τιμολόγια.
Το PostgreSQL είναι η προεπιλογή όταν δικαιολογείται διακομιστής, είναι δωρεάν και ανοιχτού κώδικα, και πήρε αυτή τη θέση από το MySQL μέσα στη δεκαετία που πέρασε. Η ελληνική διαφορά δεν είναι η τιμή, γιατί τιμή δεν υπάρχει σε κανένα από τα δύο: είναι ότι ένα μεγάλο μέρος των ελληνικών μικρών επιχειρήσεων τρέχει ήδη σε MySQL ή MariaDB, επειδή έτσι ήρθε η φιλοξενία, οπότε το σύστημα σπάνια το διαλέγει ο προγραμματιστής. Γι' αυτό είναι έτσι διατυπωμένο το υποθέμα Τα συστήματα βάσεων.
Το τρίτο εργαλείο είναι το EXPLAIN και υπάρχει μέσα σε κάθε σύστημα που αξίζει να χρησιμοποιηθεί. Αντικατέστησε τη χρονομέτρηση ενός ερωτήματος με το ρολόι και το μάντεμα της αιτίας, και είναι το μόνο εργαλείο αυτής της σελίδας που δεν εγκαθίσταται καν. Τα Θεμέλια του προγραμματισμού εξηγούν γιατί οι δύο αριθμοί που τυπώνει, 18.000 και 420, είναι ολόκληρη η ιστορία.
Ο λογαριασμός αυτού του θέματος για έναν Έλληνα αναγνώστη δεν είναι άδεια χρήσης. Είναι η μέρα που η βάση του πελάτη ζει σε έναν φθηνό κοινόχρηστο χώρο φιλοξενίας με όριο στα ταυτόχρονα ερωτήματα, όπου το αργό ερώτημα δεν σας κοστίζει χρόνο αλλά σας κόβει τη σύνδεση. Εκεί ζει και το υπόλοιπο μισό της δουλειάς, στην Ανάπτυξη ιστού και στο Από τον κώδικα στην παραγωγή.
Αυτό που δεν απαντάει τίποτα από τα παραπάνω είναι τι γίνεται όταν ένα μηχάνημα δεν χωράει πια το πράγμα. Τότε οι υποσχέσεις της πρώτης παραγράφου αρχίζουν να διαπραγματεύονται μία μία, επίτηδες, και αυτή είναι άλλη ερώτηση από κάθε ερώτηση αυτής της σελίδας.