文章目录
mysql
- 事务是计算机应用中不可或缺的组件模型,它保证了用户操作的原子性 ( Atomicity )、一致性
( Consistency )、隔离性 ( Isolation ) 和持久性 ( Durabilily )。 - 索引是帮助MySQL高效获取数据的数据结构。更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。
事物四大特性
- 原子性:要么全部做完,要么全部不做。事务的最小单位
- 一致性:事务开始前和结束后,数据库的完整性没有遭到破坏。(AB转账问题)
- 隔离性:同一时间,只允许同一事务访问同一数据,不同事务之间不能有任何干扰。(A取钱时B不能向他转账)
- 持久性:事务完成之后,事务对数据库所有更新被永久保存在数据库中,不能回滚。
事务的并发问题与解决
- 脏读:事务A读取到事务B未提交的数据(内存中的数据,或者事务B进行回滚操作)
- 不可重复读:同一事务内两次读取的数据库值不一样(读取到事务B修改后的操作:你转账的时候看到你有100,但是你正转的时候你妈刷走了50,导致转账不能成功。)
3 .幻读:不可重复读侧重于事务A读到事务B修改,而幻读侧重于事务A读取到事务B对数据的新增和删除。(层级不一样)
这是一个包含关系:出现脏读一定会出现不可重复读与幻读,解决方式为mysql的四大事务隔离级别:
- 读未提交:会出现脏读
- 不可重复读:会出现不可重复读现象
- 可重复读:会出现幻读现象
- 串行化:等级最高,锁住整个表。不会出现任何事务并发问题(性能降低)
mysql优化
- 查询数据库数据尽量使用索引来查询,尽量避免全表扫描。尽量只查询索引条件的数据(例如只查询id只比查询name会高很多,因为id存储在叶子节点,建立了索引了,索引值已经放在里面了)
- 尽量避免使用on来链接条件去查询,会进行全表扫描,可用union之类代替。
- 在连续数字查询时,能使用between(范围查询)时不要使用in,或者not in(走全表)
- sql查询查询的where条件中不要进行表达式操作
- 在where条件中不要进行函数操作,也可能会让引擎放弃索引操作
- 多张数据表查询数据,使用inner jion 、left jion、 right jion代替子查询
mysql索引数据结构(B+树)
- 索引以文件的形式存放在磁盘中,应减少磁盘IO操作
- 顺序查找:效率相当低,二叉树查找:数据效率有所提升,而且极端情况下二叉树有可能是一个线性结构,就是个顺序查找了(需要注意平衡二叉树操作)。 哈希索引查找:会提升索引效率,但是只能精确匹配才有效率,如果模糊或者范围查询即不能做到。红黑树:一种平衡的二叉树,数据量大的话,就可能树的高度非常高。逻辑上很近的父节点,可能物理上距离很远。无法利用局部性,IO查询还是比较低的。B树:每个节点是一个二元数组,每个节点都可以存储数据,key就是索引,data就是具体的值。从根节点二分查找,找到返回节点,否则在相应的区间(key的指针位置)递归查找,找不到返回null。缺点是在插入删除时会破坏数据的位置,需要对数据分列,转移,合并等操作。B+树:mysql索引使用的数据结构,B+树非叶子节点不存储数据,非叶子节点只存储索引,在这个基础上增加了顺序访问指针,大规模按顺序读取数据。
mysql索引类型
- 普通索引:最基本的索引,没有任何限制。创建表时创建,或者后续更改
- 唯一索引:索引列的值必须唯一(可以存着一个空),如果使用组合,组合也必须唯一。约束
- 组件索引:一种特殊的唯一索引,特殊在:一个表只能有一个组件索引。不允许有空值,一般使用id
- 组合索引:多个属性字段上建立索引。和普通索引创建方式一样(小括号里跟多个字段)必须使用第一个字段,可以不使用后面的字段)
- 全文索引:检索全文中的关键字,而不是直接与索引中的值作比较。更像一个搜索引擎。
哪些情况下创建索引
- 组件自动创建索引
- 频繁查询时需要创建索引
- 索引中与其他关联的字段,例如left inner jion 或者on之类
- 查询中排序的字段,order by 排序字段建立索引访问大大提高排序效率
- 查询中统计分析,分组的字段。大大的提高group by之类的效率
不需要创建索引的情况
- 表记录很少
- 经常增删改的表
- where条件里用不到的字段(与查询不相干)
- 数据重复且分部平均的字段,因为数据一样,排来排去都堆在一块。
innoDB 和myIsam的区别
- 这两种是mysql的最常用的存储引擎,在mysql中的第三层, show engines 展示当前引擎
- innoDB支持事务,支持四个事务隔离级别,具有回滚的功能,多版本并发时事务是安全的。insert与update时应首选。行锁级别(并发性能强,检索要差点),但不是绝对的行锁,例如在like查询时使用表锁。innoDB可以设置读写阻塞级别(参考四大事务隔离级别)。innoDB顺序存储索引,索引能缓存数据。
- myIsam不支持事务,支持高速存储和检索,以及全文搜索,innoDB也支持全文搜索。select比较多时首选。表锁级别(并发查,检索强)。读写是互相阻塞的,读读不影响,性能相对较差。myIsam索引和文件是分开的,是指针不是按照顺序排列的。索引只能缓存索引。存储方面,保存成文件形式,myisam存储跨平台转移时会省一些麻烦。
Sql注入
注入举例:
select admin from user where username='admin' or 'a'='a' and passwd=''or 'a'='a'
这里的 userName的入参为 ‘admin’ or ‘a’=‘a’ ,而passwd的入参为 ''or ‘a’=‘a’。从逻辑上来说,or逻辑已经绕开了账号密码的验证,打乱了正常判断逻辑。(这种情况就叫做sql注入)
防止 SQL 注入,使用预编译语句是预防 SQL 注入的最佳方式,如:
select admin from user where username=?And password=?
使用预编译的 SQL 语句语义不会发生改变,在 SQL 语句中,变量用问号?表示。像上面例子中username变量传递的’admin’ or ‘a’=‘a’ 参数,也只会当作 username 字符串来解释查询,从根本上杜绝了 SQL 注入攻击的发生。
注意:使用 mybaits 时 mapper 中#方式能够很大程度防止 sql 注入,$方式无法防止 sql 注入.
SQL Select 语句完整的执行顺序:
from—>where—>group by—>having—>计算所有的表达式—>order by—>select 输出
web
如何防范csrf攻击?
- 中文名即跨站请求伪造,也称之为xsrf。是一种对网站的恶意利用。听起来像跨站脚本,但是不是。xss是利用网站信任用户。而csrf伪造受信任用户的请求来利用受信用的网站。攻击的要求更苛刻,但是攻击难以防范,危险性比xss更严重
- 攻击原理:登录受信任的网站,点击一些危险的网站时导致cookie之类泄露,危险网站带着cookie向受信任的网站发送请求(源自web的隐私认证机制,可以保证该请求来自该用户的机器,不能保证是用户批准的请求)
- 防范:服务端:1.通过验证码(每次都需要用户填写,坏处体验感不足) 2.