php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 09.01.2012, 18:24  
php.de
Gast
 
Beiträge: n/a
Standard Performance LOCK TALBES vs Transaktionen

Noch ein Thema, um das ich mich bis heute noch nicht gekümmert habe. Es geht um die Performance von Datenbankabfragen.

InnoDB beherrscht 2 Arten von lockings:

- Tabellen-locking mittels LOCK TABLES
- row-level-locking mittels FOR UPDATE oder LOCK IN SHARE MODE

Der Nachteil von LOCK TABLES: Die komplette Tabelle wird gesperrt

Die Nachteile von row-level-locking sind:

- erhöhter Programmieraufwand:
Es darf eigentlich keine "normalen" SELECTs mehr geben.
Es muss also praktisch bei jedem SELECT eine Transaktion gestartet werden.
Gefahr, dass man bei irgendeinem SELECT das LOCK IN SHARE MODE vergisst.

- Kein Caching im MySQL möglich.

Wofür entscheidet ihr euch? Hat hier schon jemand in Performancetests geschaut, welche der beiden Varianten besser ist?
  Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 10.01.2012, 08:24  
Erfahrener Benutzer
 
Registriert seit: 01.09.2010
Beiträge: 4.561
PHP-Kenntnisse:
Fortgeschritten
eagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Mensch
Standard

also ganz ehrlich - du sorgst dich um "micro"-Performance .. ich verwende weder Lock Tables- weil das ja bei MyIsam Standard war und ich es ablehne .. Multiuser-Anwendungen müssen halt gleichzeitig auf die gleiche Tabelle zugreifen können

Also kommt bei mir InnoDB mit ganz normalen Zeilen-Lock zum Einsatz, aber ohne den ganzen Aufwand bei Select - und es klappt hervorragend - und für Transaktionen ... die stehen bei mir auf "auto" - und daher geht Caching auch ganz wunderbar in MySQL - der hat ja spezielle eigene Caches, nur für InnoDB.

MyIsam's Lock Tables ist schnell, wenn quasi nur gelesen wird - sobald etwa gleichviel gespeichert und gelesen wird, hauen einem die blockierten Tabellen aber sowas von auf die Anwender-Erfahrung .. Und erkläre mal den Usern "du darfst jetzt nicht speichern, weil Admin A / B / C gerade einen Dump von 5000 Datensätzen einspielt .. in 1 Stunde gehts dann weiter ... die erschießen dich mit nem vergifteten Strick oder so ähnlich ...

InnoDB kommt bei solch ausgewogenen Zugriffen wesentlich besser .. und bisher hab ich noch keinen zwingenden Grund für explizite Transaktionen gefunden (bezogen auf meine Anwendungsfälle! - ich mach ja keine Buchhaltung damit, wo Änderungen in 2...X Tabellen nur gemeinsam geschehen dürfen).
__________________
"Irren ist männlich", sprach der Igel und stieg von der Drahtbürste
eagle275 ist offline   Mit Zitat antworten
Alt 10.01.2012, 09:16  
php.de
Gast
 
Beiträge: n/a
Standard

Zitat:
Also kommt bei mir InnoDB mit ganz normalen Zeilen-Lock zum Einsatz, aber ohne den ganzen Aufwand bei Select - und es klappt hervorragend - und für Transaktionen ... die stehen bei mir auf "auto" - und daher geht Caching auch ganz wunderbar in MySQL - der hat ja spezielle eigene Caches, nur für InnoDB.
Du meinst, man kann bei InnoDB ein row-level-locking ohne FOR UPDATE bzw. LOCK IN SHARE MODE machen? Woher hast du diese Information?

Geändert von php.de (10.01.2012 um 09:30 Uhr).
  Mit Zitat antworten
Alt 10.01.2012, 10:54  
Erfahrener Benutzer
 
Registriert seit: 01.09.2010
Beiträge: 4.561
PHP-Kenntnisse:
Fortgeschritten
eagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Mensch
Standard

row-level-Locking wie du es nennst, ist die "normale" Arbeitsweise von InnoDB, wird im Manual und entsprechenden Erklärungen immer als DER Unterschied zu MyIsam dargestellt (neben Transaktionen), wobei das automatische Locking einer Zeile quasi nur für die kurze Zeit eines INSERT / UPDATE / REPLACE gilt, länger muss ja die Zeile nicht blockiert werden, ich selbst habe für meine Hauptanwendung einen Sperrmechanismus drübergestülpt, der verhindert, dass mehr als 1 User den gleichen Datensatz schreiben kann. Der erste User erhält Schreibzugriff, für die weiteren User ist der Datensatz lesbar, aber die können nicht speichern - dafür muss der "erste" User seinen Datensatz speichern und schließen
und für den Rest - um ehrlich zu sein, ich wusste nicht mal, dass man solchen Aufwand treiben kann / muss - vielleicht für dein gemeinsames Löschen ganzer Tabellen-Abschnitte ... bei mir betrifft das Anwendungsszenario einzelne Datensätze, die ihrerseits 1:1 mit weiteren Datensätzen verknüpft sind - und Löschen ist bei mir gar nicht vorgesehen.... Wegen Revisionssicherheit werden bei mir Datensätze nur über Flags 2-stufig archiviert, verbleiben aber in der / den Tabellen, wobei mein gesamtes Datenaufkommen eher bescheiden ist (nach 1,5 Jahren kommen wir auf ca 30-40 MB, Wachstumsrate max 1-2 MB pro Monat)
__________________
"Irren ist männlich", sprach der Igel und stieg von der Drahtbürste

