sdem έγραψε:Τελικά έκανα συνδυασμό των ημερομηνιών και σπασμένη και σε ένα πεδίο με μορφή timestamp.
Για μένα το timestamp είναι μια "εφεύρεση" του unix. Για τις βάσεις δεδομένων (παρότι η mysql το υποστηρίζει), και στην php διευκολύνει η υποστήριξη, προτείνω κυρίως datetime ή σκέτο date για τη χρήση που αναφέρεις, αφού έχουν φτιαχτεί ειδικά για να αποθηκεύουν ημερομηνίες. Αν σε βολεύει φυσικά το timestamp δεν θα σου πω μην το χρησιμοποιείς.
sdem έγραψε:Εχω σπάσει σε κομμάτια αυτο που μου εστειλες για να το μελετήσω διεξοδικά καθώς και να σκεφτώ τρόπους βελτίωσης.
Η πρώτη και μεγαλύτερη βελτίωση που μπορείς να κάνεις είναι να βάλεις indexes και να χρησιμοποιήσεις το πεδίο ημερομηνίας αντί της function που δημιουργεί ημερομηνία από τα ημέρα, μήνα, έτος. Αυτό είναι που θα απογειώσει τη βάση σου.
sdem έγραψε:Κατά την έρευνα και την μελέτη έπεσα πάνω σε Stored procedures...μετά την βελτίωση του query θα άξιζε από θέμα ταχύτητας ή οργάνωσης των βάσεων ή θα ήταν περιττό?
Αυτό είναι ένα θέμα που σηκώνει μεγάλη συζήτηση. Υπάρχουν και θετικά στοιχεία και αρνητικά, αναλόγως πως τις χρησιμοποιείς και αν το παρακάνεις ή όχι. Με μια κουβέντα θα έλεγα ότι πάντα αξίζει να κάνεις κάτι, είτε είναι μια function, είτε ένα view, είτε μια stored procedure.
Εστω ότι έχεις το ακόλουθο query:
Κώδικας: Επιλογή όλων
SELECT calcDate, eksofilo_ef
FROM efhmerida INNER JOIN
(
SELECT MAX(DATE(CONCAT_WS('-',`xronos`,`mhnas`,`hmera`))) calcDate, ekdotis_id
FROM efhmerida, ekdotis
WHERE efhmerida.ekdotis_id=ekdotis.id AND xarakt_ekdoti = 1
GROUP BY ekdotis_id
) tmp ON (calcDate = DATE(CONCAT_WS('-',`xronos`,`mhnas`,`hmera`))
AND tmp.ekdotis_id = efhmerida.ekdotis_id)
ORDER BY calcDate DESC
Δεν θα γινόταν πιο απλό αν έκανες ένα view με το subquery:
Κώδικας: Επιλογή όλων
CREATE OR REPLACE VIEW `tmp` AS
SELECT MAX(DATE(CONCAT_WS('-',`xronos`,`mhnas`,`hmera`))) calcDate, ekdotis_id
FROM efhmerida, ekdotis
WHERE efhmerida.ekdotis_id=ekdotis.id AND xarakt_ekdoti = 1
GROUP BY ekdotis_id
και μετά τροποποιούσες το αρχικό query σε αυτό:
Κώδικας: Επιλογή όλων
SELECT calcDate, eksofilo_ef
FROM efhmerida INNER JOIN tmp
ON (calcDate = DATE(CONCAT_WS('-',`xronos`,`mhnas`,`hmera`)) AND tmp.ekdotis_id = efhmerida.ekdotis_id)
ORDER BY calcDate DESC
Επίσης δεν θα γινόταν ακόμα πιο απλό το query αν αντικαταστήσεις το
Κώδικας: Επιλογή όλων
DATE(CONCAT_WS('-',`xronos`,`mhnas`,`hmera`))
με μια function MyCreateDate σαν την
Κώδικας: Επιλογή όλων
CREATE FUNCTION MyCreateDate(pDay INT, pMonth INT, pYear INT) RETURNS date
RETURN DATE(CONCAT_WS('-',pYear, pMonth, pDay))
ώστε να έχεις τελικά:
Κώδικας: Επιλογή όλων
CREATE OR REPLACE VIEW `tmp` AS
SELECT MAX(MyCreateDate(`hmera`,`mhnas`,`xronos`)) calcDate, ekdotis_id
FROM efhmerida, ekdotis
WHERE efhmerida.ekdotis_id=ekdotis.id AND xarakt_ekdoti = 1
GROUP BY ekdotis_id
και
Κώδικας: Επιλογή όλων
SELECT calcDate, eksofilo_ef
FROM efhmerida INNER JOIN tmp
ON (calcDate = MyCreateDate(`hmera`,`mhnas`,`xronos`) AND tmp.ekdotis_id = efhmerida.ekdotis_id)
ORDER BY calcDate DESC
Βέβαια αν έχεις πεδίο ημερομηνίας (ας το πούμε fulldate) τότε θα ήταν ακόμα πιο απλά τα πράγματα και πιο γρήγορα αφού ακόμα και το
Κώδικας: Επιλογή όλων
...calcDate = MyCreateDate(`hmera`,`mhnas`,`xronos`)...
θα γινόταν
Κώδικας: Επιλογή όλων
...tmp.fulldate = efhmerida.fulldate...
Τώρα αυτό το query αν γίνει μια stored procedure π.χ. MySP1 θα απλοποιούσε τον php κώδικα σου αφού θα είχες να εκτελέσεις μόνο "call MySP1()".
Ακόμα και αν χρησιμοποιείς τη stored procedure αυτή σε 100 σημεία στον php κώδικα σου και κάποια στιγμή διαπιστώσεις ότι δεν επιστρέφονται τα σωστά αποτελέσματα, δεν θα χρειαστεί να πειράξεις τίποτα από τον php κώδικα. Αυτό που θα πρέπει να διορθώσεις είναι το σημείο στη database που δεν δουλεύει σωστά.
Ισως στην περίπτωση σου όλα αυτά να είναι too much, να σου αρκούσε να φτιάξεις μια stored procedure μόνο με το αρχικό query, ή απλώς μόνο indexes, και όλα τα υπόλοιπα να είναι απλώς επιπλέον κόπος που δύσκολα θα έχει να δώσει κάτι παραπάνω.
Ηθελα απλώς να δείξω ότι υπάρχουν πολλά που μπορούν να γίνουν τα οποία έχουν να προσφέρουν, είτε στην ταχύτητα, είτε στην απλοποίηση του κώδικα, είτε στην καλύτερη οργάνωση. Δεν υπάρχει όμως κανόνας που να λέει, κάνε αυτό ή μην το κάνεις. Υπάρχει μια χρυσή τομή, ανάλογα με τις γνώσεις, την εμπειρία, τη θέληση που έχει ο καθένας.
Μερικά links για τα υπέρ, τα κατά, πότε πρέπει να χρησιμοποιείται απλή sql και πότε είναι καλύτερα ένα view, μια function ή μια stored procedure:
http://www.sqlbook.com/SQL-Server/Why-u ... es-41.aspx
http://codebetter.com/blogs/jeremy.mill ... 45450.aspx
http://databases.aspfaq.com/database/sh ... ction.html
http://weblogs.asp.net/fbouma/archive/2 ... 38178.aspx
http://ifacethoughts.net/2007/11/14/to- ... rocedures/
http://articles.techrepublic.com.com/51 ... 66837.html
Και το
google φυσικά