若是你没有看过以前的(一)或者没有下载这份手册的话,下面有连接,仍是对照手册食用毕竟好。html
http://www.cnblogs.com/linkstar/p/6413402.htmljava
(二)的地址在下面,是关于异常和日志的。mysql
http://www.cnblogs.com/linkstar/p/6415788.htmllinux
手册我特意在博客园文件中放了一份在线的仅供参考(由于好像发现最上面那个地址须要登陆。。。)程序员
该说的我以为(一)里面我都说完了,那么就直接进入正题吧。数据库
照例先讲废话:windows
mysql做为开源的数据库,由于其大小和功能等一直被人们所喜欢,因此用的人比较多,学习时咱们也常用,对于小型项目来讲,mysql不少时候已经足够用了,因此这里阿里给出的也是mysql的规范,对于其余的数据库来讲也是同样的。可是,对于数据库的表名,字段名,sql语句,这些的规范对于设计数据库和开发来讲是十分重要的,由于数据库和代码不一样,代码能够修改,可是数据库的修改真的是“牵一发而动全身”,因此开发前仍是仔细斟酌。性能优化
废话完了。服务器
在下面先讲一个重点:MySQL中的数据库名和表名和操做系统有关,在windows操做系统中,不区分大小写,在unix ,linux操做系统中,是区分大小写的。这个坑我是被踩过的,就是由于命名不规范的缘由,有人在命名表的时候使用了大写字母(实际产生的表的名字仍是小写),并且在sql语句中使用的也是大写字母,由于开发是在windows平台,一切正常,由于大小写不区分,因此执行的时候,大写字母自动变成小写,可是以后一到linux服务器上面,就炸炸炸!!!因此这就是为何表的名字必须使用小写和下划线的缘由。
一、不少人会奇怪为何会有这一条,我补充一句,合适的数据类型能够在省空间的同时避免你不少的错误。再附赠一张mysql数据类型和java数据类型对应的表,这张表挺好用的,等到你用多了以后,天然就能熟练对应了。
六、float和double在使用时会出现精度丢失的状况,使用decimal不会,可是要注意的是decimal的范围是你本身设置的,在平时的使用中尽可能准确去估计你要使用的大小,(暂时尚未decimal不够用的状况)
九、自增id就不说了,惟一性约束,主要是说明一下gmt_create和gmt_modified字段,一开始看,我懵逼了,这是啥,也没说明是什么,后面想一想一个是建立时间,一个是修改时间,gmt是格林尼治标准时间….好吧,我也有点醉醉的。我的认为是这样的,首先添加时间对于不少来讲是须要的,对于不少业务来讲很重要,而修改时间是为了后期万一出现问题反查数据检错用的。目前修改时间在个人项目中用的并很少,添加时间却是几乎都有,以后会考虑加入修改时间,可是并不是强制。
十二、数据库不写注释的人,一抓一大把,真的是,每次去维护一个旧的项目,就会发现不写数据库注释的,你不写数据库注释对于别人来讲,那么对于字段名表名将一脸懵逼。因此要养成良好的习惯,注释并不是只有在代码中写的。
千万不要忽视索引的重要性,一个数据库有没有索引查询的效率是很是不同的,由于不少时候咱们刚开始学习数据库的时候,可能索引只存在于课本或者视频,实际中感受好像没用,其实主要缘由是数据量小的时候你根本感受不出没有索引的查询时有多么的慢,因此索引的重要性就要注意咯。
二、join,表链接是很是影响性能的,我曾经看到,一个设计很是很差的数据库交到一个程序员手里,结果这个程序员是个真码农,写了一个11张表链接的查询,结果可想而知,连在不大的数据状况下,打开页面都要1分钟。因此尽量的连的少。
四、有人可能奇怪这一条,为何左模糊或者全模糊都不行,那么右模糊是否能够呢?右模糊可使用,为何别的不行呢?由于别的效率真的很低,左模糊和全模糊的查询效率在数据量大的时候很慢,比右模糊要慢的多。
$sql1 = "...... title like someTitle%" (花费0.001秒)
$sql2 = "...... title like %someTitle%" (花费0.8秒)
七、总结一句话,在写sql的时候,尽量的先将容易被筛选的条件和那些能够去除掉不少不须要数据的条件先写(也就是第九条也提到的),使查询加快。延迟关联是也就是指,先加条件查询掉那些条件以后再去关联别的表去查询所有的数据,而不是关联以后再去查。
八、这条要求可能就比较严格了,做为我来讲,暂时尚未那么数据量大的级别的项目须要进行全部的sql的优化,我只是对于那些访问量极高的,一个项目里面也就那么几个极其重要的sql进行特定的优化,主要也是优化查询的性能。对于sql性能优化来讲,这种事情仍是须要专业的DBA的,毕竟人家是吃这碗饭的,本身想到优化的点仍是太少,网上有不少sql优化的讲述,我这里就很少说了。
三、sum还有max等函数,当使用这些函数进行查询的时候必定要注意,返回的多是null,不过个人作法和手册给出的不一样,由于在个人想法中数据库尽可能是不能放逻辑代码的(后面我也会说到),当遇到这种状况时,我会使用包装类来接受数据库返回的结果,由于普通的int是不能为null的,由于是基本类型,而包装类Integer是能够为null,而后你只须要对这个对象进行判空便可,这样逻辑就存在于java代码中了。
六、不少学生,特别是学生,常常有疑问的就是,我在学校里面学习数据库的时候,老师经常交咱们外键是什么,表里面外键是哪一个,可是开发中历来不会有人跟你说外键,为何?缘由就在这里,外键形成的影响,首先是使表的状况你不可控,有时你彻底不知道数据变化会致使怎么样的结果,还有就是影响数据库的性能,数据库每次都要管理你的外键,每次的插入还要去判断外键,等等,不少性能都浪费了,不少的约束和保证都已经由索引来完成了。
七、我并非很是认同这个观点,至少我认为并发强制,缘由是这样的,存储过程确实须要面对各类各样的问题,可是并不能一棒子打死,在某些特殊的地方,举个极端的例子,若是要运行的是1M的sql,而网络带宽还特别差,还要求你运行速度高,这样的状况下就可使用存储过程,由于存储过程的sql是存放在服务器上面的,不须要经过网络进行传输,在网速不好的状况下也能有很高的速度,虽然这个例子可能有点极端,可是我想说明的就是这样一个意思,即便我到如今为止只用过一次,可是并不能说永远都不使用了。
十、表情使用utfmb4
一、只有懒惰的像猪的程序员才用select *
八、修改你须要的字段,不要的字段不要去修改
九、不要在类上面写@Transactional,我见过不少人偷懒,直接在类上面写@Transactional,这样致使这个类的每个方法都采用了事务,可是实际上,不少时候是不须要事务的。
须要使用事务的状况:1、屡次修改不一样的数据。2、屡次删除不一样的数据。3、多种操做间存在关联性,前面操做失败会直接致使后面出现问题,且前面的操做不回滚会出现脏数据的状况。
事务是很影响执行时间的,因此要慎用,也要用的好。
这里还有几点须要补充的,这里没有提出触发器的问题,这个也是不少人问过个人,个人回答是,触发器不到万不得已不要使用,由于这东西和外键是同样同样的,不少时候都是会让你不可控制,并且维护起来很是难。还有就是数据库必定要备份。有bug不怕,一旦数据出问题,并且数据库恢复不出来的话,那就神也救不回来了。新闻也报道过不少次数据库的意外,特别是游戏的。
总之对于数据库,咱们要学习的还有不少。我以为手册的总结也是对于开发来讲的,对于DBA可能要求比这个要多的多。因此若是你是DBA的话可能要了解的更加深刻才行哦。