redis
数据库有1000万数据,Redis只能缓存20w数据如何保证Redis中的数据都是热点数据?
使用allkeys-lru(挑选最近最少使用的数据淘汰)淘汰策略,留下来的都是经常访问的热点数据
Redis的内存用完了会发生什么?
主要看数据淘汰策略是什么,如果是默认的配置 (noeviction 不删除任何数据),会直接报错
redis分布式锁
Redis实现分布式锁主要利用Redis的setnx命令。setnx是SETif not exists(如果不存在,则SED)的简写
Redis实现分布式锁如何合理的控制锁的有效时长?
1.根据业务执行时间预估 网络卡顿等,方案不是很靠谱
2.给锁续期 再开一个线程,监控执行,合理续期,但是自己实现太麻烦了,redisson帮我们做到了
Redis集群有哪些方案
在Redis中提供的集群方案总共有三种
主从复制
哨兵模式
分片集群
Mysql
如何定位慢查询?
1.使用工具,如Arthas、Prometheus、Skywalking
2.mysql自带慢日志 在/etc/my.cnf中配置
#开启Mysql慢日志查询
slow_query_log=1
#设置慢日志的时间为2s,如果sql语句查询超过2s,就会记录慢查询日志
long_query_time=2
answer
我们当时有的接口测试非常慢,压测结果大概5s钟,当时系统用了skywalking,可以监测出哪个接口,最终确定是sql问题,同时我们在mysql中开启了慢查询日志,我们设置的值就是2s,超过2s就记录到日志中(调试阶段,在生产一般不会开启,会损耗mysql性能)。
长版回答
那这个sql语句执行很慢,如何分析?
表数据量过大,没有加索引
采用explain获取sql执行情况
answer
可以采用MySQL自带的分析工具EXPLAIN
1.通过key和keylen检查是否命中了索引(索引本身存在是否有失效的情况)
2.通过type字段查看sql是否有进一步的优化空间,是否存在全索引扫描或全盘扫描
3.通过extra建议判断,是否出现了回表的情况,如果出现了,可以尝试添加索引或修改返回字段来修复
长版回答
什么是索引?
answer
索引是帮助mysql高效获取数据的数据结构,提高数据检索效率,降低数据排序的成本,简单来说就是创建了个数据目录。
长版回答
索引的底层数据结构了解过吗?
answer
InnoDB采用B+树
1.矮胖树,磁盘读写代价比较低
2.非叶子节点只存储指针,叶子节点存储数据
3.B+数便于扫库和区间查询,因为叶子节点是一个双向链表
长版回答
b树和b+树的区别
什么是聚簇索引(聚集索引),什么是非聚簇索引(非聚集索引)?
answer
聚簇索引(聚集索引):数据与索引放到一块,B+树的叶子节点保存了整行数据,有且只有一个
非聚簇索引(二级索引):数据与索引分开存储,B+树的叶子节点保存对应的主键,可以有多个,一般我们自己定义的索引都是非聚集索引
什么是回表?
answer
通过非聚集索引找到对应的主键值,到聚集索引中查找整行数据,这个过程就是回表,简单来说就是比如人员信息表中建立了姓名的索引,找到对应的叶子节点后会拿到主键id,再去走一次通过id查询
什么是覆盖索引?
answer
覆盖索引指查询使用到了索引,并且在该索引中需要返回的列已经能够全部找到,不需要回表查询
比如使用id查询,直接走聚集索引查询,一次索引扫描,直接返回数据,性能高
如果返回的列中没有创建索引,有可能会触发回表查询,所以开发过程中尽量避免使用select全部字段
长版回答
mysql超大分页怎么处理?
answer
使用覆盖索引+子查询解决
超大分页一般都是在数据量比较大时,我们使用了limit分页查询,并且需要对数据进行排序,这个时候效率就很低,我们可以采用覆盖索引和子查询来解决
先分页查询数据的id字段,确定了id之后,再用子查询来过滤,只查询这个id列表中的数据就可以了,因为查询id的时间,走的是主键索引,所以效率提升很多
长版回答
索引创建原则有哪些?
索引失效
answer
违反最左前缀法则
范围查询右边的列,不能使用索引
不要在索引列上进行运算操作
字符串不加单引号,造成索引失效
以%开头的like模糊查询,索引失效,如果只是尾部模糊匹配,索引就不会失效