MYSQL-谨慎使用 select * ?
每次在写SELECT查询语句的时候,都需要用怀疑的眼光审视,是不是真的需要返回全部的列,确定要使用SELECT * FROM?是否确实需要返回全部结果集,确定不加LIMIT限制?
下面对这些情况加以解析和说明,仅供参考。
错误方式:
select * from TblA;
这将取出表的全部列,会让MYSQL优化器无法完成索引覆盖扫描这类优化,还会为服务器带来额外的I/O,内存和CPU的消耗。造成系统的延迟的重头戏是网络开销,网络开销可能带来秒级的延迟,select * 会查询出不需要的、额外的数据,那么这些额外的数据在网络上进行传输,必定会造成性能延迟。假设你的table中,有一些列的类型为BLOB,TEXT等,此时,你的select *操作,就会更加缓慢,并且会造成额外的网络开销。
正确方式:
select col1 from TblA LIMIT 10;
在col1字段有索引的情况下,mysql是可以不用读data,直接使用index里面的值就返回结果的。但是一旦用了select *,就会有其他列需要读取,这时在读完index以后还需要去读data才会返回结果。这样就造成了额外的性能开销。如果不需要全部结果集显示,最好根据实际情况在查询后面加上LIMIT,这样MYSQL就不会查询出全部的结果集了。
错误方式二:
select * from TblA
inner join TblB USING(A_ID)
inner join TblC USING(B_ID)
WHERE TblA.id = ?;
这种方式将返回三个表的全部数据列,正确的方法是应该指定只取需要的某些列名称,如:
select TblA .col1,TbleB.col2 from TblA
inner join TblB USING(A_ID)
inner join TblC USING(B_ID)
WHERE TblA.ID = ?;
总之,查询超过实际需要的数据,然后这些多余的数据会被应用程序抛弃,这会给MYSQL服务器带来额外的福大,并增加网络开销,同时也会消耗应用服务器的CPU和内存资源。
当然有的人会觉得使用select * ,这样在增加列的时候,不用改sql语句,可以简化开发,可提高相同代码片段的复用性。但是如果你select 指定列,只获取自己需要的几列,表结构的修改,对你代码的影响就会小很多,另外对于其他接手你项目的人来说,看到select 指定列的方式,可读性更强,对于他们来说更好理解!所以,谨慎使用select * from!
备注:实战示例,解疑答惑。
--不间端地思考,实时地批判你的工作!