Niewyjaśnione limity czasu InnoDB


10

Widziałem ostatnio niektóre bardzo podstawowe aktualizacje, które przestały działać, i nie byłem w stanie ustalić przyczyny. Przykład:

// # Czas zapytania: 51 Czas blokady: 0 Liczba rzędów: 0 Liczba rzędów: 0

UPDATE photos SET position = position + 1 WHERE (photo_album_id = 40470);

W tym samym dzienniku nie ma wpisów o czasie Lock_time> 0. Uruchomienie show innodb statusrównież nie ujawnia żadnych powiązanych blokad. Wydaje się, że ten problem dotyczy co najmniej 5 różnych tabel opartych na dziennikach mojego serwera aplikacji (które pokazują Mysql::Error: Lock wait timeout exceededbłąd związany z każdym odpowiednim wpisem w dzienniku mysql-slow).

Masz pomysł na to, dokąd pójść? Uderzam w ślepe zaułki we wszystkich kierunkach. Dzięki.

EDYTOWAĆ:

UTWÓRZ TABELĘ `zdjęcia` (
  `id` int (11) NOT NULL auto_increment,
  `type` varchar (255) NOT NULL,
  `photo_album_id` int (11) NOT NULL,
  `user_id` int (11) NOT NULL,
  `title` varchar (255) domyślnie 'Untitled',
  tekst „opis”,
  `kredyt` varchar (255) domyślnie NULL,
  `nazwa_pliku_fotografii` varchar (255) domyślnie NULL,
  `photo_content_type` varchar (255) domyślnie NULL,
  `photo_file_size` int (11) domyślnie NULL,
  `photo_updated_at` datetime domyślna NULL,
  `position` int (11) domyślnie '0',
  `views` int (11) domyślnie '0',
  `folder` varchar (255) domyślnie NULL,
  `opublikowany` tinyint (1) domyślnie '0',
  domyślna wartość NULL `opublikowane_at` datetime
  `Created_at` datetime domyślna NULL,
  `updated_at` datetime default NULL,
  `album_published` tinyint (1) domyślnie '0',
  `comment_count` int (11) domyślnie '0',
  `nazwa_pliku_ audio 'varchar (255) domyślnie NULL,
  `audio_content_type` varchar (255) domyślnie NULL,
  `audio_file_size` int (11) domyślnie NULL,
  `audio_updated_at` datetime domyślna NULL,
  `cover` tinyint (1) domyślnie„ 0 ”,
  `slug` varchar (255) default NULL,
  `comments_count` int (11) domyślnie '0',
  `delete_from_s3` tinyint (1) domyślnie '0',
  `batch` int (11) default NULL,
  `audio` varchar (255) domyślnie NULL,
  KLUCZ PODSTAWOWY (`id '),
  KLUCZ `index_photos_on_album_published` (` album_published`),
  KLUCZ `index_photos_on_batch` (` batch`),
  KLUCZ `index_photos_on_comment_count` (`ount_countment`),
  KLUCZ `index_photos_on_created_at` (` Created_at`),
  KLUCZ `index_photos_on_delete_from_s3` (` delete_from_s3`),
  KLUCZ `index_photos_on_photo_album_id` (` photo_album_id`),
  KEY `index_photos_on_published` (` opublikowany`),
  KLUCZ `index_photos_on_published_at` (` public_at`),
  KLUCZ `index_photos_on_type` (` typ`),
  KEY `index_photos_on_user_id` (` id_użytkownika`)
) SILNIK = InnoDB AUTO_INCREMENT = 42830 DEFAULT CHARSET = utf8

Głupie pytanie: jakie indeksy masz na tym stole?
Gajusz

Cześć, zobacz edycję.
mvbl fst

Hmm, to denerwujące, ponieważ w Oracle jest to tak łatwe do zdiagnozowania, że ​​właśnie ustawiłeś poziom śledzenia 10046 na 12 i powie ci dokładnie, co robi. Zastanowię się nad tym.
Gajusz

Mam podobny problem ze stołem InnoDB, myślę, że ma to coś wspólnego z przyrostem. Robię: UPDATE table SET <field>=<field>+1 WHERE <pk_field>=1;mój stół jest jednak znacznie prostszy. Losowo powoduje to ten sam błąd, który pojawia się. Moja wersja to: 5.1.39. Dzisiaj spędzam trochę czasu, próbując to rozgryźć, więc zaktualizuję, jeśli coś znajdę.

Dzięki, proszę, daj mi znać, czego się dowiesz, wciąż tego nie rozgryzłem.
mvbl fst

Odpowiedzi:


3

Wiem, że to jest naprawdę późno, ale naprawdę musisz uchwycić wyniki SHOW ENGINE INNODB STATUS; podczas tego zapytania, aby zobaczyć, dlaczego czeka.

Jeśli zdarza się to często w określonym czasie, łatwo byłoby pobrać ten wynik co x sekund i mieć nadzieję, że go uchwycisz (lub może sztucznie wygenerujesz obciążenie).


0

Powiedziałbym, że znormalizuj bazę danych - i dodaj odpowiednie atrybuty.

Pojedyncze zdjęcie nie musi zawierać wszystkich informacji o albumie, do którego należy - wymaga to osobnej tabeli dla albumów - i tabeli relacji, która zawiera tylko mapowanie photoID <-> albumID to samo dotyczy - jeśli jest dołączone - fotografa (oddzielna tabela i tabela mapowania między photoID i PhotographerID

Na pierwszy rzut oka może się wydawać, że twoje zapytania stają się nieco bardziej skomplikowane, ale informacje są teraz logicznie podzielone, a jednocześnie używasz RDBMS do tego, co to jest o ... danych i ich relacjach

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.