索引
在DB中,索引建立的目的就是为了避免对表的扫描,以此减少大量的I/O操作,从而提高系统的性能
创建索引的一些规律:
表的主键和外键必须要有索引
对经常与其他表进行连接的表的连接字段应该建立索引
经常出现在WHERE子句中的字段应该建立索引
小字段应该建立索引
复合索引的建立需要经过仔细分析,尽量考虑用单字段索引代替
使用一个索引存取多行数据,在唯一索引上使用索引范围扫描的情况是在WHERE中使用了范围操作符
创建索引
CREATE UNIQUE INDEX student_id_index ON student(id);
使用SET AUTOTRACE TRACEONLY显示语句执行计划,此语句显示执行计划而不真正执行,它会大大减少优化时间,不过可以用来分析,用SET AUTORACE OFF结束执行计划的显示,切换回正确执行语句的方式
如执行SELECT * FROM STUDENT WHERE ID > 100;如下图可以看到索引扫描的存取模式为INDEX RANGE SCAN
其实还有全索引扫描,和全表扫描,全索引就是INDEX FULL SCAN,全索引扫描的情况是其查询出的数据必须从索引中可以直接得到
SQL语法调优
调优SQL的目的是避免没有必要的全表扫描,避免没有效率的查询
1) 避免在索引字段中使用IS NULL 和 IS NOT NULL(全表扫描)
可以将NULL补成有效值,比如学生学号无法为负数,则可用 Sno >= 0
2) 尽可能不采用“!=”(全表扫描)
索引只能告诉有什么样的数据存在于表中
3) 函数变化(全表扫描)
针对条件字段进行函数运算会造成全表扫描,其实对函数进行一些变换即可,如下
WHERE id * 2 > 2 可改为 WHERE id > 2/2