Mysql中select的正确姿势
引言
大家在开发中,还有很多童鞋在写查询语句的时候,习惯写下面这种不规范sql
select * from table
而不写成下面的这种规范方式
select col1,col2,...,coln from table
我也知道,这些童鞋是图方便,毕竟再敲一堆的列名,嫌麻烦!
你们上班可以问问自己的同事
你:“xx,知道select *和select所有字段的区别么?
同事:"额。。额。。额。。"
留下的只有尴尬的笑容!
我也知道,很多人至今都没有搞懂select *和selct 所有字段的区别
因此,我开一文来说明一下。另外,我选的是自己最熟悉的mysql数据库,此文的结论在oralce,sqlserver上是否成立,博主没做过测试。
正文
(select所有字段)性能高?
网络上流传着一种说法说是
“*” 表示通配所有字段,在SQL的机制里,需要先识别统计所有字段再进行下一步。
明确指定字段的话,会减少上述的操作,所以效率有所提升。
然而,实际上呢?效率是相差不大的!。
取博客http://flysnowxf.iteye.com/blog/1125032
的测试结果
mysql 5.1.37
表记录数41,547,002,即4000w行
使用远程客户端取1000条数据,统计时间:
SELECT * FROM `dmsp`.`dmsp_dimension_content` LIMIT 0, 1000;
时间2.218s,网络消耗0.547s
SELECT `id`, `appid`, `aop`, `t`, `uid`, `sid`, `pid`, `pname`, `bid`, `bname`, `ptype`, `sm`, `sv`, `bt`, `national`, `area`, `ov` FROM `dmsp`.`dmsp_dimension_content` LIMIT 0, 1000;
取出所有字段,时间2.250s,网络消耗0.578s
可以看出,这二者的时间差几乎可以忽略,另外还有一本书上的内容也可以佐证我的话。
《SQL CookBook》第一章 检索记录中1.1小节(原书第十五页内容如下):
此书也说明了,两种方式在性能上几乎是没有差距的。
那为什么还是不推荐select * ?
网络IO问题
很多文章里说什么,会带来额外的内存、磁盘、cpu的开销。对此,我有自己的观点。我觉得这不是主要原因。主要原因是带来了额外的网络开销。
在一个系统中,内存、磁盘、cpu的开销,不过是微妙级。造成系统的延迟的重头戏是网络开销。网络开销可能带来秒级的延迟。当然,如果你的应用程序和数据库是在同一台机器上的,那当我没说这句话!select *会查询出不需要的、额外的数据,那么这些额外的数据在网络上进行传输,必定会造成性能延迟。假设你的table中,有一个列的类型为binary。此时,你的select *操作,就会十分缓慢,并且会造成额外的网络开销。
索引问题
仔细看下面的两句sql
select col1 from table;
select * from table;
如果col1字段包含索引信息,那么此时,这两句的sql执行时间可能会有几十上百倍的差异。
在col1字段有索引的情况下,mysql是可以不用读data,直接使用index里面的值就返回结果的。但是一旦用了select *,就会有其他列需要读取,这时在读完index以后还需要去读data才会返回结果。这样就造成了额外的性能开销。
ps:我不想在这里扯什么覆盖索引,辅助索引的概念。其实要讲的很专业,扯一堆高大上的名词,我也可以。只是这样徒增读者的理解难度,尽量用通俗的方式来讲。
扩展性问题
有的人会觉得
使用select * ,这样在增加列的时候,不用改sql,方便!
然而实际上,你的sql是不用改了,但是对你的程序代码是有很大的影响的!
身为一名21世纪的优良程序员,我们是不能获取自己需要的东西的!你因为一时高兴,执行了select *,如果增加或删除列,会对你的代码有着极大的影响。
反过来,如果你select 指定列,只获取自己需要的几列,表结构的修改,对你代码的影响就会小很多。相比之下,风险就没有那么大了!
另外就是,对于其他人接手你项目的人来说,看到select 指定列的方式,可读性更强,对于他们来说更好上手!
Mysql中select的正确姿势的更多相关文章
- 【原创】Mysql中select的正确姿势
引言 大家在开发中,还有很多童鞋在写查询语句的时候,习惯写下面这种不规范sql select * from table 而不写成下面的这种规范方式 select col1,col2,...,coln ...
- mysql进阶(四)mysql中select
mysql中select * for update 注: FOR UPDATE 仅适用于InnoDB,且必须在事务区块(BEGIN/COMMIT)中才能生效. 作用 锁定该语句所选择到的对象.防止在 ...
- MySQL中select * for update锁表的范围
MySQL中select * for update锁表的问题 由于InnoDB预设是Row-Level Lock,所以只有「明确」的指定主键,MySQL才会执行Row lock (只锁住被选取的资料例 ...
- MySQL中select * for update锁表的问题
MySQL中select * for update锁表的问题 由于InnoDB预设是Row-Level Lock,所以只有「明确」的指定主键,MySQL才会执行Row lock (只锁住被选取的资料例 ...
- mysql中select into 和sql中的select into 对比
现在有张表为student,我想将这个表里面的数据复制到一个为dust的新表中去.answer 01: create table dust select * from student;//用于复制前未 ...
- MySQL中select * for update锁表的问题(转)
由于InnoDB预设是Row-Level Lock,所以只有「明确」的指定主键,MySQL才会执行Row lock (只锁住被选取的资料例) ,否则MySQL将会执行Table Lock (将整个资料 ...
- MySQL中SELECT语句简单使用
最近开始复习mysql,查漏补缺吧. 关于mysql 1.MySQL不区分大小写,但是在MySQL 4.1及之前的版本中,数据库名.表名.列名这些标识符默认是区分大小写的:在之后的版本中默认不区分大小 ...
- MySQL中select、insert、update批量操作语句
项目中经常的需要使用批量操作语句对数据进行操作,使用批量语句的时候需要注意MySQL数据库的条件限制,这里主要是数据的大小限制,这里对批量插入.批量查找及批量更新的基础操作进行下简单的汇总. 1.批量 ...
- 数据库:Mysql中“select ... for update”排他锁分析
Mysql InnoDB 排他锁 用法: select … for update; 例如:select * from goods where id = 1 for update; 排他锁的申请前提:没 ...
随机推荐
- css文字链接滑过向上移动1像素
方法一:行高 a{line-height:22px;} a:hover{line-height:21px;} 方法二:定位 a{position:absolute;top:0;} a:hover{ ...
- MySQL数据库事务各隔离级别加锁情况--read committed && MVCC(转载)
http://www.imooc.com/article/17290 http://www.51testing.com/html/38/n-3720638.html https://dev.mysql ...
- centos7.0下增加swap分区大小
承接上篇文章扩容磁盘空间后增加根分区的大小后,来扩容swap分区的空间 检查当前的swap分区情况 # free -m # free -g [root@localhost ~]# free -m to ...
- Fibonacci数列的两种实现方式
斐波那契数列的形式为:1,1,2,3,5,8,13,21......从第三项开始,后面的每一项都是前面两项的和. 实现的方式有一下 两种: 一:递归方式实现 def fib(n): if n < ...
- Java项目配置redis
成功配置redis之后,便来学习使用redis.首先了解下redis的数据类型. Redis的数据类型 Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set( ...
- [UE4]Canvas Panel
一.Canvas Panel:画布.Canvas Panel中内的元素可以任何摆放位置.Canvas Panel是UserWiget默认的根节点容器,可以把跟节点删除替换生成任何的UI元素. 二.选择 ...
- [UE4]获得特定类型的所有Actor:Get All Actors Of Class、Get All Actors with Interface、Get All Actors with Tag
- SQL-sqlHelper001
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...
- SCCM2012 R2实战系列之九:OSD(中)--捕获镜像
在上篇文章中我们详细的完成了OSD的初始化配置.导入镜像.任务序列的创建和常见问题的排错.但是在实际环境中这样分发了干净的操作系统后还需要手动为客户端安装各种各样的应用程序.所以更为好的方法是将一台计 ...
- sso CAS
sso:single sign on,在多个应用系统中,用户只需要登陆一次就可以访问所有相互信任的应用系统 CAS框架:Central Authentication Service是实现sso单点登录 ...