三列表中的两个非主/唯一索引

时间:2013-07-24 11:55:31

标签: mysql

我有三张桌子。它有一个唯一的索引,另外两个(两个不同的列)用于更快的查询。

+-------------+-------------+----------+
| 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,那么这将是一种矫枉过正。必须刷新每个新插入的索引?那个操作会花费太长时间吗?感谢

3 个答案:

答案 0 :(得分:1)

如果它正在完全按照您的意愿行事,那么您没有任何缺点,您需要对特定列进行大量查询,因此您将该列编入索引,这就是重点。现在您有一个60列表,并且您在从未查询的列上添加索引,那么您就是在浪费资源,因为这些索引需要在INSERT / UPDATE / DELETE操作上维护。

答案 1 :(得分:1)

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

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

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

实施例

EXPLAIN  SELECT * FROM table WHERE category_id = foo;

希望这会有所帮助。

〜ķ

答案 2 :(得分:0)

有索引很好。只需了解索引会占用更多磁盘空间,但搜索速度更快。

为那些重复值较少的字段编制索引符合您的最佳利益。例如。索引包含布尔标志的字段可能不是一个好主意。

因为在你的情况下你有一个id,所以我认为你在保持你创建的索引方面没有任何问题。

此外,插入会更慢,但由于您保存id's,插入所需的时间不会有太大差异。继续进行插入。

我个人的建议: 当您在一个表中一次插入大量行时,除非是必需的,否则不要使用单个查询插入它们。这样可以防止您的桌子长时间锁定和无法访问。