索引列但保持插入快速

时间:2011-05-01 18:22:22

标签: php mysql

我需要索引其中一个表中的大多数列,因为它被用于具有大量过滤器的用户进行日志搜索。

这张表每秒约有2-3个插页。我知道索引会影响表上的插入,所以这会有问题吗?

我使用最新版本的MySQL(?)和PHP 5。

感谢。

3 个答案:

答案 0 :(得分:4)

您可以使用一些技巧来加速插入

索引定义

  1. 使用整数自动增量列作为主键
  2. 避免使用唯一键
  3. 如果没有必要,请避免使用外键
  4. 如果必须使用外键,则只对外键使用整数字段
  5. Use partial keys用于文本/字符串列
  6. 不要使用多列密钥
  7. 考虑cardinality of your indexes;如果有1,000,000行,但只有5个唯一值,使用密钥没有多大意义,全表扫描速度更快。
  8. <强>插入

    1. 尽可能捆绑您的插入,在一个语句中插入5行比执行5次单独插入要快得多,因此如果您可以将日志存储在非索引临时表中5分钟然后执行插入 - 从中​​选择进入你的索引表,你将获得很大的速度。
    2. 使用insert delayed.
    3. 您可以在批量插入之前禁用索引更新,然后启用索引更新。在批量插入之前执行ALTER TABLE ... DISABLE KEYS,在批量插入之后执行ALTER TABLE ... ENABLE KEYS。这将延迟所有非唯一索引的更新,直到所有插入完成为止。
    4. 考虑使用LOAD DATA INFILE;它是MySQL拥有的最快的插入机制。
    5. <强>维护

      1. 在表格上使用SHOW INDEX查看统计数据并寻找改进机会。
      2. 定期在MyISAM,InnoDB和存档表格上运行OPTIMIZE TABLE
      3. 选择引擎

        1. 测试使用MyISAM作为存储引擎是否会提高性能。
        2. Under some loads the archive storage engine can do faster inserts,测试一下它是否能更快地运行。归档只允许一个主索引,所以对你来说这不是一个选项。
        3. 在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

答案 1 :(得分:2)

我所能建议的只是试一试,看看它如何影响性能。确保您只索引将在搜索中使用的那些列,并且如果“有意义”,则仅在索引中包含多个列 - 请记住,为了使索引可用,第一列必须是在WHERE,JOIN ... ON子句或ORDER BY中引用 - 除非满足此条件,否则不会使用索引中提到的任何后面的列。

答案 2 :(得分:0)

如果每秒只有2-3个INSERT,那么索引就没有问题(除非有FULLTEXT索引)。

相关问题