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; 排他锁的申请前提:没 ...
随机推荐
- gitlab ssh clone问题解决
公司搭建的gitlab,通过http协议可以clone: [sisi@pre-srv24 gitlab]$ git clone http://gitlab.test.mycompany.com/dev ...
- solrCloud index search (图)
结合网上的资料,抄袭了几张图,记录下. 1.solrcloud-collection/shard/replica 1.Replica.Leader是core的角色,在index.search的过程中作 ...
- 使用R语言-计算均值,方差等
R语言对于数值计算很方便,最近用到了计算方差,标准差的功能,特记录. 数据准备 height <- c(6.00, 5.92, 5.58, 5.92) 1 计算均值 mean(height) [ ...
- JSON 语法
ylbtech-JSON: JSON 语法 JSON 语法是 JavaScript 语法的子集. 1. JSON 语法规则返回顶部 JSON 语法是 JavaScript 对象表示语法的子集. 1. ...
- go语言笔记——切片函数常见操作,增删改查和搜索、排序
7.6.6 搜索及排序切片和数组 标准库提供了 sort 包来实现常见的搜索和排序操作.您可以使用 sort 包中的函数 func Ints(a []int) 来实现对 int 类型的切片排序.例如 ...
- [UE4]蓝图函数库
在任何蓝图上都可以调用“蓝图函数库”的方法
- linux下打开文件、编辑文本cat\gedit\nano
cat: 文本编辑器:gedit.nano,要获得根权限,在前面加上sudo
- Tomcat 环境部署网站. 帆软平台部署.
主要内容. 需要使用Tomcat 部署 帆软报表平台(以下简称报表平台). 报表平台可以集成到网站, 也可独立部署. 此处是独立部署.即通过 网址:域名 独立访问这个报表平台. -- 技术要点 Tom ...
- Python: 如何写一个异常
例子1 try: #test area function() except Exception, e: print e.message 例子2:用raise抛出一个异常 if bool_var is ...
- root用户以修改文件的方式,修改用户密码
老早就听说linux的用户密码只是存储在普通的文本文件里,但一直没去了解,今天遇上了需要强行修改的情况... 给碰到个奇葩linux,居然没有passwd命令. 生成密码摘要 openssl pass ...