2011-11-15 52 views
0

我有一個運行良好的應用程序,但最近有兩個項目已經開始在慢速查詢日誌中彈出。 所有的查詢都是複雜且醜陋的多連接可以使用重構的select語句。我相信它們都有斑點,意味着它們被寫入磁盤。讓我感到好奇的部分是爲什麼有些人有鎖定時間與他們有關。沒有任何查詢具有由應用程序設置的任何特定鎖定協議。據我所知,默認情況下,除非明確指定,否則您可以讀鎖。緩慢查詢日誌中的Mysql鎖定時間

所以我的問題:什麼情況下會導致選擇語句不得不等待一個鎖(從而在慢速查詢日誌中報告)?假設INNODB和MYISAM環境。

磁盤交互是否可以列爲某種鎖定時間?如果是,是否有文件說明了這一點?

在此先感謝。

回答

0

的MyISAM會給你的併發性問題,當插入過程中整個表被完全鎖定。

InnoDB的應該沒有問題讀取,甚至在寫/事務正在進行中,由於它的MVCC。

然而,僅僅因爲一個查詢在慢速查詢日誌顯示出來,並不意味着查詢速度慢 - 多少秒,多少記錄被檢查?

戴上「解釋」在查詢前拿到考試查詢正在進行的擊穿。

here's a good resource用於瞭解EXPLAIN

+0

這是愚蠢的me..i的(關於它的優秀MySQL文檔之外)認爲這是一本教科書的問題。我忘記了桌面在更新期間完全鎖定。有很多微小的更新不斷髮生。這些時髦的慢速查詢本質上導致了交通阻塞,並且不斷的更新確保它永不放棄。 – cgr

0

我不確定MySql,但我知道在SQL Server中,select語句不會讀取鎖。這樣做將允許您讀取未提交的數據,並可能會看到重複記錄或完全錯過記錄。原因是因爲如果另一個進程正在寫入表中,數據庫引擎可能會決定是時候重新組織一些數據並將其轉移到磁盤上。所以它會將您已經閱讀的記錄移動到最後,然後您再次看到它,或者從最後一個移動一個記錄到更高的位置。

網絡上有一個人實際上寫了幾個腳本來證明發生了這種情況,我試了一次,並且在重複出現之前只花了幾秒鐘。當然,他以一種更容易發生的方式來設計腳本,但它證明它肯定會發生。

這是好行爲,如果您的數據不需要是準確的,並且肯定可以幫助防止死鎖。但是,如果您正在處理類似人們的錢的應用程序,那就很糟糕了。

在SQL Server中,您可以使用WITH NOLOCK提示來告訴您的select語句忽略鎖定。我不確定MySql中的等價物是什麼,但也許有人會說。