索引的创建原则
什么情况下适合创建索引:
- where子句频繁使用的列上
- 经常用来排序的列
- 分组经常使用的列(group by xx)
- 查询经常使用的列,可以建立索引提供查询效率
- 小表上不要建立索引(表中的数据太少)
- 多表连接时,在连接条件列上建立索引
- 表的主键、外键最好建立索引
- 索引字段类型选择尽可能小,字段类型大的不要建立索引,如oracle中的blob
- 修改频繁的字段,不要建立索引等等
索引失效情况
什么情况下索引会失效:
- sql中使用in或者not in,会导致全表扫描,索引失效
- like中使用通配符开头,也会导致索引失效,如:like ‘%w’,像like ‘w%’是会使用索引的
- where子句中进行空值判断(is null)、字段的表达式计算、不等的判断:!=或者(<>)、使用or作为连接条件且左右字段不全是索引字段时都会使索引失效
- sql的全表扫描查询比索引快时,索引失效(一般不会出现)
- sql的字段隐式转换时会导致索引字段失效,如,varchar age,使用时赋值age=18等等
常见的sql优化策略
- 上述索引失效的情况的反面都可以看成优化sql的情况
- 使用选择列(具体的列名)代替*,使用*会导致全表扫描
- 使用exists代替in
- 子查询select尽可能少,尽可能sql压缩成一条select查询
- 使用表的别名
- 字段定长改为可变长度,如char改成varchar,提高数据库执行效率等等