消息队列和mysql索引 | 青训营笔记

105 阅读5分钟

“这是我参与「第五届青训营 」伴学笔记创作活动的第 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 先存起来,一块回表)

      • 能一块成堆回表的不要一个个回表
    • 索引跳跃式扫描机制(自己添加上最左边的前缀,强制使用联合索引)

      • 虽然你没用第一个字段,但我给你加上去,今天这个联合索引你就得用,不用也得给我用