数据库总结

mysql 使用的引擎

A:1)MyIsam 不支持事务,适用于选择密集型,插入密集型,mysql 默认的引擎
2)innodb 使用于更新密集型,支持事务,自动灾难恢复,行级锁,外键约束
3)memory 出发点是速度采用的逻辑存储介质是内存
4)merge 一组myisam 表的组合

mysql 索引使用的是B+的数据结构

索引:用于提高数据访问速度的数据库对象。
优点:1)索引可以避免全表扫描;
2)对于非聚集索引,有些查询甚至可以不访问数据项;
3)聚集索引可以避免数据插入操作集中于表的最后一个数据页;
4)一些情况下,索引还可以避免排序。
虽然索引可以提高查询速度,但是他们也会导致数据库更新数据的性能下降,因为大部
分数据更新时需要同时更新索引。

连接关联

A 的id 和b 的parent_id 关联
1)内连接
Select a.,b.from a inner join b on a.id=b. parent_id;
结果为:1 张三1 23 1
2 李四2 34 2
2)左外链接(左表all 元素都有)
Select a.,b.from a left join b on a.id=b. parent_id;
结果为:1 张三1 23 1
2 李四2 34 2
3 王五null
3)右外链接(右表all 元素都有)
Select a.,b.from a right join b on a.id=b. parent_id;
结果为:1 张三1 23 1
2 李四2 34 2
Null 3 34 2
4)完全链接(返回左边和右表中所有行,若某行在另外一个表中无匹配,则另一表的
选择列表列包含空值)
Select a.,b.from a full join b on a.id=b. parent_id;
结果为:1 张三1 23 1
2 李四2 34 2
Null 3 34 2
3 王五null
Not in 的例子:
Select emp_no from emplyees where emp_no not in (select emp_no from dept_manager)

共享锁VS 排他锁

1)共享锁,
又称读锁,若事务T 对数据对象A 加了S 锁,则是事务T 可以读A 但不能修改A,其它事务只能再对他加S 锁,而不能加X 锁,直到T 释放A 上的S 锁。这保证了其他事务可以读A,但在事务T 释放S 锁之前,不能对A 做任何操作
2)排他锁,
又称写锁,若事务T 对数据对象加X 锁,事务T 可以读A 也可以修改A,其他事务
不能对A 加任何锁,直到T 释放A 上的锁。这保证了,其他事务在T 释放A 上的锁之前不
能再读取和修改A。

事务隔离级别

Serializable(串行化):一个事务在执行过程中完全看不到其他事务对数据库所做的更新。
Repeatable Read(可重复读):一个事务在执行过程中可以看到其他事务已经提交的新插入的记录,但是不能看到其他事务对已有记录的更新。
Read Commited(读已提交数据):一个事务在执行过程中可以看到其他事务已经提交的新插入的记录,而且能看到其他事务已经提交的对已有记录的更新
Read Uncomitted(读未提交数据):一个事务在执行过程中可以拷打其他事务没有提交的新插入的记录,而且能看到其他事务没有提交的对已有记录的更新。

什么是事务

回答思路:事务是干什么的>事务的ACID特性>事务的隔离级别
事务是访问数据库的一个操作序列,数据库应用系统通过事务集来完成对数据库的存取。事务的正确执行使得数据库从一种状态转换成另一种状态
原子性、隔离性、持久性
脏读:一个事务读到另一个事务为提交的更新数据。
虚读:一个事务读到另一个事务已提交的新插入的数据。
不可重复读:一个事务读到另一个事务已提交的更新数据

数据库设计三范式是什么

第一范式:字段还可以再分吗?如过不能,则是符合1NF的设计。
第二范式:2NF是对记录的惟一性约束,要求记录有惟一标识,即实体的惟一性;
也就是说主键列与非主键列遵循完全函数依赖关系
第三范式:3NF是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余。
也就是说非主键列之间没有传递函数依赖关系
打个比方,比如评论表,如果你将用户ID,用户头像都放在这留言表中,就是不合适的了。用户头像是依赖于用户ID,而不依赖该评论。

悲观锁和乐观锁的比较

面试思路:什么是锁,用来干什么>悲观锁乐观锁各自特点>优缺点比较和各自应用场景
数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性。
悲观锁:
简单来说悲观锁认什么操作都可以改变数据,所以在改数据就锁住(在sql语句中加上for update就可以了)
乐观锁:
简单来说乐观锁很乐观 所以修改数据库后锁住 (一般在数据库中加上一个字段区别历史版本和当前版本)
update t_goods
set status=2,version=version+1
where id=#{id} and version=#{version};
使用版本号时,可以在数据初始化时指定一个版本号,每次对数据的更新操作都对版本号执行+1操作。并判断当前版本号是不是该数据的最新的版本号。

mysql实现分页的优化sql语句

面试思路:数据库分页的简单实现>数据量变大时的优化方案
sql语句是LIMIT m,n其中m是当前页,n是从当前页数n个记录,如果参数为一个就是数n个记录
一般我们都会这样写:当数据达到百万级的时候会慢死
SELECT FROM table ORDER BY id LIMIT 1000000, 10;
优化一:
SELECT FROM table WHERE id >= (SELECT id FROM table LIMIT 1000000, 1) LIMIT 10;
速度可以提升到0.x秒了
优化二:
SELECT FROM table WHERE id BETWEEN 1000000 AND 1000010;
比上面提升5到10倍
另外,如果需要查询 id 不是连续的一段,最佳的方法就是先找出 id ,然后用 in 查询
SELECT FROM table WHERE id IN(10000, 100000, 1000000…);

sql优化

1)对查询进行优化,要尽量避免全表扫描。在where 或order by 的列上加索
引。
2)尽量避免在where 子语句中有where num is null,这样不用索引,要全表扫描,可
用0 代替null。
3)避免在where 中用<>or!=,因为要全表扫描。
4)尽量避免在where 中用or,因为若一个字段有索引,一个没有,则要全表扫描。
5)like”%abc%”,全表扫描。
6)避免在where 子语句中对字段进行函数操作,因为要全表扫描。
7)使用复合索引时,必须用到该索引的第一个字段,否则索引不被使用。

热评文章