2021-03-23 美团一面

1.MySQL覆盖索引

如果一个索引包含(或覆盖)所有需要查询的字段的值,称为覆盖索引,即只需扫描索引而无须回表。

回表查询:先定位主键值,再定位行记录,它的性能较扫一遍索引树更低。

覆盖索引必须要存储索引列的值,而哈希索引、空间索引和全文索引不存储索引列的值,所以mysql只能用B-tree索引做覆盖索引

当发起一个索引覆盖查询时,在explain的extra列可以看到using index的信息

覆盖索引的坑:mysql查询优化器会在执行查询前判断是否有一个索引能进行覆盖,假设索引覆盖了where条件中的字段,但不是整个查询涉及的字段,mysql5.5和之前的版本也会回表获取数据行,尽管并不需要这一行且最终会被过滤掉。

mysql不能在索引中执行like操作。mysql能在索引中做最左前缀匹配的like比较,但是如果是通配符开头的like查询,存储引擎就无法做比较匹配

1.主索引是在我们创建表激活后由系统自动创建的,这个我们不能修改;二级索引可以我们自己创建。
2.主索引是表的主键,二级索引可以根据你自己需要用到表的任何字段的组合来创建。
3.在使用二级索引时,WHERE条件字段和字段顺序要与二级索引字段和字段顺序粗略一致,这样才能提高检索效率

https://blog.csdn.net/jh993627471/article/details/79421363


2.MySQL性能优化,比如查询慢

1.主键尽可能小,避免给Secondary index带来过大的空间负担
2.避免全表扫描,因为会使用表锁
3.尽可能缓存所有的索引和数据,提高响应速度
4.在大批量小插入的时候,尽量自己控制事务而不要使用autocommit自动提交
5.合理设置innodb_flush_log_at_trx_commit参数值,不要过度追求安全性
6.避免主键更新,因为这会带来大量的数据移动

https://blog.csdn.net/smooth00/article/details/79399245


3.MySQL删除了记录,但是存储未降低

原因是使用delete删除的时候,mysql并没有把数据文件删除,而是将数据文件的标识位删除,没有整理文件,因此不会彻底释放空间。被删除的数据将会被保存在一个链接清单中,当有新数据写入的时候,mysql会利用这些已删除的空间再写入。即,删除操作会带来一些数据碎片,正是这些碎片在占用硬盘空间。

官方推荐使用 OPTIMIZE TABLE命令来优化表,该命令会重新利用未使用的空间,并整理数据文件的碎片
语法如下:

OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name]

注:该命令将会整理表数据和相关的索引数据的物理存储空间,用来减少占用的磁盘空间,并提高访问表时候的IO性能。但是,具体对表产生的影响是依赖于表使用的存储引擎的。该命令对视图无效。
该命令目前只对MyISAM、InnoDB,ARCHIVE的表起作用,其余引擎的不起作用。

执行命令:

OPTIMIZE TABLE tableName;

https://blog.csdn.net/xianglingchuan/article/details/88062038


4.redis实现分布式锁,key如何设置

基于缓存(Redis等)实现分布式锁
(1)获取锁的时候,使用setnx加锁,并使用expire命令为锁添加一个超时时间,超过该时间则自动释放锁,锁的value值为一个随机生成的UUID,通过此在释放锁的时候进行判断。
(2)获取锁的时候还设置一个获取的超时时间,若超过这个时间则放弃获取锁。
(3)释放锁的时候,通过UUID判断是不是该锁,若是该锁,则执行delete进行锁释放。

由于Lua脚本的原子性,在Redis执行该脚本的过程中,其他客户端的命令都需要等待该Lua脚本执行完才能执行,所以建议使用Lua执行加锁、解锁操作。

基于Zookeeper实现分布式锁
(1)创建一个目录mylock;
(2)线程A想获取锁就在mylock目录下创建临时顺序节点;
(3)获取mylock目录下所有的子节点,然后获取比自己小的兄弟节点,如果不存在,则说明当前线程顺序号最小,获得锁;
(4)线程B获取所有节点,判断自己不是最小节点,设置监听比自己次小的节点;
(5)线程A处理完,删除自己的节点,线程B监听到变更事件,判断自己是不是最小的节点,如果是则获得锁。

https://www.jb51.net/article/184718.htm


5.冯诺依曼体系

美籍匈牙利数学家冯·诺伊曼于1946年提出存储程序原理,把程序本身当作数据来对待,程序和该程序处理的数据用同样的方式储存。 冯·诺依曼体系结构冯·诺伊曼理论的要点是:计算机的数制采用二进制;计算机应该按照程序顺序执行。人们把冯·诺伊曼的这个理论称为冯·诺伊曼体系结构。

冯·诺依曼体系结构


6.策略模式

单例模式
意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
主要解决:一个全局使用的类频繁地创建与销毁。

工厂模式
意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
主要解决:主要解决接口选择的问题。

策略模式
意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。
主要解决:在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护。

https://www.runoob.com/design-pattern/strategy-pattern.html


7.工厂模式及适用场景

工厂模式
意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
主要解决:主要解决接口选择的问题。
何时使用:我们明确地计划不同条件下创建不同实例时。

抽象工厂模式
在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。

意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
主要解决:主要解决接口选择的问题。
何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。

https://www.runoob.com/design-pattern/factory-pattern.html


8.消息队列及其作用

“消息队列”是在消息的传输过程中保存消息的容器。

消息队列管理器在将消息从它的源中继到它的目标时充当中间人。队列的主要目的是提供路由并保证消息的传递;如果发送消息时接收者不可用,消息队列会保留消息,直到可以成功地传递它。

主要作用:解耦+异步+削峰

解耦
看这么个场景。A 系统发送数据到 BCD 三个系统,通过接口调用发送。如果 E 系统也要这个数据呢?那如果 C 系统现在不需要了呢?A 系统负责人几乎崩溃…
通过一个 MQ,Pub/Sub 发布订阅消息这么一个模型,A 系统就跟其它系统彻底解耦了。

异步
在这里插入图片描述
削峰
在这里插入图片描述
https://blog.csdn.net/tianjiwo3000/article/details/102500405


猜你喜欢

转载自blog.csdn.net/weixin_43202635/article/details/115136804