Mysql

繞過 MyISAM 表鎖

  • March 14, 2013

我有一個帶有全文索引的大 MyISAM 表用於搜尋。問題是向該表中插入數據會導致表鎖定,同時由於整個表被鎖定,其他 sql 查詢無法執行任何操作。

是否有可能或解決方法繞過該表鎖而不會獲得損壞的表?似乎 InnoDB 是正確的方法(因為行鎖定),但 InnoDB 僅包含 mysql 版本大於 5.6 的全文搜尋,這不包含在目前的 debian 儲存庫中,更何況新的 debian wheezy 沒有包含 mysql 5.6 .

在我的情況下我能做什麼?

由於您的主要問題是 FULLTEXT 索引,我有兩個儲存引擎建議

建議 #1:MyISAM

MyISAM 儲存引擎對以下內容進行全表鎖定:

  • 更改表
  • 刪除
  • 更新
  • 插入

阻塞一切的表鎖的唯一例外是設置concurrent_insert。(請參閱有關並發插入的 MySQL 文件

嘗試將其設置為my.cnf

[mysqld]
concurrent_insert = ALWAYS

要麼

[mysqld]
concurrent_insert = 2

僅在這種情況下,向 MyISAM 表添加新行會繞過表鎖定。在更新表的另一行中的全文索引列時,您將不得不嘗試向表中添加行。

建議#2:InnoDB

截至 2013 年 2 月 5 日,MySQL 5.6 還沒有結束測試,現在是 GA。MySQL 5.6 中的 InnoDB 支持 FULLTEXT 索引。由於在符合 ACID 的數據庫中執行此操作是您本質上需要的,因此請考慮升級。如果它們早於 2013 年 2 月 5 日,請不要載入任何預安裝的 MySQL 5.6 包。

也許對某些列使用 InnoDB 表,並使用觸發器將文本數據複製到單獨的 MyISAM 表以進行全文搜尋?

全文在 mysql 中相對較新,它的實現不像其他一些 RDBM 那樣功能豐富。聽起來您遇到了 mysql 的一些基本限制,從長遠來看,如果您希望您的應用程序能夠進一步擴展,那麼可能值得研究除 mysql 之外的其他工具。例如,Postgres 提供了對鎖定的更多控制,並提供了更好的全文實現。

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