Mysql

使用 MySQL 全文索引進行慢速插入

  • February 25, 2018

我在一個 MySQL 表中使用全文索引,每次插入這個表大約需要 3 秒。似乎 MySQL 在每次插入/更新後重建(一部分)全文索引。這是正確的嗎?

該表有大約 30 個varchartext欄位,varchar-fields 上的一些索引和三個欄位上的全文索引title_text (char(255)), content_text (text), author_text (char(255))。表中約有 210.000 行,表大小約為 2.5 GB,索引大小約為 0.5 GB。插入查詢針對每個新行完成(所有插入沒有組合查詢)。

我怎樣才能獲得更好的性能INSERT?MySQL重建全文索引時是否可以設置選項?

它必須盡可能快,如果不是更快的話:

  1. ALTER TABLE mydb.datafulltxt DISABLE KEYS;
  2. 做很多INSERT事情mydb.datafulltxt
  3. ALTER TABLE mydb.datafulltxt ENABLE KEYS;
  4. 根據需要重複。

來自 MySQL 5.7 參考手冊,8.2.4.1 優化 INSERT 語句

為了優化插入速度,將許多小操作組合成一個大操作。理想情況下,您建立一個連接,一次發送許多新行的數據,並將所有索引更新和一致性檢查延遲到最後。

插入一行所需的時間由以下因素決定,其中數字表示近似比例:

  • 連接:(3)
  • 向伺服器發送查詢:(2)
  • 解析查詢:(2)
  • 插入行:(1×行大小)
  • 插入索引:(1 × 索引數)
  • 結束: (1)

這沒有考慮打開表的初始成本,每個並發執行的查詢都會執行一次。

假設 B-tree 索引,表的大小會減慢 log N 的索引插入速度。

您可以使用以下方法來加快插入速度:

  • 如果您同時從同一個客戶端插入多行,請使用帶有多個 VALUES 列表的 INSERT 語句一次插入多行。這比使用單獨的單行 INSERT 語句要快得多(在某些情況下快很多倍)。如果要向非空表添加數據,則可以調整 bulk_insert_buffer_size 變數以使數據插入更快。
  • 從文本文件載入表時,使用 LOAD DATA INFILE。這通常比使用 INSERT 語句快 20 倍。
  • 利用列具有預設值的事實。僅當要插入的值與預設值不同時才顯式插入值。這減少了 MySQL 必須做的解析並提高了插入速度。

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