mysql开发总结

count(*)和count(1)的区别

对于Count(列)来说,评估列中每一行的值是否为NULL,如果为NULL则不计数,不为NULL则计数。因此Count(列)会计算列或这列的组合不为空的计数。

count(*)的规则是,找一列NOT NULL的列,如果该列有索引,则使用该索引,当然,为了性能,SQL Server会选择最窄的索引以减少IO。

 

count(*)只是返回表中行数,因此SQL Server在处理count(*)的时候只需要找到属于表的数据块块头,然后计算一下行数就行了,而不用去读取里面数据列的数据。

而对于count(col)就不一样了,为了去除col列中包含的NULL行,SQL Server必须读取该col的每一行的值,然后确认下是否为NULL,然后在进行计数。因此count(*)应该是比count(col)快的

不加WHERE限制条件的情况下,COUNT(*)与COUNT(COL)基本可以认为是等价的;

所以,如果不影响逻辑,用count(*)效率最高,如果需要判断某列不能为null则必须用count(col)。

or,in和exists的性能问题

一般来说能用in尽量不用or,如果所在列有索引或者主键性能没啥差别,如果没有索引,in的效率会高很多;

select * from A where id in(select id from B)和select a.* from A a where exists(select 1 from B b where a.id=b.id)

exists()适合B表比A表数据大的情况,in则相反。

sql注入问题

入参是"or 1 = 1;drop table -- ",通过or可以绕过验证,分号并最后双横杆能执行任意sql,危害很大。

解决办法:

  • 使用预编译方法PreparedStatement,切记不可字符串拼接。
  • 提前过滤特殊字符

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值