数据库开发小知识普及二:
1.索引小知识
(1)在平时使用索引时,要注意索引不能存储空值的特点。
(2)当执行count()类型的sql时,如果表中有主键或者非空字段的索引,是能够走索引的。如果所有的索引列都没有指定非空,count()无法使用索引。
(3)对某列进行sum/AVG等聚合sql,如果sum或者avg的列指定了非空,并且有索引,也是能够使用索引的。如果列允许为空,用不到索引。
(4)当执行max/min这种sql时,无论列是否为空,有索引的话,都可以用到索引。
(5)注意传入变量的数据类型和表字段的数据类型要保持一致,否则容易索引失效,SQL走全表扫描。
2.案例分享
某数据库曾有一个慢sql,单次执行7秒左右,且执行频率较高。语句简化后如下:SELECT * FROM P_MEMBER WHERE MEMBER_ID=:1;
这个sql语句的条件是有索引的,且索引选择性较高,按正常来说应该走索引。但sql实际执行计划每次都是全表扫描,特别耗费数据库资源。跟研发伙伴多次沟通排查,发现:应用程序传入的MEMBER_ID变量值是integer的,但是表中MEMBER_ID字段是char(10).这个sql语句的member_id字段发生了隐式类型转换TO_NUMBER("MEMBER_ID"),转换成了number型之后,才与传入的变量值进行比较。因此无法使用索引。
解决方案:1.修改应用程序,传入变量转换成字符类型。2.应用不动,创建一个函数索引。注意执行效率上:全表扫描<函数索引<普通索引。因此方案一是最佳方案。
总结:需注意应用程序sql中的变量类型,和数据库表的字段类型保持一致。避免因为类型不一致导致的全表扫描,不走索引。
1068

被折叠的 条评论
为什么被折叠?



