2013-07-24 36 views
0

我有一个三列表。它有一个独特的索引,另外两个(用于两个不同的柱)以加快查询速度。三列表中的两个非主/唯一索引

+-------------+-------------+----------+ 
| category_id | related_id | position | 
+-------------+-------------+----------+ 

有时查询

SELECT * FROM table WHERE category_id = foo

,有时它是

SELECT * FROM table WHERE related_id = foo

所以我决定把两者category_idrelated_id获得更好的性能指标。这是不好的做法吗?这种方法有什么缺点?

如果我已经在该表中有100.000行,并且要插入另一个100.000,这是否会是一种矫枉过正的行为。不得不刷新每个新插入索引?那么这个手术会花费很长时间吗?谢谢

+0

你的意思是你让每一个索引?那么好。缺点是您必须在插入或更新时保持该索引。通常没有太多的开销。 – Randy

+0

是的,每一个。所以,如果我已经在该表中有100.000行,并且要插入另一个100.000,那会不会是一种矫枉过正,不得不用每一个新插入来刷新索引?那么这个手术会花费很长时间吗? – srgb

回答

0

它很好有索引。只要理解索引会占用更多的磁盘空间,但更快的搜索。

对于那些重复值较低的字段进行索引是最符合您的兴趣的。例如。索引包含布尔标志的字段可能不是一个好主意。

因为在你的情况下,你有一个id,因此我认为你将不会有任何问题来保持你创建的索引。

此外,插入会更慢,但由于您节省了id's插入所需的时间没有太大的差别。继续并进行插入。

我的个人建议: 当您在一个表格中一次插入大量行时,请勿使用单个查询插入它们,除非强制。这会阻止您的桌子长时间锁定并无法进入。

+0

谢谢 - 你能回答我添加到底部的额外问题吗? – srgb

+0

更新了答案。 – Manu

1

如果它正在做你想做的事,没有什么缺点,你在特定的列上查询很多,所以你让这个列索引,这是整个点。现在你有一个60列表,并且你添加索引给你从不查询的列,那么你就是在浪费资源,因为这些索引需要在INSERT/UPDATE/DELETE操作上维护。

+0

谢谢 - 你能回答我添加到底部的额外问题吗? – srgb

1

如果您已经为每列创建了索引,那么您一定会从中获益。

不要去复合索引(多个库仑索引)。

您自己可以通过使用EXPLAIN(语句提供有关MySQL如何执行语句的信息)在查询中看到索引的优点。

例:

EXPLAIN SELECT * FROM table WHERE category_id = foo; 

希望这会有所帮助。

〜K