数据库开发小知识普及二

数据库开发小知识普及二:

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中的变量类型,和数据库表的字段类型保持一致。避免因为类型不一致导致的全表扫描,不走索引。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值