数据库基础知识
事物四大特性
原子性 要么执行成功,要么不执行
隔离性 所有操作全部执行完以前,其他会话不能看到过程
一致性 事务前后,数据总额一致
持久性 一旦事务提交,对数据的改变就是永久的
数据库隔离级别
读未提交
不可重复读
事务A多次读取同一数据,事务B在事务A多次读取的过程中,对数据做了更新并提交,导致事务A多次读取同一数据时,结果先后读取的数据结果会不一致
可重复读
串行化
多个事务并发问题
脏读:事务B读取事务A还没有提交的数据
幻读 在事务处理过程中执行两个相同的查询,并且第二个查询返回的行集合与第一个查询不同
索引的优缺点,什么时候使用索引,什么时候不能使用索引?
索引最大的好处是提高查询速度
缺点是更新数据时效率低,因为要同时更新索引
对数据进行频繁查询时建立索引,如果要频繁更改数据不建议使用索引
索引分类
普通索引 最基本的索引,没有任何限制
唯一索引 与普通索引类似,不同的是索引列的值必须唯一,但允许有空值
主键索引 它是一种特殊的唯一索引,不允许有空值
全文索引 针对较大的数据,生成全文索引很好是耗空姐
组合索引 为了更多的提高mysql效率可建立组合索引,遵循 "最左前缀"原则
失效条件
条件是or,如果还想让or条件生效,给or 每个字段价格索引
like查询 对索引列进行计算
内部函数
is null 不会用,is not null 会用
最左匹配原则
举例:两个字段(name,age)建立联合索引,如果where age = 12 这样的话,是没有利用索引的
这里我们可以理解为先是对那么字段的值排序,然后对age的数据排序,如果直接查age的话,这时就没有利用索引了
查询条件为where name = 'xxx' and age = '12' 这样就用到了索引,思考下where age = '12' and name="xxx",正常的原则是不会利用到的,,但是优化器会进行优化,把位置调换下,所以这个也用到了
有哪些锁,select时怎么加排它锁
乐观锁 自己实现,通过版本号
悲观锁 共享所,多个事务,只能读不能写,加lock in share model
排它锁 一个事务,只能写,for update
行锁 作用于数据行
表锁 作用于表
死锁怎么解决?
找到进程号,kill进程
oracle相关问题
rowid,rownum的定义
1 都是虚列
2 rowid是物理地址,用于定位oracle中具体数据的物理存储位置
3 rownum 则是sql的输出结果排序
truncate和delete区别
1 都可以将数据实体删掉,truncate操作不记录到rollback日志,同时数据不能恢复
2 truncate 是数据定义语言ddl,delete是数据操作语言dml
3 truncate不能对视图操作,delete操作不会腾出表空间的内存
使用存储过程访问数据库比直接使用sql语句访问有什么优点?
存储过程是预编译的,执行时不需要编译,执行速度快
存储过程封装了多条sql,便于维护数据的完整性和一致性
实现代码复用
oracle中存储过程,游标,函数的区别
游标类似指针,可以执行多个不相关的操作 ,如果希望当产生了结果集后,对结果集的数据进行多种不相关的数据操作
函数可以理解是存储过程的一种,函数可以没有参数,但是一定需要一个返回值,存储过程可以没有参数,不需要返回值,两者都可以通过out参数返回值,如果需要返回多个参数,建议使用存储过程,在sql数据操作语句中只能调用函数,而不能调用存储过程