【发布时间】:2011-02-08 13:41:21
【问题描述】:
我正在 Mysql 中设计一个数据库,该数据库将填充大量原始数据。我想知道我应该在插入数据之前定义索引,还是应该先插入数据然后创建索引?有什么区别吗? 另外我想知道如果我想在 2 列上建立索引,单独或一起索引它们更好吗? 谢谢
【问题讨论】:
我正在 Mysql 中设计一个数据库,该数据库将填充大量原始数据。我想知道我应该在插入数据之前定义索引,还是应该先插入数据然后创建索引?有什么区别吗? 另外我想知道如果我想在 2 列上建立索引,单独或一起索引它们更好吗? 谢谢
【问题讨论】:
如果您正在进行批量加载,我的意见是不要预先设置索引,这会减慢不断写入索引页面的负载,尤其是在数据集较大的情况下。话虽如此,在填充表之后,执行 SINGLE 语句来构建您期望的所有索引,而不是一个接一个。我很久以前就学会了艰难的方法。我有一个包含 14+ 百万行的表,并且必须构建 15+ 个索引。每个索引都比上一个索引越来越长。每次出现新索引时,它都需要为以前的页面重建页面。一次完成所有这些证明明显更好。
至于多列索引...这取决于您的查询将如何执行。如果许多查询将在 WHERE 条件中使用一对或更多列,那么可以,在单个索引中使用多个列。
【讨论】:
我也想知道如果我想拥有 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 并仅创建您真正需要的索引。
【讨论】:
先插入数据。
如果在两列上建立索引,无论是组合搜索还是单独的都将是(在正常循环下):
idx_a (fldA + fldB) idx_b (fldB)
问候, //t
【讨论】:
通常,当您进行大量数据插入时,您会希望在之后对其进行索引,这样就不必在插入数据时维护和重建索引,从而加快插入过程。
索引策略完全取决于您打算如何查询数据库。您是将它们作为一组(即在 where 子句中同时包含)还是作为个体(即在 where 子句中包含一个或另一个)来查询它们。
【讨论】: