Mysql

無法解釋的 InnoDB 超時

  • October 7, 2019

我最近看到一些非常基本的更新超時並且無法確定原因。一個例子:

//# Query_time: 51 Lock_time: 0 Rows_sent: 0 Rows_examined: 0

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

相同的日誌沒有 Lock_time > 0 的條目。執行show innodb status也不會顯示任何相關的鎖。Mysql::Error: Lock wait timeout exceeded根據我的應用伺服器日誌(顯示與 mysql-slow 日誌中每個相應條目相關的錯誤),此問題似乎影響了至少 5 個不同的表。

關於從這裡去哪裡的任何想法?我在各個方向都遇到了死胡同。謝謝。

編輯:

創建表`照片`(
`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) 預設 '無標題',
`描述`文本,
`credit` varchar(255) 預設為 NULL,
`photo_file_name` varchar(255) 預設 NULL,
`photo_content_type` varchar(255) 預設 NULL,
`photo_file_size` int(11) 預設 NULL,
`photo_updated_at` 日期時間預設 NULL,
`position` int(11) 預設 '0',
`views` int(11) 預設 '0',
`folder` varchar(255) 預設為 NULL,
`published` tinyint(1) 預設為 '0',
`published_at` 日期時間預設 NULL,
`created_at` 日期時間預設 NULL,
`updated_at` 日期時間預設 NULL,
`album_published` tinyint(1) 預設 '0',
`comment_count` int(11) 預設 '0',
`audio_file_name` varchar(255) 預設 NULL,
`audio_content_type` varchar(255) 預設 NULL,
`audio_file_size` int(11) 預設 NULL,
`audio_updated_at` 日期時間預設 NULL,
`cover` tinyint(1) 預設為 '0',
`slug` varchar(255) 預設為 NULL,
`comments_count` int(11) 預設 '0',
`delete_from_s3` tinyint(1) 預設 '0',
`batch` int(11) 預設 NULL,
`audio` varchar(255) 預設 NULL,
主鍵(`id`),
KEY `index_photos_on_album_published`(`album_published`),
KEY `index_photos_on_batch`(`batch`),
KEY `index_photos_on_comment_count`(`comment_count`),
KEY `index_photos_on_created_at` (`created_at`),
KEY `index_photos_on_delete_from_s3`(`delete_from_s3`),
KEY `index_photos_on_photo_album_id`(`photo_album_id`),
KEY `index_photos_on_published`(`已發布`),
KEY `index_photos_on_published_at`(`published_at`),
KEY `index_photos_on_type`(`type`),
KEY `index_photos_on_user_id` (`user_id`)
) 引擎=InnoDB AUTO_INCREMENT=42830 預設字元集=utf8

我知道這真的很晚了,但是您確實需要擷取 SHOW ENGINE INNODB STATUS 的輸出;在那個查詢期間,看看它為什麼在等待。

如果它在特定時間發生很多,那麼每隔 x 秒抓取一次輸出並希望你擷取它(或者可能人為地產生負載)是很容易的。

我會說規範化數據庫 - 並添加propper indizes。

單張照片不需要攜帶有關其所屬專輯的所有資訊 - 這需要一個單獨的專輯表 - 以及僅包含 photoID<->albumID 映射的關係表,如果包含,同樣適用於攝影師(單獨的表和photoID和photographerID之間的映射表

乍一看,您的查詢可能會變得有點複雜,但現在資訊在邏輯上已被劃分,同時您使用 RDBMS 來處理它的內容……數據及其關係

引用自:https://dba.stackexchange.com/questions/928