Rolf B: Flaschenhals bei Query finden (mysql(i))

Beitrag lesen

Hallo Jörg,

(ze.bezahlt)

Wenn Du keine Chance hast, die DB umzustrukturieren, dann... tja. Verbuche es unter "Data modeling - lessons learned". Es lohnt sich immer, über jedes Attribut in einer DB nachzudenken, ob es in der richtigen Relation ist.

Naja, eigentlich benötige ich nur die Info, ob wenigstens 1 x eine 1 in der Spalte steht. Normalerweise sollte auch die Eingabe neuer Zahlungen gesperrt sein, sobald in dieser Spalte eine 1 steht.

Dann könnte man ja einen SELECT MAX(bezahlt) machen.

Aber wenn Du es im Programm so löst, dass in dem Moment, wo genug Zahlungen eingegangen sind um den Rechnungsbetrag zu erfüllen, in allen Zahlungseingängen zur Rechnung die bezahtl-Spalte auf 1 gesetzt wird, kannst Du auch meinen LIMIT 1 Vorschlag nehmen. Wenn in Raten gezahlt wurde, ist der schneller. Mit MAX(bezahlt) müssen auf jeden Fall alle Sätze gelesen werden.

Habe aber gerade aus Spaß an der Freud mal "DISTINCT, GROUP BY und SQL_CALC_FOUND_ROWS" unabhängig vom Ergebnis weggelassen und die Query war eher lahm.

Um Cache-Effekte zu beseitigen, muss man die Query mehrfach ausführen. Dann ist der Cache auf jeden Fall gefüllt.

Um den Cache sicher zu leeren, muss man den Datenbankdienst einmal durchstarten. Das setzt natürlich voraus, dass man eine Testdatenbank hat, deren Serverdienst man kontrollieren kann. Bei einem Hoster geht's eher nicht. Aber Du kannst probieren, ob Du "FLUSH TABLES" ausführen darfst.

Bei einem Hoster sind Laufzeitmessungen auch nicht unbedingt repräsentativ. Wenn auf einem MYSQL Dienst einhundertunddrölf Datenbanken laufen, können die Konkurrenten mal aktiv sein und mal ein Päuschen machen. MÖGLICHERWEISE ist beim DB Hoster auch eine Leistungsstrafe eingebaut (obwohl ich nicht weiß, ob MYSQL sowas anbietet), mit der jemand, der in letzter Zeit viel DB-Leistung abgerufen hat, erstmal runterpriorisiert wird. Echte Laufzeitvergleiche musst Du auf einer Test-DB machen, auf der Du allein unterwegs bist.

Aber grundsätzlich ist jede Query, die länger als 1s läuft, für ein Onlinesystem viel zu langsam. Meine ich.

Rolf

--
sumpsi - posui - obstruxi