2017-07-04 48 views
1

我有一個長期運行的SELECT語句進行MYISAM表。這些語句是否對正在讀取的表造成鎖定?如果是這樣,你如何阻止發生鎖?爲MYISAM錶停止表鎖

根據https://dev.mysql.com/doc/refman/5.7/en/internal-locking.html

MySQL使用表級鎖對MyISAM,MEMORY和MERGE表, 只允許一個會話更新一次這些表。這個鎖定級別使得這些存儲引擎更適合於只讀應用程序, 只讀應用程序或單用戶應用程序。

這是否也意味着SELECT語句創建鎖?

+0

@joanalo不,它不是。 'SELECT'發佈共享讀鎖,'UPDATE'和朋友發佈寫鎖。 – EJP

+1

MyISAM現在不是最好的選擇,所以如果你可以切換到InnoDB,它可能是最好的選擇。調整,支持MVCC和擁有日誌更容易,這意味着如果服務器崩潰,它通常不會崩潰。 – tadman

回答

4

這些[長時間運行的SELECT]語句是否對正在讀取的表導致鎖定?

是的。 MyISAM表在讀取時無法更新。如果在表上有長時間運行的讀取(即SELECT)查詢,則任何UPDATE或DELETE查詢都必須等到讀取查詢完成。

(INSERT查詢是有時候是一個例外,只要表結構中沒有內部漏洞,可以允許一個作者在表的末尾插入一行而不需要獲得鎖,但是如果任何行都會更新或刪除,這可能會產生漏洞,這將需要INSERT查詢來獲得寫入鎖定。)

有關內部的更多信息,請閱讀table-level locks。但短期和長期的問題是,如果併發是一個問題,你可能不應該使用MyISAM。

+0

謝謝!對於長時間運行的SELECT查詢,InnoDB是否推薦通過MyISAM呢? InnoDB是否也鎖定受長時間運行的SELECT影響的行? – user2181948

+1

@ user2181948爲了所有目的,建議使用InnoDB而不是MyISAM。它根本不使用表級鎖定,並且在當前版本的MySQL中具有更好的整體性能。 – duskwuff