Geändert von eagle275 (10.01.2012 um 10:57 Uhr).
eagle275 ist offline   Mit Zitat antworten
Alt 10.01.2012, 15:27  
php.de
Gast
 
Beiträge: n/a
Standard

Zitat:
länger muss ja die Zeile nicht blockiert werden
Wenn man das sowieso nie brauchen würde, gäbe es gar kein FOR UPDATE oder LOCK IN SHARE MODE.
  Mit Zitat antworten
Alt 10.01.2012, 15:43  
Erfahrener Benutzer
 
Registriert seit: 01.09.2010
Beiträge: 4.561
PHP-Kenntnisse:
Fortgeschritten
eagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Mensch
Standard

dein Anwendungsfall aus der anderen Frage liefert ein Beispiel, wo es vielleicht gebraucht wird - aber wie gesagt, ich lösche keine Blöcke mehrere Zeilen aus der Datenbank ...von daher wird von jedem User nur ein Datensatz geöffnet und geschrieben und damit macht es voll Sinn, dass ich nicht noch explizit weitere Locks setze, sondern innoDB seine "hauseigene" Blockierung genau der gerade geschriebenen Zeile macht
__________________
"Irren ist männlich", sprach der Igel und stieg von der Drahtbürste
eagle275 ist offline   Mit Zitat antworten
Alt 14.01.2012, 20:44  
Erfahrener Benutzer
 
Benutzerbild von lstegelitz
 
Registriert seit: 07.09.2009
Beiträge: 4.005
PHP-Kenntnisse:
Fortgeschritten
lstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nett
Standard

MyIsam + delayed INSERTs nutze ich z.Zt. für Logs... das ist schon ziemlich performant, wenn man die Daten nicht sofort wieder braucht. Ich bastel mir ebenfalls grade einen eigenen Sperr-Mechanismus, der mit MEMORY Tabellen arbeitet, rattenschnell aber flüchtig.
__________________
Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.
lstegelitz ist offline   Mit Zitat antworten
Alt 14.01.2012, 21:22  
php.de
Gast
 
Beiträge: n/a
Standard

Zitat:
Sperr-Mechanismus, der mit MEMORY Tabellen
Hört sich sehr interessant an. Verrätst du uns noch mehr darüber?
  Mit Zitat antworten
Alt 15.01.2012, 14:50  
Erfahrener Benutzer
 
Benutzerbild von lstegelitz
 
Registriert seit: 07.09.2009
Beiträge: 4.005
PHP-Kenntnisse:
Fortgeschritten
lstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nett
Standard

Ich möchte das mal benutzen, um Sperren auf Applikationsebene setzen zu können. Im Kern geht es um Prozess-Synchronisation eines last-verteilten Systems über die Datenbank. Grob gesagt bastel ich also ein Mutexsystem für "critical sections".
__________________
Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.
lstegelitz ist offline   Mit Zitat antworten
Alt 15.01.2012, 16:45  
php.de
Gast
 
Beiträge: n/a
Standard

Und wie schaut dein Mutexsystem aus? Wie schaut das Konzept aus?
  Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Schnelle Massenabhandlung - Performance? kolibriX PHP Einsteiger 4 11.04.2011 12:10
[Erledigt] Lock talbes ... As coola Datenbanken 6 06.12.2010 00:08
[Erledigt] MySql Transaktionen und PDO Leichti PHP-Fortgeschrittene 9 02.10.2010 21:41
LOCK tables... Samhayne Datenbanken 41 18.02.2010 11:15
Kann LOCK TABLES zu Absturz der MySQL Datenbank führen? kat_2403 Datenbanken 2 03.09.2009 15:22
session_set_save_handler mit DB-Probleme mit anderen Transaktionen mit session_star lou PHP Tipps 2009 26 17.07.2009 15:11
MySQL - 2 verschiedene Datenbanken - Performance?! jGeee Datenbanken 1 24.04.2009 18:13
[Erledigt] LOCK TABLES - Thread statt Table??? Curanai Datenbanken 1 04.04.2009 01:33
Transaktion(en) mit der InnoDB-Engine, aber wie?! PsychoEagle Datenbanken 12 23.07.2007 12:11
ImageMagick Performance Problem M3g4Star PHP Tipps 2006 1 30.11.2006 09:35
Komplexe Funktion: +Übersichtlichkeit, -Performance Jacks Rache PHP Tipps 2006 3 07.06.2006 14:22
Vererbung von Klassen und Performance ggfan PHP Tipps 2006 5 05.03.2006 12:00
[Erledigt] Transaktionen mit Apache+PHP+MySQL Datenbanken 6 10.08.2005 08:04
LOCK TABLES / LAST_INSERT_ID AliceD Datenbanken 3 20.07.2005 13:45
Performance verbessern PHP Tipps 2005 2 17.03.2005 13:29

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
sperren auf applikationsebene, lock tables performance, mysql \for update\ \lock in share mode\ unterschied, select macht lock

Alle Zeitangaben in WEZ +2. Es ist jetzt 16:29 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum