3 Stimmen

MySQL - Concurrent SELECTS - ein Client wartet auf einen anderen?

Ich habe das folgende Szenario:

Ich habe eine Datenbank mit einer bestimmten MyISAM-Tabelle mit etwa 4 Millionen Zeilen. Ich verwende gespeicherte Prozeduren (MySQL Version 5.1) und insbesondere eine, um diese Zeilen nach verschiedenen Kriterien zu durchsuchen. Diese Tabelle hat mehrere Indizes, und die Abfragen über diese gespeicherte Prozedur sind normalerweise sehr schnell (<1s). Grundsätzlich verwende ich eine vorbereitete Anweisung und erstelle und führe dynamisches SQL in dieser Suchsp aus. Nach der Ausführung der vorbereiteten Anweisung führe ich "DEALLOCATE PREPARED stmt;" aus.

Die meisten Abfragen laufen in weniger als einer Sekunde (ich verwende LIMIT, um immer nur 15 Zeilen zu erhalten). Es gibt jedoch einige seltene Abfragen, deren Ausführung länger dauert (z. B. 2-3 Sekunden). Ich habe die gesuchte Tabelle so weit wie möglich optimiert.

Ich habe eine Webanwendung entwickelt, und ich kann die Ergebnisse der schnellen Abfragen in weniger als einer Sekunde auf meinem Entwicklungsrechner ausführen und sehen.

Wenn ich jedoch zwei Browserinstanzen öffne und eine gleichzeitige Suche durchführe (gegen den Entwicklungscomputer), eine mit der länger laufenden Abfrage und die andere mit der schnelleren Abfrage, werden die Ergebnisse gleichzeitig zurückgegeben, d. h. es scheint, als ob die schnelle Abfrage wartet, bis die langsamere Abfrage beendet ist, bevor sie die Ergebnisse zurückgibt, d. h. beide Abfragen dauern 2-3 Sekunden...

Gibt es dafür einen Grund? Denn ich dachte, dass MyISAM SELECTS unabhängig voneinander behandelt und dies ist derzeit nicht das Verhalten, das ich erlebe...

Vielen Dank im Voraus! Tim

0voto

Chad Birch Punkte 70946

Das liegt nur daran, dass Sie es von demselben Rechner aus tun. Wenn die Suchanfragen von zwei verschiedenen Rechnern kämen, würden sie zur gleichen Zeit gehen. Möchten Sie wirklich, dass eine Person Ihren MySQL-Server lahmlegt, indem sie einfach ein paar Browser-Fenster öffnet und auf "Aktualisieren" drückt?

0 Stimmen

Das könnte der Grund sein! Ich habe es noch nicht von verschiedenen Geräten aus probiert, aber ich vermute, Sie haben Recht! Danke!

0voto

user1028321 Punkte 11

Das ist richtig. Jede Select-Abfrage auf eine MyISAM-Tabelle sperrt die gesamte Tabelle, bis sie beendet ist. Ihre Ausrede ist, dass dadurch "ein sehr hoher Lesedurchsatz" erreicht wird. Der Wechsel zu innoDB ermöglicht gleichzeitige Lesevorgänge.

3 Stimmen

Ich würde gerne einen Beleg für diese Behauptung sehen. Was ich aus dem Text herauslesen kann MySQL-Handbuch gleichzeitige Selektionen nicht sich gegenseitig blockieren (sie erhalten eine Lesesperre).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X