我在一张桌子上有三个陈述。两个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);
一切都很好。但我听说索引对INSERT
,UPDATE
语句有害。我的意思是索引使INSERT
,UPDATE
变慢。所以我想知道,我应该在id_user
上添加一个索引,像这样:
ADD KEY id_user (id_user);
实际上,我正在尝试快速选择和插入。那么我应该根据这三个语句添加什么样的索引呢?
答案 0 :(得分:2)
嗯,这是一个非常笼统的问题,它取决于数据。索引可能会造成伤害,可以帮助您,但在尝试运行索引之前无法始终预测它。您可以在添加索引之前和之后查看执行计划,以便更好地做出决定。
一般来说,INSERT
语句的索引损害性能,它们通常帮助UPDATE
语句而不会损害它们(再次,取决于索引和更新语句)。
要确定需要添加哪些索引,您需要每天检查您将在此表上做什么,如果它主要是更新,那么您应该在此更新的列上明确添加索引。
除非您提出包括表格设计和所需任务在内的具体问题,否则我们无法提供适合您的答案,因此如果您有问题,请更新您的问题并发布。
答案 1 :(得分:1)
两个select
的最佳索引是给定的。
但是,select
可以使用任一索引。您应该在合理大小的数据集上测试性能,以确定它是否满足您的需求。很有可能,一个指数将满足您的需求。
您的insert
将需要在分配的索引以及数据表中插入行。这确实增加了插入的努力。但是,除非插件的峰值容量至少为每秒数百,否则您无需担心性能。
现在计算机速度非常快,数据库编写得非常好。除非您有大量数据并且加载了大量数据,否则insert
性能可能不是问题。