0
点赞
收藏
分享

微信扫一扫

常用的Java线程阻塞业务方法

曾宝月 2小时前 阅读 0

面试题

知道什么是覆盖索引吗?

覆盖索引是指,查询使用的索引,需要返回的列,在该索引的叶子节点中已经能够全部找到。
简单的来说,覆盖索引就是查询索引后,已经得到了所需字段的信息,不需要回表查询。
引生出的两个小问题:

  1. 用id查询,就能直接走聚簇索引,只需要一次索引扫描,就能得到需要的数据,性能高
  2. 如果返回的列中没包含所有需要的列,就有可能会触发回表查询,所以尽量避免使用select *

MySQL超大分页怎么处理?

问题:
数据量比较大时,limit分页查询,需要对数据进行排序,效率低。
比如说limit 9000000, 10, 此时MySql需要排序前9000010记录,但只返回最后10条记录,其他记录丢弃,排序的代价很大。

优化思路:

select * from tb_sku limit 9000000, 10;
select * from tb_sku t, 
	(select id from tb_sku order by id limit 9000000, 10) a
where t.id = a.id;

索引创建的原则

一般来讲,就是表中的数据超过10万以上,才会创建索引。
1.数据量较大,且查询比较频繁的
2.常作为where,order by,limit的字段
3.尽量使用联合索引
4.如果一个字段的内容较长,也可以用前缀索引
5.要控制索引的数量,因为添加索引会导致增删改的速度变慢

什么情况下索引会失效?

1.用到复合索引(联合索引)时,违反最左前缀法则
2.范围查询右边的列,不能使用索引
3.在索引列上进行运算操作,索引将失效
4.字符串不加单引号,会类型转换,造成索引失效
5.以%开头的like模糊查询,会造成索引失效

谈一谈你对sql优化的经验

1.表的设计优化(参考阿里的开发手册)
2.索引优化,创建索引原则
3.sql语句优化,避免使用select *,避免索引失效…
4.主动复制,读写分离。目的是不让数据的写入影响读操作
5.分库分表

事务的特性是什么?可以详细说一下吗?

ACID
原子性(Atomicity)
一致性(Consistency)
隔离性(Isolation)
持久性(Durability)
举个例子,a向b转账100块,a扣除100元,b增加100元。
原子性体现在这两个操作要么都成功,要么都失败。
一致性体现在,a扣了100块钱,b必须增加100块钱。
隔离性体现在,a向b转账不受其他事务的影响。
持久性体现在事务提交后,要把数据持久化。

并发事务的问题?解决方法?MySQL的默认隔离级别?

并发事务的问题:
脏读:一个事务读到另一个事务还没有提交的数据
不可重复读:一个事务先后读取同一条记录,但两次读取的数据不同
幻读:一个事务按条件查询数据时,没有对应的数据行,但在插入数据时,又发现这行数据已经存在了,好像出现了“幻影”

解决方法:
MySQL支持四种隔离级别
第一个是读未提交(read uncommitted),他解决不了刚才提出的所有问题,项目里一般也不用这个。
第二个是读已提交(read committed),他能解决脏读,但不能解决不可重复读和幻读。
第三个是可重复读(repeatable read),他能解决脏读和不可重复读,但是解决不了幻读。
第四个是串行化(serializable),它可以解决刚才提出来的所有问题,但是事务是串行执行的,性能比较低。

MySQL的默认隔离级别:
可重复读(repeatable read)

redo log和undo log的区别?

redo log日志记录的是数据页的物理变化,若服务宕机可用来同步数据。
undo log日志记录的是逻辑日志,当事务回滚时,通过逆操作就可以恢复原来的数据。
redo log保证了事务的持久性,undo log保证了事务的原子性和一致性。

举报

相关推荐

0 条评论