Postgresql vs Mysql

资料

Postgres

MySQL

一些说法

  • Oracle有才无德

  • MySQL才浅德薄

  • PostgreSQL德才兼备

概念

对象关系型数据库

面向对象的特性

关于MySQL

  • MySQL有哪几种存储引擎?各自有什么优缺点?适用场景是?

  • MySQL索引的工作机制

  • MySQL性能优化方式

  • MySQL分库分表

  • SQL执行过程

索引

索引是为了加速数据查询的数据结构,让我们能够以尽可能少的操作次数查到想要的数据。现实中的字典可按拼音/部首查字,拼音表、部首表就是字典中的索引。对于数据库查询而言,什么样的数据结构能够让我们查找数据时尽可能减少磁盘IO次数呢?一种经典的思路就是将数据通过平衡的多路搜索树进行组织,比如B-Tree(Balance Tree)、B+Tree。

B-Tree

B-Tree即平衡树,是所有的叶子节点都在同一层的多路查找树。

B+Tree

B+Tree具有B-Tree的平衡性,但相比B-Tree,其把所有数据存放到叶子节点,并且在相邻叶子节点之间建立指针,提高范围查询的效率。

B+树的查找过程

先读取根节点磁盘块到内存中,通过二分查找确定待查找数据项在哪个子节点磁盘块中,然后将对应子节点磁盘块加载到内存中进行二分查找缩小范围,依此类推,直到在某个叶子节点磁盘块中找到目标,结束查询。

所以需要的磁盘IO次数就是树的高度。

  • 为什么要把数据放到叶子节点?

    非叶子节点可以存放更多索引,数据量相同的情况下,B+树结构会比B树更加“矮胖”,提高查询效率。删除数据时不会引起树结构的复杂变形。

B+树与B树的性能对比
  1. 单数据查询

  2. 插入、删除效率

    B树删除根节点时,可能导致树发生很大的变形

  3. 范围查询

    由于B树的数据可能在非叶子节点中,要实现范围查询只能通过树的遍历,涉及多个磁盘IO操作;而B+树的数据存在叶子节点中,叶子节点间又通过指针构成了有序双向链表,因此范围查询效率更高。

索引的建立原则

对区分度高的字段建立索引,区分度公式:count(distinct FIELD)/count(*)

索引在什么情况下可能失效

索引失效有哪些? | 小林coding

  • 对索引使用左或左右模糊匹配

  • 对索引使用函数

    索引指对数据原始值建立索引,而非对数据经函数处理后的结果建立索引。MySQL8.0之后支持函数索引特性,可以针对函数计算后的值建立索引。

  • 对索引进行表达式计算

    原理与对索引使用函数类似。

  • 对索引进行隐式类型转换

    分情况讨论,如果索引字段是字符串类型,但条件查询中的输入参数是整型,会走全表扫描。

    如果索引字段是整型,条件查询中输入参数是字符串类型时,索引不会失效,因为MySQL会将字符串转为整型。

  • 联合索引非最左匹配

    对主键字段建立的索引叫聚簇索引,对普通字段建立的索引叫二级索引。多个普通字段组合在一起建立的索引叫联合索引/组合索引。

    联合索引的建立顺序会影响查询性能,因为联合索引是按照最左优先的顺序进行索引匹配。

  • WHERE子句中的OR

    如果存在OR查询,其中一个条件的字段没有建立索引,那么数据库会走全表扫描,因为OR查询意味着需要查询OR连接的两个条件的结果集的并集。

事务

  • 事务的隔离级别如何实现?

  • 事务有哪些特性?

  • 并行事务会引发什么问题?

SQL执行过程

CoolCats
CoolCats
理学学士

我的研究兴趣是时空数据分析、知识图谱、自然语言处理与服务端开发