毫无疑问,索引的存在是为了提高查询效率而存在的。但有时索引的不正确使用反而会降低数据库的查询效率。
使用索引时,首先要考虑的是创建索引的这张表是用来做什么的。如果这张表需要经常性的更新,那我们就应该谨慎一些了,了解索引机制的都明白,索引是要针对原表来创建一张对应的地址表的,对于经常更新的表创建大量的索引无疑会增加更新工作的代价。
然后,我们需要考虑的便是数据的可选择性,即给这个属性加上索引所能代来的价值,通常唯一性索引的可选择性就很高,特别是当我们要读取少量数据时,像主键这样的唯一性索引是非常好用的。而且我们还可以多使用一些复合属性的索引,这样可以提高索引的重用率,例如:给A、B属性加上索引,那么这个索引对A、B和AB都可使用。而且创建索引时,把可选择性较高的属性放在前面也可增加效率。
当可选择性非常差时,索引就变成了一场灾难。使用索引时,我们可以将数据的读取理解为一条一条的定向读取,而如果可选择性非常差,我们将会读取到大量的数据,那么索引无疑会是一件很痛苦的事。尤其是我们还无法保证我们的数据在磁盘存储的无序性有多大,那么此时索引无疑是一场灾难。
我们还应当考虑数据的均匀性,在同一个属性中,不同的值是否都具有数量差别并不大的元组个数,这是个非常值得思考的问题。因为它非常有可能造成查询性能的不稳定。也许我们可以通过数据库统计数据来提供一些决策方式,但无疑数据的均匀性也是设置索引时的一个重要考虑条件。