在一个有害插入的表上添加多个索引?

时间:2016-05-29 12:18:13

标签: mysql sql indexing

我在一张桌子上有三个陈述。两个SELECT个查询和一个INSERT查询。

// first
SELECT * FROM mytable WHERE id_user = :id AND seen IS NULL

// second
SELECT * FROM mytable WHERE id_user = :id AND timestamp > :tm

// third
INSERT INTO mytable (id, id_user, timestamp) VALUE (NULL, :id, :time)

如您所见,基于这两个SELECT个查询,我需要这两个索引:

ADD KEY id_user1 (id_user, seen);
ADD KEY id_user2 (id_user, timestamp);

一切都很好。但我听说索引对INSERTUPDATE语句有害。我的意思是索引使INSERTUPDATE变慢。所以我想知道,我应该在id_user上添加一个索引,像这样:

ADD KEY id_user (id_user);

实际上,我正在尝试快速选择插入。那么我应该根据这三个语句添加什么样的索引呢?

2 个答案:

答案 0 :(得分:2)

嗯,这是一个非常笼统的问题,它取决于数据。索引可能会造成伤害,可以帮助您,但在尝试运行索引之前无法始终预测它。您可以在添加索引之前和之后查看执行计划,以便更好地做出决定。

一般来说,INSERT语句的索引损害性能,它们通常帮助UPDATE语句而不会损害它们(再次,取决于索引和更新语句)。

要确定需要添加哪些索引,您需要每天检查您将在此表上做什么,如果它主要是更新,那么您应该在此更新的列上明确添加索引。

除非您提出包括表格设计和所需任务在内的具体问题,否则我们无法提供适合您的答案,因此如果您有问题,请更新您的问题并发布。

答案 1 :(得分:1)

两个select最佳索引是给定的。

但是,select可以使用任一索引。您应该在合理大小的数据集上测试性能,以确定它是否满足您的需求。很有可能,一个指数将满足您的需求。

您的insert将需要在分配的索引以及数据表中插入行。这确实增加了插入的努力。但是,除非插件的峰值容量至少为每秒数百,否则您无需担心性能。

现在计算机速度非常快,数据库编写得非常好。除非您有大量数据并且加载了大量数据,否则insert性能可能不是问题。