11.5 使用索引提高性能
要优化一种关系数据库,比如优化SQLite性能的方法之一是提高连接操作的速度。最好的做法是包含足够多的索引信息,这样对于慢的搜索操作在查找匹配的行时就不会完成。没有索引的话,在行查找时整表都必须被读完。而创建了索引,只有相关的行才会被读取。
当我们在查询中定义一个需要用到的列时,就可以考虑为这个列创建一个索引。这意味着向表定义中添加更多的SQL DDL语句。
索引存储在一个单独的地方,但是它与指定表和列是绑定的,SQL代码如下所示。
CREATE INDEX IX_BLOG_TITLE ON BLOG( TITLE );
这会在blog表的title列上创建一个索引,此外不会做任何其他事情。在针对所创建索引的列执行查询时,SQL数据库会使用索引。当数据被创建、修改或删除时,索引会自动做相应调整。
索引会带来额外的存储和计算的开销。如果一个索引很少用到,那么创建和维护它就显得非常昂贵,它就会成为性能上的阻力而非动力。另一方面,有些索引非常重要,它们会带来显著的性能提升。在所有索引中,我们无法改变数据库中创建索引所使用的算法,我们所能做的就是创建索引然后来权衡它可能产生的影响。
对于有些情况,将一个列定义为键可能会导致索引被自动创建。在数据库的DDL部分对这类规则会有清晰的描述。对于SQLite来说,描述如下。
大多数情况下,通过在数据库中创建一个unique索引来实现UNIQUE和PRIMARY KEY的约束。
有两种异常。其中之一就是,整数的主键异常,发生在我们所介绍的一种设计中,强制在数据库中创建代理键。因此,数字主键就不会创建任何索引。
