内连接是把匹配的关联数据显示出来。
左连接:left join;左连接是左边的表全部显示出来,右边的表显示出符合条件的数据。
右连接:right join。右连接是右边的表全部显示出来,左边的表显示出符合条件的数据。
162. mysql 索引是怎么实现的?索引是满足某种特定查找算法的数据结构,而这些数据结构会以某种方式指向数据,从而实现高效查找数据。
具体来说MySQL中的索引,不同的数据引擎实现有所不同,但目前主流的数据库引擎的索引都是B+树实现的,B+树的搜索效率,可以达到二分法的性能,找到数据区域之后就找到了完整的数据结构了,所以索引的性能也是更好的。
163. 怎么验证 mysql 的索引是否满足需求?使用 explain 查看SQL 是如何执行查询语句的,从而分析你的索引是否满足需求。
explain 语法:explain select * from table where type=1。
164. 说一下数据库的事务隔离?MySQL 的事物隔离是在 MySQL.ini 配置文件里添加的,在文件的最后添加:transaction-isolation = REPEATABLE-READ
可用的配置值:READ-UNCOMMITTED、READ-COMMITTED、REPEATABLE-READ、SERIALIZABLE。
READ-UNCOMMITTED:读未提交,最低隔离级别,事务未提交前,就可被其他事务读取(会出现幻读,脏读,不可重复读)。READ-COMMITTED:读已提交,一个事务提交后才能被其他事务读取到(会造成幻读,不可重复读)REPEATABLE-READ:可重复读,默认级别,保证多次读取同一个数据时,其值都和事务开始时候的内容是一致的,禁止读取到别的事务未提交的数据(会造成幻读)。SERIALIZABLE:序列化,代价最高最可靠的隔离级别,该隔离级别能防止脏读,不可重复读,幻读。
脏读:表示一个事务能够读取另一个事务中还未提交的数据。比如,某个事务尝试插入记录A
,此时该事务还未提交,然后另一个事务尝试读取到了记录A。
不可重复读:是指在一个事务内,多次读同一数据。
幻读:指同一个事务内多次查询返回的结果集不一样。比如同一个事务A第一次查询时候有n条记录,但是第二次同等条件下查询却有n+1条记录,这就好像产生了幻觉。发生幻读的原因也是另外一个事务新增或者删除或者修改了第一个事务结果集里面的数据,同一个记录的数据内容被修改了,所有数据行的记录就变多或者变少了。
165. 说一下 mysql 常用的引擎?InnoDB 引擎:InnoDB引擎提供了对数据库 acid 事务的支持,并且还提供了行级锁和外键的约束,它的设计的目标就是处理大数据容量的数据库系统。MySQL运行的时候,InnoDB会在内存中简历缓冲池,用于缓冲数据和索引。但是该引擎是不支持全文搜索,同时启动也比较的慢,它是不会保存表的行数的,所以当进行 select count(*) from table 指令的时候,需要进行扫描全表。由于锁的粒度小,写操作是不会锁定全表的,所以在并发度较高的场景下使用会提升效率的。
MyIASM 引擎:MySQL 的默认引擎,但不会提供事务的支持,也不支持行级锁 和外键。因此当执行插入和更新语句时,即执行写操作的时候需要锁定这个表,所以会导致效率会降低,不过和InnoDB不同的是,MyIASM引擎是保存了表的行数,于是当进行 select count(*) from table语句时,可以直接的读取已经保存的值而不需要进行扫描全表。所以,如果表的读操作远远多于写操作时,并且不需要事务的支持的,可以将MyIASM作为数据库引擎的首选。
166. 说一下 mysql 的行锁和表锁?MyISAM只支持表锁,InnoDB 支持表锁和行锁,默认为行锁。
表级锁:开销小,加锁块,不会出现死锁。锁的力度大发生锁冲突的概率最高,并发量最低。行级锁:开销大,加锁慢,会出现死锁。锁力度小,发生锁冲突的概率小,并发度最高。 167. 说一下乐观锁和悲观锁?
乐观锁:每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在提交更新的时候会判断一下在此期间别人有没有去更新这个数据。悲观锁:每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻止,直到这个锁被释放。
数据库的乐观锁需要自己实现,在表里面谈加一个version字段,每次修改成功值加一,这样每次修改的时候先对比一下,自己拥有的version和数据库现在的version是否一致,如果不一致就不修改,这样就实现了乐观锁。
168. mysql 问题排查都有哪些手段?使用show processlist 命令查看当前所有连接信息。使用explain 命令查询SQL 语句执行计划。开启慢查询日志,查看慢查询的SQL。 169. 如何做 mysql 的性能优化?
为搜索字段创建索引。避免使用 select* ,列出需要查询的字段。垂直分割分表。选择正确的存储引擎。 Redis 170. redis 是什么?都有哪些使用场景?
Redis 是一个开源的使用ANSI C语言表写,支持网络,可基于内存也可持久化的日志型,Key-Value数据库,并提供多种语言的API。
Redis 使用场景:
数据高并发的读写海量数据的读写对扩展性要求高的数据 171. redis 有哪些功能?
数据缓存功能分布式锁的功能支持数据持久化支持事务支持消息队列 172. redis 和 memecache 有什么区别?
memcached所有的值均是简单的字符串,redis作为其替代者,支持更丰富的数据类型redis 的速度比memcached快很多redis可以持久化其数据 173. redis 为什么是单线程的?
因为cpu不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存或者网络带宽。既然单线程容易实现,而且cpu又不会成为瓶颈,那就顺理成章的采用单线程的方案了。
关于Redis的性能,官方网站也有,普通笔记本轻松处理每秒几十万的请求。
而且单线程并不代表就慢,nginx和nodejs也哦度是高性能单线程的代表。
174. 什么是缓存穿透?怎么解决?缓存穿透:指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透。
解决方案:最简单粗暴的方法,如果一个查询返回的数据为空(不管是数据不存在,还是系统故障),我们就把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。
175. redis 支持的数据类型有哪些? String,List,Hash,Set,ZSet 176. redis 支持的 java 客户端都有哪些?Redisson,Jedis,Lettuce等等,官方推荐使用Redisson。
177. jedis 和 redisson 有哪些区别?Jedis是Redis的Java实现的客户端,其API提供了比较全面的Redis命令的支持。
Redisson实现了分布式和可扩展的Java数据结构,和Jedis相比,功能较为简单,不支持字符串操作,不支持排序,事务,管道,分区等Redis特性。Redisson的宗旨是促进使用者对Redis的关注分离,从而让使用者能够将精力更集中的放在处理业务逻辑上。
178. 怎么保证缓存和数据库数据的一致性?合理设置缓存的过期时间。新增,更改,删除数据库操作时同步更新Redis,可以使用事务机制来保证数据的一致性。 179. redis 持久化有几种方式?
Redis的持久化有两种方式,或者说有两种策略:
RDB(Redis Database):指定的时间间隔能对你的数据进行快照存储。
AOF(Append only File):每一个收到的写命令都通过write函数追加到文件中。
180. redis 怎么实现分布式锁?Redis 分布式锁其实就是在系统里面占一个“坑”,其他程序也要占“坑”的时候,占用成功了就可以继续执行,失败了就只能放弃或稍后重试。
占坑一般使用 setnx(set if not exists)指令,只允许被一个程序占有,使用完调用 del 释放锁。



