数学建模社区-数学中国
标题:
数据库中常用术语:
[打印本页]
作者:
杨利霞
时间:
2021-6-24 16:35
标题:
数据库中常用术语:
; x& T: }* X2 t* Y1 |
数据库中常用术语:
; J. e; }7 p! X1 T
1、SELECT子句中避免使用 *, 尽量应该根据业务需求按字段进行查询
- ?* _7 v1 u; |& E9 O$ Q/ b9 q) F( W
2、尽量多使用COMMIT如对大数据量的分段批量提交释放了资源,减轻了服务器压力
* F& i( I" a" t) o) Q$ v& B6 f6 @3 `
3、在写sql语句的话,尽量保持每次查询的sql语句字段用大写,因为oracle总是先解析 sql语句,把小写的字母转换成大写的再执行
# q2 X0 Z% k, S' y2 r8 h6 j
4、用UNION-ALL 替换UNION,因为UNION-ALL不会过滤重复数据,所执行效率 要快于UNION,并且UNION可以自动排序,而UNION-ALL不会
% O; o$ A3 u( w) L7 [5 J5 E- Q" N1 u
5、避免在索引列上使用计算和函数,这样索引就不能使用
" H! t0 { r9 X; p2 k
Sql优化精简版:
( F8 V3 h# J5 ?- R
1.(重点)(必须说) SELECT语句中避免使用 ,
" Z+ Y) X. q% u% Y2 M5 U5 m
尽量应该根据业务需求按字段进行查询
' F8 n- \: D2 v
举例:如果表中有个字段用的是clob或者是blob这种大数据字段的话,
3 g+ P4 S! t& ^
他们的查询应该根据业务需要来进行指定字段的查询,切记勿直接用
4 f" }0 k: F" @( I7 {0 Z
2.(重点) 删除重复记录(oracle):
% O0 r$ r4 ~0 F" p ?$ U i
最高效的删除重复记录方法 ( 因为使用了ROWID)例子:
# K, @5 ], X* j& Q& Y
DELETE FROM EMP E WHERE E.ROWID > (SELECT MIN(X.ROWID)
: F: M+ W( o" e( l' K
FROM EMP X WHERE X.EMP_NO = E.EMP_NO);
4 ]* V0 [& W# r7 ^; e5 G8 w
3. 用>=替换>
- J9 L1 V+ W# c3 B( C5 @4 S$ Z
如一个表有100万记录,一个数值型字段A,
$ @5 S/ M* X' Q
A=0时,有30万条;
- x1 @( g' u& u0 ^; ^
A=1时,有30万条;
( b4 W9 t' H& h& l4 r) q/ g
A=2时,有39万条;
5 c& y7 d4 C' ^! t8 \/ L
A=3时,有1万记录。
$ p: |& P+ F8 o% K3 T D3 X! _2 Y3 m
那么执行 A>2 与 A>=3 的效果就有很大的区别了,因为 A>2 时,
9 v, Y5 u% C( q( `; v1 e' V
ORACLE会先找出为2的记录索引再进行比较,
, y( O6 y" L5 A
而A>=3时ORACLE则直接找到=3的记录索引。
2 }' y( v/ X1 Z
4.(重点)尽量多使用COMMIT
+ p7 D( ]0 s \9 v; ^! o! P( K
如对大数据量的分段批量提交
7 Q) e) P3 j! e% i4 v Z
5. (重点)用NOT EXISTS 或(外连接+判断为空)方案 替换 NOT IN操作符
7 Z. V2 Z- e& F. A
此操作是强列推荐不使用的,因为它不能应用表的索引。
5 z8 N' a" L: W& e5 o
推荐方案:用NOT EXISTS 或(外连接+判断为空)方案代替
2 W# A9 c" l6 I* ^- ~) y
6.(重点 必须说)LIKE操作符(大数据的全文检索使用luncene)(solr)
5 S/ C4 ^4 E2 H* P; X& l% R
因为使用like不当,会导致性能问题,原因是like在左右两边都有
, [9 o3 \/ _( ~# i* z9 z
%的时候,不会使用索引。
! N: \- W8 }' r& Q1 G7 z
如LIKE ‘%5400%’ 这种查询不会引用索引,
4 l: w. G9 u; S3 }, n
而LIKE ‘X5400%’ 则会引用范围索引。
5 V, ?' b) u: _/ Q; k; E
一个实际例子:
" ?/ @0 D+ R/ z( B* V7 V! d( F
查询营业编号 YY_BH LIKE ‘%5400%’ 这个条件会产生全表扫描,
1 A0 ^( ? q1 j5 ]: a a7 m2 }+ v
如果改成 YY_BH LIKE ‘X5400%’ OR YY_BH LIKE ‘B5400%’
6 w& g' F3 f. _( Z" d; m" x
则会利用 YY_BH 的索引进行两个范围的查询,性能肯定大大提高。
1 s& v$ Q" C: ?- v, `3 M% P: ~
7.(重点,必须说)避免在索引列上使用计算和函数,这样索引就不能使用
# _: b" d, |% [/ i9 n* t
举例:
, l# _1 ~4 _* K( Y5 A
低效:
$ n* z' K! J* I4 v
SELECT … FROM DEPT WHERE SAL * 12 > 25000;
) N& P; D: [6 q* |) x3 N
高效:
5 T2 K. x& ]* }) V* L2 k7 Z, P' r
SELECT … FROM DEPT WHERE SAL > 25000/12;
" p" U0 l- d, W3 q i6 }
8.(重点 必须说)用UNION-ALL 替换UNION,
5 q0 w5 i; g9 w+ \- R; g
因为UNION-ALL不会过滤重复数据而且不会自动排序,
' v5 A. O. b4 Q5 P: |9 \
所执行效率要快于UNION。
# n) l5 ~ A9 l- [6 R
9. (优化,重点,3个方面 a.缓存 b.分段批量 c.存储过程)减少访问数据库的次数
I4 f+ W# D7 S
举例:如果批量删除多条数据,可以用 delete from tableName where id in (1,2,3)
; D7 M4 @$ R1 k' \6 f# {9 | L+ F7 m
而不要用多条delete语句进行删除
- c z. C, e% z' V: ~7 A! L( k
10.(重点 必须说)用TRUNCATE替代DELETE
4 ^5 C6 |3 {5 y4 F
TRUNCATE不记录日志,DELETE记录日志,所以TRUNCATE要快于DELETE但是一旦用TRUNCATE进行删除就不能进行恢复,TRUNCATE是删除整张表的数据不能加where条件。
7 m- e" \, j. F' u2 L2 o
mysql,sqlserver中如果id为自增类型,那么如果用TRUNCATE删除,则id字段再插入数据时从1开始,如果delete删除的话,则从删除之前的id的值继续增长。
* Y7 Y! W" _. T; n4 Q3 ^' x4 v8 r N
四、防sql注入
7 g' H+ `* f, ?
针对防sql注入,我们通常是这样做的:
. h( U7 I2 W9 ]+ `
首先在前台页面对用户输入信息进行js验证,对一些特殊字符进行屏蔽,比如:or ,单引号,–,= ,还有就是限制用户名输入的长度,我们一般将其限制在6—13位。另外,对于用户的敏感信息我们进行Md5加密,还有,为了增加用户体验度和用户友好度,为了不使用户看到一些详细的异常信息我们会进行错误信息页面的定制,像404,500错误。另一个我层面讲,这样做也是为了保护我们的一些重要信息。此外,我们会给特定的人分配定定的权限,而不是给其分配管理员权限!
/ `' l# F/ v# T N' y
sql注入
) x. y" J4 \8 N% d
所谓SQL注入,就是通过一些含有特殊字符的sql语句发送到服务器欺骗服务器并进行攻击。(特殊字符:or, 单引号,–,空格)
, W; l& J9 k4 G* j$ o5 F5 y: m
Sql注入的防护
# y' {& {% e3 ^+ T2 w6 i
1.永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式(js正则或者java后台正则),或限制长度;对单引号和双"-"进行转换等。
7 F1 ?/ q- @. F1 h6 l* t) l) f. u
2.永远不要使用动态拼装sql,使用参数化的sql。(永远不要使用+号拼接sql字符串,而是使用?传参的方式进行)
! f, @) m# ~( H0 P; A4 J1 R7 O
3.不要给用户太高的权限而根据需求进行赋权
" C8 ^; @1 \5 R- C, V2 ^( X
4.对敏感信息进行加密 如md5(单向加密不可逆转)。
K3 g1 V+ q/ d3 D" _% T! D# d& f+ v
5.自定义错误页面。目的是为了不把我们的程序的bug暴露在别有用心的人的面前。而去不会让用户看到报错的页面,也提高了用户的体验度。
2 i) \2 }3 _# C: {
SQL注入防范
4 s' d8 S2 ]" Z" I- f
使用参数化的过滤性语句
' w4 ?) A- @5 K2 G- L( y: S/ m
要防御SQL注入,用户的输入就绝对不能直接被嵌入到SQL语句中。恰恰相反,用户的输入必须进行过滤,或者使用参数化的语句。参数化的语句使用参数而不是将用户输入嵌入到语句中。在多数情况中,SQL语句就得以修正。然后,用户输入就被限于一个参数。
! r7 l) {) ?8 ~' K9 k; J; ?
5 }' x" ]+ L0 _" n9 m
# V f2 e& G) J; S. V5 W+ i6 \
数据库中常用术语:
) u7 D! a5 A5 m' i5 {7 |+ P
ddl:数据定义语言 Create Drop Alter
* o5 |% ^; j* j
dml:数据操纵语言 insert update delete select
+ D) m& I( m( n) a9 [; u0 C! ?' [: q
dcl:数据控制语言 grant revoke
) k; |& n, D% b% V: C }3 k; a
tcl:事务控制语言 commit rollback
7 a( Z( L5 ?6 R0 S' f
————————————————
* y5 i# c" `" D7 N4 `( `8 t1 v
版权声明:本文为CSDN博主「z1427094386」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
9 f! ]2 V Y4 V4 G1 [5 y
原文链接:https://blog.csdn.net/z1427094386/article/details/117919670
, e9 r- w3 U8 f t, \. D. }
. t4 B" ]) r; Y1 w% r
' x( K$ k3 V) m5 U0 n
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5