主要考虑的点
- 数据量大小
- 阻塞的时间长短
Mysql构建索引
页管理、目录项记录、页分裂
PG构建索引
排序,元数据操作,物理复制
--------------------关于mysql和pg构建索引的处理过程-----------------------
MySQL和PostgreSQL(PG)作为流行的开源关系型数据库系统,它们在索引的创建和构建过程上有一些共同之处,同时也存在一些差异。
MySQL索引构建过程:
页管理:MySQL中的InnoDB存储引擎使用页作为存储空间管理的单位,每个页通常大小为16KB。数据存储在页中,并通过双向链表进行链接。在创建索引时,InnoDB会按照主键值的顺序将数据组织到索引页中,主键值较小的数据放在前面,较大的数据放在后面。
目录项记录:为了快速定位数据,InnoDB会为每个页创建一个目录项记录,其中包括该页的最小主键值和页目录号(页号)。这样,通过主键可以快速地定位到数据所在的页。
页分裂:当插入新数据时,如果当前页的主键值超过了该页的最大主键值,InnoDB会分配一个新的页来存放数据,并更新链表,这个过程称为页分裂。页分裂可能会导致数据的移动和额外的I/O操作。
PostgreSQL索引构建过程:
排序:PostgreSQL在创建B-Tree索引时,会先对待创建索引的数据进行排序,然后按照B-Tree的页面格式直接写入页面,避免了不必要的页分裂。
元数据操作:在PostgreSQL中,创建索引的过程涉及到一系列的元数据操作,包括在Catalog系统中生成新索引的元数据,以及在索引列上进行排序并生成B-Tree的page。
物理复制:PostgreSQL的标准复制使用WAL进行物理复制,而MySQL的标准复制使用binlog进行逻辑复制。PostgreSQL也支持通过发布/订阅模式进行逻辑复制。
对比分析:
页管理:MySQL使用页和双向链表进行管理,而PostgreSQL使用进程而非线程模型,这可能导致更多的系统资源消耗,但也提供了更好的隔离性。
排序:PostgreSQL在创建索引前对数据进行排序,而MySQL在插入数据时进行排序,这可能会影响两者的性能表现。
复制:MySQL的逻辑复制可能与PostgreSQL的物理复制在数据一致性和复制速度上有所不同。
ACID事务支持:两者都支持ACID事务,但PostgreSQL提供了更强大的支持,例如行级安全(RLS)。
查询优化器:PostgreSQL通常被认为拥有更优秀的查询优化器。
扩展性:PostgreSQL支持多种扩展,如PostGIS提供地理空间能力,而MySQL的扩展性主要体现在可插拔的存储引擎架构。
易用性:MySQL在某些方面更为宽容,例如在GROUP BY子句的SELECT语句中允许包含非聚合列。
生态:PostgreSQL的可扩展架构使其生态系统近年来更加繁荣。
在选择数据库时,需要考虑以上各点,并根据具体的应用场景和业务需求来决定最适合的数据库系统。