吐血整理!这200道阿里P6必备Java面试题,我简直太爱了( 八 )

InnoDB与MyISAM的区别

  • InnoDB支持事务 , MyISAM不支持 , InnoDB将每条SQL语句都默认添加事务 , 自动提交 , 这样会影响效率 , 所以最好将多条SQL语句放在begin和commit之间 , 组成一个事务 。
  • InnoDB支持外键 , MyISAM不支持 , 如果将一个包含外键的InnoDB表转为MyISAM会失败 。
  • InnoDB是聚集索引 , 数据文件和索引是绑在一起的 , 必须有主键 , 通过主键查询效率会很高 。MyISAM是非聚集索引 , 数据文件和索引是分离的 。
  • InnoDB不保存表的具体行数 , 执行select count(*) from table时需要全表扫描 , 而MyISAM用一个变量保存 , 执行上面这个语句时 , 只要读出该变量即可 , 速度很快 。
  • InnoDB不支持全文索引 , 而MyISAM支持 , 所以MyISAM的查询效率比较高 。
什么是索引?有几种索引?索引越多越好吗?
  • 索引是加快检索表中数据的方法 , 数据库的索引类似书籍的索引 , 在书籍中 , 允许用户不必翻阅整本书就能迅速的找到需要的信息 , 在数据库中 , 索引也允许数据库迅速地找到表中的数据 , 而不必扫描整个数据库 。
  • MySQL中有4种不同的索引主键索引唯一索引普通索引全文索引
  • 索引不是越多越好 , 创建索引也需要消耗资源 , 一是增加了数据库的存储空间 , 二是插入和删除表数据 , 都要花较多的时间维护索引 。
常见索引原则
  • 字段是唯一的 , 建立唯一索引 , 可以更快速通过索引来确定某条记录 。
  • 经常需要排序、分组、联合操作的字段建立索引 。
  • 为常作为查询条件的字段建立索引 。
  • 删除不再使用或很少使用的索引 。
  • 索引列不能参加计算 , 带函数的查询 , 不参与索引 。
  • 最左前缀匹配原则 。
数据库的三范式是什么?
  • 第一范式 , 列不可再分
  • 第二范式 , 行有唯一区分的字段 , 主键约束
  • 第三范式 , 表的非主属性不能依赖与其他表的非主属性外键约束
什么是数据库事务?
  • 事务(TRANSACTION)是作为单个逻辑工作单元执行的一系列操作 ,  这些操作作为一个整体一起向系统提交 , 要么都执行、要么都不执行 。
  • 事务是一个不可分割的工作逻辑单元 , 事务必须具备以下四个属性 , 简称 ACID 属性原子性(Atomicity)事务是一个完整的操作 。事务的各步操作是不可分的(原子的);要么都执行 , 要么都不执 行 。一致性(Consistency)当事务完成时 , 数据必须处于一致状态 。隔离性(Isolation)对数据进行修改的所有并发事务是彼此隔离的 ,  这表明事务必须是独立的 , 它不应以任何方 式依赖于或影响其他事务 。永久性(Durability)事务完成后 , 它对数据库的修改被永久保持 , 事务日志能够保持事务的永久性 。
SQL优化
  • 查询语句中不要使用select *
  • 尽量减少子查询 , 使用关联查询(left join、right join、inner join)替代
  • 减少使用IN或者NOT IN  , 使用exists , not exists或者关联查询语句替代
  • or 的查询尽量用 union 或者 union all 代替(在确认没有重复数据或者不用剔除重复数据时 , union all会更好)
  • 应尽量避免在 where 子句中使用!=或<>操作符 , 否则将引擎放弃使用索引而进行全表扫描 。
  • 应尽量避免在 where 子句中对字段进行 null 值判断 , 否则将导致引擎放弃使用索引而进行全表扫描 , 如: select id from t where num is null 可以在num上设置默认值0 , 确保表中num列没有null值 , 然后这样查询: select id from t where num = 0
drop、delete与truncate的区别