java面试

mysql

  1. 事务是计算机应用中不可或缺的组件模型,它保证了用户操作的原子性 ( Atomicity )、一致性
    ( Consistency )、隔离性 ( Isolation ) 和持久性 ( Durabilily )。
  2. 索引是帮助MySQL高效获取数据的数据结构。更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。

事物四大特性

  1. 原子性:要么全部做完,要么全部不做。事务的最小单位
  2. 一致性:事务开始前和结束后,数据库的完整性没有遭到破坏。(AB转账问题)
  3. 隔离性:同一时间,只允许同一事务访问同一数据,不同事务之间不能有任何干扰。(A取钱时B不能向他转账)
  4. 持久性:事务完成之后,事务对数据库所有更新被永久保存在数据库中,不能回滚。

事务的并发问题与解决

  1. 脏读:事务A读取到事务B未提交的数据(内存中的数据,或者事务B进行回滚操作)
  2. 不可重复读:同一事务内两次读取的数据库值不一样(读取到事务B修改后的操作:你转账的时候看到你有100,但是你正转的时候你妈刷走了50,导致转账不能成功。)
    3 .幻读:不可重复读侧重于事务A读到事务B修改,而幻读侧重于事务A读取到事务B对数据的新增和删除。(层级不一样)
这是一个包含关系:出现脏读一定会出现不可重复读与幻读,解决方式为mysql的四大事务隔离级别:
  1. 读未提交:会出现脏读
  2. 不可重复读:会出现不可重复读现象
  3. 可重复读:会出现幻读现象
  4. 串行化:等级最高,锁住整个表。不会出现任何事务并发问题(性能降低)

mysql优化

  1. 查询数据库数据尽量使用索引来查询,尽量避免全表扫描。尽量只查询索引条件的数据(例如只查询id只比查询name会高很多,因为id存储在叶子节点,建立了索引了,索引值已经放在里面了)
  2. 尽量避免使用on来链接条件去查询,会进行全表扫描,可用union之类代替。
  3. 在连续数字查询时,能使用between(范围查询)时不要使用in,或者not in(走全表)
  4. sql查询查询的where条件中不要进行表达式操作
  5. 在where条件中不要进行函数操作,也可能会让引擎放弃索引操作
  6. 多张数据表查询数据,使用inner jion 、left jion、 right jion代替子查询

mysql索引数据结构(B+树)

  1. 索引以文件的形式存放在磁盘中,应减少磁盘IO操作
  2. 顺序查找:效率相当低,二叉树查找:数据效率有所提升,而且极端情况下二叉树有可能是一个线性结构,就是个顺序查找了(需要注意平衡二叉树操作)。 哈希索引查找:会提升索引效率,但是只能精确匹配才有效率,如果模糊或者范围查询即不能做到。红黑树:一种平衡的二叉树,数据量大的话,就可能树的高度非常高。逻辑上很近的父节点,可能物理上距离很远。无法利用局部性,IO查询还是比较低的。B树:每个节点是一个二元数组,每个节点都可以存储数据,key就是索引,data就是具体的值。从根节点二分查找,找到返回节点,否则在相应的区间(key的指针位置)递归查找,找不到返回null。缺点是在插入删除时会破坏数据的位置,需要对数据分列,转移,合并等操作。B+树:mysql索引使用的数据结构,B+树非叶子节点不存储数据,非叶子节点只存储索引,在这个基础上增加了顺序访问指针,大规模按顺序读取数据。

mysql索引类型

  1. 普通索引:最基本的索引,没有任何限制。创建表时创建,或者后续更改
  2. 唯一索引:索引列的值必须唯一(可以存着一个空),如果使用组合,组合也必须唯一。约束
  3. 组件索引:一种特殊的唯一索引,特殊在:一个表只能有一个组件索引。不允许有空值,一般使用id
  4. 组合索引:多个属性字段上建立索引。和普通索引创建方式一样(小括号里跟多个字段)必须使用第一个字段,可以不使用后面的字段)
  5. 全文索引:检索全文中的关键字,而不是直接与索引中的值作比较。更像一个搜索引擎。

哪些情况下创建索引

  1. 组件自动创建索引
  2. 频繁查询时需要创建索引
  3. 索引中与其他关联的字段,例如left inner jion 或者on之类
  4. 查询中排序的字段,order by 排序字段建立索引访问大大提高排序效率
  5. 查询中统计分析,分组的字段。大大的提高group by之类的效率

不需要创建索引的情况

  1. 表记录很少
  2. 经常增删改的表
  3. where条件里用不到的字段(与查询不相干)
  4. 数据重复且分部平均的字段,因为数据一样,排来排去都堆在一块。

innoDB 和myIsam的区别

  1. 这两种是mysql的最常用的存储引擎,在mysql中的第三层, show engines 展示当前引擎
  2. innoDB支持事务,支持四个事务隔离级别,具有回滚的功能,多版本并发时事务是安全的。insert与update时应首选。行锁级别(并发性能强,检索要差点),但不是绝对的行锁,例如在like查询时使用表锁。innoDB可以设置读写阻塞级别(参考四大事务隔离级别)。innoDB顺序存储索引,索引能缓存数据。
  3. 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攻击?

  1. 中文名即跨站请求伪造,也称之为xsrf。是一种对网站的恶意利用。听起来像跨站脚本,但是不是。xss是利用网站信任用户。而csrf伪造受信任用户的请求来利用受信用的网站。攻击的要求更苛刻,但是攻击难以防范,危险性比xss更严重
  2. 攻击原理:登录受信任的网站,点击一些危险的网站时导致cookie之类泄露,危险网站带着cookie向受信任的网站发送请求(源自web的隐私认证机制,可以保证该请求来自该用户的机器,不能保证是用户批准的请求)
  3. 防范:服务端:1.通过验证码(每次都需要用户填写,坏处体验感不足) 2.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值