2011-05-01 97 views
1

我需要索引表中的大部分列,因爲它用於具有大量過濾器的用戶的日誌搜索。索引列但保持插入快速

這張表格每秒大約有2-3個插入。我知道索引影響在表上插入,所以這會成爲一個問題?

我使用的是最新版本的MySQL(?)與PHP 5

感謝。

+0

最新的MySQL是什麼? 5.0,5.1,5.5,5.6?哪個存儲引擎MyISAM,InnoDB,Archive。順便說一句,我建議使用黑洞存儲,非常快的插入:-) – Johan 2011-05-01 20:36:44

回答

4

有,你可以用它來加快插入

指數定義

  1. 使用整數自動增量列作爲主鍵
  2. 避免獨特的密鑰的一些技巧
  3. 規避外匯鍵如果不是必需的
  4. 如果您必須使用它們,只能使用外鍵的整數字段
  5. Use partial keys文本/字符串列
  6. 不要使用多列鍵
  7. 考慮cardinality of your indexes;如果有1,000,000行,但只有5個唯一值,則使用密鑰沒有多大意義,但全表掃描速度更快。

插入

  1. 捆綁你的刀片如果可能的話,在一個聲明中插入5行是大大高於做5點個人的插入更快,所以如果你能你的日誌存儲在非索引臨時表5分鐘,然後從插入選擇到你的索引表中,你將獲得很多速度。
  2. 使用insert delayed.
  3. 您可以在批量插入之前禁用索引更新,然後啓用索引更新。在批量插入前執行ALTER TABLE ... DISABLE KEYS,在批量插入後執行ALTER TABLE ... ENABLE KEYS。這將延遲所有非唯一索引的更新,直到所有插入完成。
  4. 考慮使用LOAD DATA INFILE;這是MySQL擁有的最快的插入機制。

維護你的表來檢查統計,尋找改進機會

  1. 使用SHOW INDEX
  2. 定期在您的MyISAM,InnoDB和Archive表上運行OPTIMIZE TABLE

發動機的選擇

  • 測試以查看是否使用的MyISAM作爲存儲引擎將提高性能。
  • Under some loads the archive storage engine can do faster inserts,測試以查看它是否對您更快。存檔將只允許一個主索引,所以對你來說這不是一個選項。
  • 退房的回答以下幾個問題上的SO:
    How to optimize mysql indexes so that INSERT operations happen quickly on a large table with frequent writes and reads?
    are MySQL INSERT statements slower in huge tables?
    Mysql InnoDB performance optimization and indexing

    2

    我只能嘗試一下,看看它是如何影響性能的。確保您只索引將用於搜索的那些列,並且如果「這是合理的」,則只在索引中包含多個列 - 請記住,要使索引可用,第一列必須是在WHERE,JOIN ... ON子句或ORDER BY中引用 - 除非滿足此條件,否則不會使用索引中提到的任何後一列。

    +0

    對不起,你是什麼意思的第一列?如果這就是你的意思,我只會索引我在where/order中使用的列。 – webnoob 2011-05-01 19:17:02

    +1

    我認爲威爾指的是使用複合索引或多列索引 – 2011-05-01 19:41:10

    +0

    @Mark,@Webnoob - 是的,正是如此。我已經看到了幾個數據庫新手的例子,假設索引中字段的順序無關緊要。 – 2011-05-02 17:43:28

    0

    如果你只得到了每秒2-3插入,有將與你的指標沒有問題(除非有FULLTEXT索引)。