修改数据
Insert
表中索引的个数是影响insert性能的最关键因素。索引越多,执行速度越慢。insert语句没有where子句,因此也不能直接受益于索引。
往表中插入新的一行记录涉及几个步骤:
- 首先,数据库必须找到一个地方来存储数据行。对于堆表而言,数据库可以把数据存储在任意有足够空间的块。这是一个非常简单和快速的过程。之后数据库所要做的就是将新数据添加到相应的数据块中。
- 如果表建有索引,数据库必须保证新数据被添加到该表的每一个索引中。因此,索引的数量与
insert语句的成本呈正比关系。
在索引中新增条目比堆结构要慢得多,因为需要维护索引的顺序和索引树的平衡。索引的维护是insert成本中最昂贵的。
优化insert的性能的方法:
- 尽可能少建索引
- 在
insert时临时删除索引,插入完成后再重建(常用于数据仓库)
Delete
与insert不同,delete的where子句直接受益于索引。
理论上,delete在一张没有索引的表中执行性能应该是最好的(就像insert那样)。然而,如果没有索引,数据库必须读取全表来找到需要删除的行。这意味着删除操作虽然很快,但是查询会非常慢。
类似select,如果需要删除大部分数据,应该选择不使用索引。
Update
update语句必须重新调整索引条目的位置。数据库需要删除旧条目,在另一个位置添加新条目。
update语句的性能也取决于表中索引的数量。与insert、delete不同的是,update不一定会涉及到所有字段,因此只会影响到包含被更新字段的索引。