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,切记不可字符串拼接。
- 提前过滤特殊字符