0

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

+-------------+-------------+----------+
| 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 行,这会不会是矫枉过正。每次插入都必须刷新索引?那这个手术会不会太长?谢谢

4

3 回答 3

1

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

于 2013-07-24T12:00:05.187 回答
1

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

不要使用复合索引(多列索引)。

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

例子:

EXPLAIN  SELECT * FROM table WHERE category_id = foo;

希望这会有所帮助。

〜K

于 2013-07-24T12:05:41.693 回答
0

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

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

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

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

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

于 2013-07-24T12:01:43.327 回答