我有三张桌子。它有一个唯一的索引,另外两个(两个不同的列)用于更快的查询。
+-------------+-------------+----------+
| category_id | related_id | position |
+-------------+-------------+----------+
有时查询是
SELECT * FROM table WHERE category_id = foo
有时它是
SELECT * FROM table WHERE related_id = foo
因此,我决定将category_id
和related_id
作为索引,以获得更好的效果。这是不好的做法吗?这种方法的缺点是什么?
如果我在该表中已经拥有100.000行,并且我正在插入另外的100.000,那么这将是一种矫枉过正。必须刷新每个新插入的索引?那个操作会花费太长时间吗?感谢
答案 0 :(得分:1)
如果它正在完全按照您的意愿行事,那么您没有任何缺点,您需要对特定列进行大量查询,因此您将该列编入索引,这就是重点。现在您有一个60列表,并且您在从未查询的列上添加索引,那么您就是在浪费资源,因为这些索引需要在INSERT / UPDATE / DELETE操作上维护。
答案 1 :(得分:1)
如果您为每列创建了索引,那么您肯定会从中获益。
不要使用复合索引(多个库仑索引)。
您自己可以使用EXPLAIN在查询中看到索引的优势(语句提供有关MySQL如何执行语句的信息)。
实施例
EXPLAIN SELECT * FROM table WHERE category_id = foo;
希望这会有所帮助。
〜ķ
答案 2 :(得分:0)
有索引很好。只需了解索引会占用更多磁盘空间,但搜索速度更快。
为那些重复值较少的字段编制索引符合您的最佳利益。例如。索引包含布尔标志的字段可能不是一个好主意。
因为在你的情况下你有一个id
,所以我认为你在保持你创建的索引方面没有任何问题。
此外,插入会更慢,但由于您保存id's
,插入所需的时间不会有太大差异。继续进行插入。
我个人的建议: 当您在一个表中一次插入大量行时,除非是必需的,否则不要使用单个查询插入它们。这样可以防止您的桌子长时间锁定和无法访问。