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 status
ró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 exceeded
błą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
źródło
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ę.Odpowiedzi:
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).
źródło
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
źródło