多栏索引
到目前为止,我们专注于简单的单栏的索引和简单的查询。创建owner和time_create的单栏索引可以帮助我们进行过滤和排序。即使时下面的查询语句也具有可接受的性能。
SELECT * FROM tbl WHERE owner = 'dejan'AND time_create > '2006-01-01 00:00:00'ORDER BY time_create
但是如果你尝试执行如下的查询:
SELECT * FROM tbl WHERE owner = 'dejan' ORDER BY time_create
那又会是一个漫长的执行过程。这是因为数据库为了排序数据需要执行额外的排序步骤。
解决这种类型的查询的办法就是创建一个包含owner和time_create的索引。我们可以通过执行下面的查询来创建索引:
CREATE INDEX tbl_owner_time_create ON tbl(owner, time_create)
通过使用这个索引,查询的性能将会得到很大的改善。现在,注意下面的分析日志:
Index Scan ResultSet for TBL using index TBL_OWNER_TIME_CREATE
at read committed isolation level using share row locking
chosen by the optimizer
我们通过使用一个便利的索引来使得数据库可以快速的找到已经排好序的数据。
这个例子中值得注意的是,在“create index”语句中的栏的顺序是非常重要的。多栏索引只有通过在创建索引时定义的个栏时才是可优化的。因此,如果我们创建了如下的索引:
CREATE INDEX tbl_time_create_owner ON tbl(time_create, owner)
而不是先前我们使用的索引,我们将不会发现什么性能的优化。那是因为,derby的优化器不认为这个索引是的解决方案,从而忽略了它。
索引的缺点
索引可以帮助我们在选择数据的时候改善性能。当然,这也减慢了数据库插入删除以及一些更新操作。因为我们不仅仅有表结构,还有很多的索引结构,所以当数据发生变化时,维护所有的结构是很耗时间的。
例如,当我们在表中插入一行数据的时候,数据库必须更新和这个表的栏有关的所有的索引。这就意味着它必须将一个已索引的栏的数据插入到合适的索引中,这将很花时间。同样的事也会在你删除一个特定的行的时候发生,因为索引必须保证顺序。对于更新操作来说,只有当你更新了已索引的栏的时候受到影响,因为数据库必须重新定位这些索性来保持索引的顺序。
因此,优化数据库和程序设计的关键在于你的需要。不要索引每一个栏,你不一定会要用到这些索引,而且你可能需要优化你的数据库来进行快速的插入。在早期就开始测试数据库的性能并发现瓶颈。只有那时你才该去应用本文中提到的技术。
结论
在本文中,我们研究了一些在日常开发过程中遇到的关于性能的问题。大多数的准则(或进行适当的修改)都可用于任何关系数据库系统。还有很多其他的技术可以帮助你改善你程序的性能。缓存当然是有效和应用广泛的方法之一了。对于Java程序员来说,许多的缓存解决方案(部分,如OSCache或者EHCache等开源许可的下的方案)都可以看作是程序和数据库之前的缓存从而提高整个程序的性能。同样,Java项目中用到的许多面向对象的框架(如Hibernate)都拥有内置的缓存能力,所以你应该考虑这些解决方案,不过那是另一个讨论文章的内容了。
来源:考试大-Java认证
责编:onmars 评论 纠错