一般的信息系统都会存在查询数据库的要求。查询速度的快慢直接影响系统压力测试的结果。通常情况下,为了提高查询速度,系统修改的顺序为:SQL语句优化-〉数据库优化-〉操作系统优化,实际上还有一个方面:系统架构优化。但系统架构优化一般代价比较大,起码要项目经理拍板才能执行,所以在这里就不多说了。
对于一般的开发人员接触到最多的当属SQL语句优化。而SQL语句优化中除了对SQL语句本身的优化以外,创建合适的索引是较常用的方法。索引通常分为聚集索引和非聚集索引。
聚集索引表示表中存储的数据按照该索引的顺序存储,检索效率比普通索引高,但对数据新增/修改/删除的影响比较大,一个表只能存在一个聚集索引。如果没有特地的修改,主键都是聚集索引。
相对应的非聚集索引不影响表中的数据存储顺序,检索效率比聚集索引低,但对数据新增/修改/删除的影响很少。
创建索引的原则总结如下:
首先要判断表的存储数据量大小、高性能的操作要求(是频繁增删改操作还是频繁的查询操作)。对于要求频繁增删改操作的表,建立索引可能只会起到反作用。
1. 对于只有几十、几百条记录的表,建立索引的效果可能还不如逐行扫描来得快
2. 对于只有几个可能值的字段,最常见的如性别等字段,建立索引是无意义的
3. 对于在查询语句的WHERE子句中频繁出现的字段可以建立索引,但注意如果索引字段上存在函数,该索引失效。如:WHERE SUBSTR(NAME,1)=’N’;NAME字段上的索引不会起作用,改写成WHERE NAME LIKE ‘N%’, NAME字段上的索引才能生效。另外IS NULL和IS NOT NULL也会使索引失效
4. 适量的冗余字段可以减小查询的开销,虽然这样做不符合数据库范式的要求
5. 建立在大数据类型字段上的索引没有意义,比如SQLSERVER的IMAGE,ORACLE的LOB
目前市面上的查询优化器很多,如SQL EXPERT等,最直接的方法莫过于用这些工具试验怎样的索引最有效率