【问题标题】:Index creation time in MySqlMySql中的索引创建时间
【发布时间】:2011-02-08 13:41:21
【问题描述】:

我正在 Mysql 中设计一个数据库,该数据库将填充大量原始数据。我想知道我应该在插入数据之前定义索引,还是应该先插入数据然后创建索引?有什么区别吗? 另外我想知道如果我想在 2 列上建立索引,单独或一起索引它们更好吗? 谢谢

【问题讨论】:

    标签: mysql database indexing


    【解决方案1】:

    如果您正在进行批量加载,我的意见是不要预先设置索引,这会减慢不断写入索引页面的负载,尤其是在数据集较大的情况下。话虽如此,在填充表之后,执行 SINGLE 语句来构建您期望的所有索引,而不是一个接一个。我很久以前就学会了艰难的方法。我有一个包含 14+ 百万行的表,并且必须构建 15+ 个索引。每个索引都比上一个索引越来越长。每次出现新索引时,它都需要为以前的页面重建页面。一次完成所有这些证明明显更好。

    至于多列索引...这取决于您的查询将如何执行。如果许多查询将在 WHERE 条件中使用一对或更多列,那么可以,在单个索引中使用多个列。

    【讨论】:

    • 如果我同时索引一次和单独索引一次 = 有 3 个索引,会不会很糟糕,开销很大?
    • 这很好,如果您实际上不打算单独查询它们,这只是不必要的开销。
    【解决方案2】:

    我也想知道如果我想拥有 2列上的索引,是否更好 单独索引还是一起索引?

    这取决于您的查询。当您有一个索引 (colA, colB) 时,当您在查询的 WHERE 条件中不使用 colA 时,数据库永远不会使用此索引。如果您有查询WHERE colB = ?,那么您需要一个以此列开头的索引。

    index (colA, colB);
    WHERE colA = ?; -- can use the index
    WHERE colA = ? AND colB = ?; -- can use the index
    

    这个会失败:

    WHERE colB = ?;
    

    但是...如果您更改索引中列的顺序:

    index (colB, colA); -- different order
    WHERE colb = ?; -- can use the index
    WHERE colA = ? AND colB = ?; -- can use the index
    

    现在这个不能使用索引了:

    WHERE colA = ?;
    

    检查您的查询,使用EXPLAIN 并仅创建您真正需要的索引。

    【讨论】:

    • 哪里 colA = ?和 colB = ?; -- 可以使用索引
    • @judda: 在哪里 colA = ?和 colB = ?;与 WHERE colB = 完全相同和 colA = ?;如果 MySQL 不能在两者上都使用索引,那么它的优化器中有一个严重的错误。解释会告诉你。
    • 我知道,对于某些优化器,您需要双向索引,因为它们的处理方式不同。对于 mysql,我不是 100% 确定的。优化器可以根据需要交换它们,但可能不会。 explainextended.com/2010/05/19/… 是关于索引及其在 mysql 中如何工作的伪相关解释。
    【解决方案3】:

    先插入数据。

    如果在两列上建立索引,无论是组合搜索还是单独的都将是(在正常循环下):

    idx_a (fldA + fldB) idx_b (fldB)

    问候, //t

    【讨论】:

      【解决方案4】:

      通常,当您进行大量数据插入时,您会希望在之后对其进行索引,这样就不必在插入数据时维护和重建索引,从而加快插入过程。

      索引策略完全取决于您打算如何查询数据库。您是将它们作为一组(即在 where 子句中同时包含)还是作为个体(即在 where 子句中包含一个或另一个)来查询它们。

      【讨论】:

      • 我想我会查询集合。
      • 如果需要,应该对集合进行索引(双向)... (field1, field2) 和 (field2, field1)。
      猜你喜欢
      • 2011-01-29
      • 1970-01-01
      • 2019-04-26
      • 1970-01-01
      • 2010-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多