《SQL语句书写规范.docx》由会员分享,可在线阅读,更多相关《SQL语句书写规范.docx(4页珍藏版)》请在优知文库上搜索。
1、Ibl中col1类型为varchar(10)Select*fromtblwherecoll=2;注:假如col1字段为int类型Select.*fromtblwherecol1=2;可以用到索引4、尽量避开在where子句中对字段运用函数或表达式操作,这将导致引擎放弃索引而运用全表扫描例:select*fromtblwheresubstring(col1,1,4)=1234:不管col1是何种类型的索引都会失效,应改为select*fromtblwherecolllike1234%;5、由上面的问题引申出在查询时运用like的问题。select*fromtblwherecol1like1234
2、%:这种查询方法要比SeIeCt*fromtblwherecol11ike%1234%和select*fromtblwherecolllike%1234这两种方式性能高出4-5倍,因为其次种和第三种方式将无法运用索引。6、避开运用!=或V、ISNU1.1.或ISNOTNU1.1.IN,NOTIN等这样的操作符,因为这会使系统无法运用索引,而只能干脆搜索表中的数据.7、尽量运用数字型字段,把数值信息的字段设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接会逐个比较字符串中每一个字符,而对于数字型而言只须要比较一次就够了。8、合理运用EXISTS,NOTEXIS
3、TS子句。例:1.Selectsum(tl.cl)fromtlwhere(selectcount(*)fromt2wheret2.c2=tl.cl)O2.Selectsum(tl.cl)fromtlwhereexists(select*fromt2wheret2.c2=tl.cl)两者产生相同的结果,但是后者的效率明显要高于前者。因为后者不会产生大量锁定的表扫描或是索引扫描。9、leftjoinon/rightjoinon;join操作MySQ1.内部采纳了一种叫做nestedloopjoin的算法。Nested1.oopJoin事实上就是通过驱动表的结果集作为循环基础数据,假如运用inner
4、join的话MySQ1.会自动地选择小表去驱动大表,而leftjoin会指定由左边的表去驱动右边的表,假如不能确定那个表的结果集更小,就改用innerjoin有MySQ1.自动去选择驱动表。10、orderby假如针对一个字段进行排序操作,尽量运用索引字段假如针对两个字段排序操作,单独对两个字段建索引,。rdcrby无法运用索引,须要对两个字段建立一个联合索引,并且Orderby字句的字段依次要与联合索引中的字段依次保持一样。11、万不要运用OrderbyrandO这个语句。Orderbyrand()Iimill这条吩咐可以满意一个随机取出一条数据的需求,但rand()函数会耗费大量的CPU资
5、源。运用rand()将数据行结果集打乱,会使数据库性能直线下降,可运用其他方式代替。12、Count任何状况下SE1.ECTCOUNT(*)FROMtb是最优选择:尽量削减SE1.ECTCOUNT(*)FROMtbWHEREcol=value这种查询;杜绝SE1.ECTCOUNT(col)FROMtb的出现。在没有where条件出现时CoUntC*)和COUnt(CoI)基本等价,在有Where条件状况下CoUnt_(*)比COUnI(COI)快许多,应为count(*)会自动去找寻主键13、1.imit1.imit运用有两种方式limit10和1imit10,10在表的数据量不大和offse
6、t也不大的状况下没有明显差距但是假如是limit10000,10的话这种做法性能会比较差,建议方法先取出第100OO行的id值然后where条件限制从100Ol起先取值limit1014.where子句中避开出现数学运算,因为对字段做数学运算会导致执行索引扫描例:select*fromtblwherecol1/2100可转换成select*fromtblwherecol120015联合索引运用方法1、idx(a,b)wherea=xx/a=xxandb=yy可以用到索引whereb=yy无法用到索引2、idx(a,b,c)能用到索引wherea=xx/a=xxandb=yyandc=zz/a=
7、xxandb=yya=xxandC=ZZ/b,c,a/c,b,a不能用到索引whereb=xx/c=xxb=yyandc=zz一句话=运用联合索引where条件中必须要运用最左侧的索引字段依次无所谓。二、update语句1.尽量避开update主键字段2,尽量避开update索引字段3,尽量避开updatewhere字句中包含的字段4update操作where字句中须要带上索引字段,否则会锁表,导致其他操作锁等待。三、写在最终在写SQ1.语句时尽量依据以上这些原则来实现,能避开许多性能问题,也能为以后的工作削减时间消耗。建表部分一、表名和字段名表名和字段名的命名规则见名知意不要运用保留关键字运
8、用小写并用.分隔如无特别需求建表语句中不要设置存储引擎和字符集二、字段数据类型1、运用ini型的字段作为主键,假如业务上不存在最好设置一个自增的id作为主键2、VarChar(255)中的数字代表字符数而不是字节数,尽量够用就可以不要设置过大,单行的VarChar字节数最大为65535设置过大会使存储空间奢侈3、存储精确浮点数要运用DECIM1.替代F1.oAT和DOUB1.E4、存储时间(精确到秒)建议运用TIMESTAMP类型,因为TlMESTAMP运用4字节,DATETIME运用8个字节5、禁止在数据库中运用VARBINRY.B1.OB存储图片、文件等6、不建议运用ENUM类型,运用TINYTNT来代替7、建议运用UNSIGNED存储非负数值8、字段名不建议运用user,key,keys,type,status等这一类的保留关键字可以加前缀运用。否则每次运用这些字段都要转义9.Int(2)不如替换成tinyint,tinyint可以存储(-255,0)(0,255)的数字,而且tinyint只占用1个字节,int占用4个字节10、非唯一索引的索引名应依据idx_字段名命名11、唯一索引应依据Uniq_字段名命名12、字段名都是用小写(borrowrcpay_record)