本文已参与「新人创作礼」活动,一起开启掘金创作之路。
- 个人简介:微信公众号关注:SteveCode。为您分享更多的知识学术。生于忧患死于安乐
- 专注Java技术干货分享,Java基础技术、数据结构、相关工具、Spring全家桶、intellij idea......
文章面试题整理出自:Java 最常见的 200+ 面试题:面试必备_Java中文社群的博客-CSDN博客_java面试题
165.一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 mysql 数据库,又插入了一条数据,此时 id 是几?
创建表的类型 innoDb 重启之后会是6(将最大的id放在内存中,重启之后会消失)。没有重启回事8
char:效率高、占空间、若char(10) 存“abc" 那还多出7个字节(占空间)
join 内连接 、left join (左连接) right join (右链接)
B+ Tree实现,索引就像字典的目录一样,为了提高查询速度。
explain select * from table where type=1。
前者:事务支持,提供了行级锁与外键的约束,select count(*)from table是扫描全表,他不会保存表的行数。写操作不会锁表,大大的提升了效率。
后者:在执行新增与插入时,会锁表,降低了效率。不支持事务,没有行级锁、外键约束,select count(*)from table查询的是你新增的那几条数据放在一起、不必要全表扫描。
行锁:开销大、加锁慢、会出现死锁。锁力度小,发生锁冲突的概率小,并发度最高。
表锁:开销小、加锁快、不会出现锁。锁定粒度大,发生锁冲突的概率最高,并发量最低。
乐观锁:假设最好的情况,去拿数据的时候认为没有人修改,所以不会上锁。但提交更新的期间判断是否有别人修改这条数据。
悲观锁:假设最坏的情况,去哪数据的时候认为别人会修改,所以每次拿数据的时候都会上锁。这样别人想拿这条数据阻止他,直到锁被释放。
假设数据库中帐户信息表中有一个 version 字段,当前值为 1 ;而当前帐户余额字段( balance )为 $100 。当需要对账户信息表进行更新的时候,需要首先读取version字段。
4. 操作员 A 此时将其读出( version=1 ),并从其帐户余额中扣除 100-$50 )。
5. 在操作员 A 操作的过程中,操作员B 也读入此用户信息( version=1 ),并从其帐户余额中扣除 100-$20 )。
6. 操作员 A 完成了修改工作,提交更新之前会先看数据库的版本和自己读取到的版本是否一致,一致的话,就会将数据版本号加1( version=2 ),连同帐户扣除后余额( balance=$50 ),提交至数据库更新,此时由于提交数据版本大于数据库记录当前版本,数据被更新,数据库记录 version 更新为 2 。
7. 操作员 B 完成了操作,提交更新之前会先看数据库的版本和自己读取到的版本是否一致,但此时比对数据库记录版本时发现,操作员 B 提交的数据版本号为 2 ,而自己读取到的版本号为1 ,不满足 “ 当前最后更新的version与操作员第一次读取的版本号相等 “ 的乐观锁策略,因此,操作员 B 的提交被驳回。
l 使用 show processlist 命令查看当前所有连接信息。
178.如何做 mysql 的性能优化?www.cnblogs.com/pengyunjing…
// 在state中查找company "SELECT company_name FROM users LEFT JOIN companies ON (users.state = companies.state) WHERE users.id = $user_id" // 两个 state 字段应该是被建过索引的,而且应该是相同的类型,相同的字符集。