“这是我参与「第五届青训营 」伴学笔记创作活动的第 12 天
消息队列总结
-
消息队列:指保存消息的一个容器,本质是个队列。但这个队列呢,需要支持高吞吐,高并发,并且高可用。
-
常见消息队列对比
-
Kafka相关
- isr用于备份,当leader宕机了,从ISR中选择
- 手动根据业务分配consumer不利于容灾和扩容
- 对于kafka的重启升级往往是不能并发执行的,因为并发执行可能会导致某个topic不可用
-
1)如何使用Kafka
创建集群->新增Topic->编写生产者逻辑->编写消费者逻辑
索引的使用相关
-
使用索引的好处
-
①整个数据库中,数据表的查询速度直线提升,数据量越大时效果越明显。
②通过创建唯一索引,可以确保数据表中的数据唯一性,无需额外建立唯一约束。
③在使用分组和排序时,同样可以显著减少
SQL查询的分组和排序的时间。④连表查询时,基于主外键字段上建立索引,可以带来十分明显的性能提升。
⑤索引默认是
B+Tree有序结构,基于索引字段做范围查询时,效率会明显提高。⑥从
MySQL整体架构而言,减少了查询SQL的执行时间,提高了数据库整体吞吐量。
-
-
索引的弊端
- ①建立索引会生成本地磁盘文件,需要额外的空间存储索引数据,磁盘占用率会变高。
- ②写入数据时,需要额外维护索引结构,增、删、改数据时,都需要额外操作索引。
- ③写入数据时维护索引需要额外的时间开销,执行写
SQL时效率会降低,性能会下降。
-
使用索引的注意事项
- 索引最好使用有序的数据,而不能使用类似UUID的无序数,会导致插入引起大量结点移动
- 前缀索引节省空间,但是由于没有存放完整的数据,
MySQL也无法通过前缀索引来完成ORDER BY、GROUP BY等分组排序工作,同时也无法完成覆盖扫描等操作 - 唯一索引在查找中不用找重复的数据故查找过程比普通索引更快,但是在插入时由于要判断是否已经存在,故插入反而更慢
-
全文索引的缺点
-
①由于全文索引是基于分词实现的,所以对一个字段建立全文索引后,
MySQL会对该字段做分词处理,这些分词结果也会被存储在全文索引中,因此全文索引的文件会额外的大!②由于全文索引对每个字段值都会做分词,因此当修改字段值后,分词是需要时间的,所以修改字段数据后不会立马自动更新全文索引,此时需要咱们写存储过程,并调用它手动更新全文索引中的数据。
③除开上述两点外,全文索引最大的硬伤在于对中文支持不够友好,类似于英文可以直接通过符号、空格来分词,但中文呢?一个词语来形容就是博大精深,无法精准的对一段文字做分词,因此全文索引在检索中文时,存在些许精准度问题
-
-
建立索引的原则
-
①经常频繁用作查询条件的字段应酌情考虑为其创建索引。
②表的主外键或连表字段,必须建立索引,因为能很大程度提升连表查询的性能。
③建立索引的字段,一般值的区分性要足够高,这样才能提高索引的检索效率。
④建立索引的字段,值不应该过长,如果较长的字段要建立索引,可以选择前缀索引。
⑤建立联合索引,应当遵循最左前缀原则,将多个字段之间按优先级顺序组合。
⑥经常根据范围取值、排序、分组的字段应建立索引,因为索引有序,能加快排序时间。
⑦对于唯一索引,如果确认不会利用该字段排序,那可以将结构改为
Hash结构。⑧尽量使用联合索引代替单值索引,联合索引比多个单值索引查询效率要高
-
-
不适合创建索引的原则
-
❶值经常会增删改的字段,不合适建立索引,因为每次改变后需维护索引结构。
❷一个字段存在大量的重复值时,不适合建立索引,比如之前举例的性别字段。
❸索引不能参与计算,因此经常带函数查询的字段,并不适合建立索引。
❹一张表中的索引数量并不是越多越好,一般控制在
3,最多不能超过5。❺建立联合索引时,一定要考虑优先级,查询频率最高的字段应当放首位。
❻当表的数据较少,不应当建立索引,因为数据量不大时,维护索引反而开销更大。
❼索引的字段值无序时,不推荐建立索引,因为会造成页分裂,尤其是主键索引。
-
-
常见索引失效的原因
- 查询条件中有or
- 模糊查询的第一个字符不确定
- 隐式数字转换
- 查询条件参与运算(基本运算和函数运算)
- 不符合最左前缀
- 查询条件不是定值,而是表中的列
- SQL
执行的是反向范围操作,例如NOT IN、NOT LIKE、IS NOT NULL、!=、<>...
-
索引进阶
-
索引覆盖
- 要查询的列,在使用的索引中已经包含,被所使用的索引覆盖,这种情况称之为索引覆盖。
-
索引下推
- 能在覆盖索引里进行的比较就不要拖到回表再比较
-
Multi-Range Read机制(把满足查询条件的id 先存起来,一块回表)- 能一块成堆回表的不要一个个回表
-
索引跳跃式扫描机制(自己添加上最左边的前缀,强制使用联合索引)
- 虽然你没用第一个字段,但我给你加上去,今天这个联合索引你就得用,不用也得给我用
-