mysql与pg的主键索引说明
mysql与pg的主键说明
- mysql
- 插入顺序与插入随机测试案例
- B+Tree
- 原理
- id顺序的方式插入
- id随机的方式插入
- Postgresql
- 堆组织表
- CTID
- Pg的元组及索引原理
- Pg与mysql与oracel
- 问题
mysql
插入顺序与插入随机测试案例
创建了两张表 一张表是按顺序来插入的 一张表是按随机的方式来插入的,他们都只有两个字段id与name 插入的数据量都是一样的单线程插入一百万务数据,他们的耗时差异是不大的 都是400多秒
但是这两张表占用的空间差异是非常大的
而顺序方式插入的表,则只占用了27兆的空间 ,随机方式插入的是43M
B+Tree
原理
为何差跑这么巨大,Mysql的主键是按照因为B+树来存储的正常的存储
id顺序的方式插入
当我们按照顺序的方式来插入数据,这些数据都会落入最后一个节点上**,因为他前面的所有节点都是满的(按顺序嘛)**即下图是每个节点都存储5条数据
id随机的方式插入
如果按照随机的方式插入,那么他就有可能插入到一个已经满的节点上,这时节点就会分裂,分裂成两个节点 就有可能每个节点上存储了三条数据
缺点:随机插入就会产生了很多不满的节点,即在数据量一样的情况下随机插入产生了更多不满的节点 ,空间差很大 效率也不行 本地的,远程调用
Postgresql
数据库关于索引的系统表
Pg_index记录索引的具体属性
Pg_opclass
堆组织表
- pg默认采用的是堆组织表的方式来存储
- 堆表(heap table)数据插入时存储位置是随机的,主要是数据库内部块的空闲情况决定,获取数据是按照命中率计算,全表扫表时不见得先插入的数据先查到。
- 数据存储与索引存储分开, 数据存放在数据里面,索引存放在索引里
堆的图
堆就是无序数据的集合,索引就是将数据变得有序,在索引中键值有序,数据还是无序的
堆表中,主键索引和普通索引一样的,叶子节点存放的是指向堆表中数据的指针(可以是一个页编号加偏移量),指向物理地址,没有回表的说法
堆表中,主键和普通索引基本上没区别,和非空的唯一索引没区别
CTID
PG数据索引的存储顺序并不以某一列的排序顺序来存储,而是以行CTID号来存储(每一行有一个行ID号,并且这个行ID号是一个坐标)
即新增数据永远是在索引存储的最后一个叶子,即不会存在B+Tree的页分列
ctid坐标(0,1)在第0个文件page页上递增
Pg的元组及索引原理
http://www.postgres.cn/v2/news/viewone/1/539
Pg与mysql与oracel
Oracle支持堆表,也支持索引组织表
PostgreSQL只支持堆表,不支持索引组织表
Innodb只支持索引组织表
问题
postgresql得看看主键是否一定有序的?
答: 和主键没关系,所以主键无序也可以,PG索引存储的是通过系统内部的ctid实现的对标oracel的rowId
- PG本身是使用堆表的方式进行数据存储与索引存储,即数据的存储根据内部块的空闲情部随机存储,而索引的存储根据不以某一列的排序顺序来存储,而是以行ctid号来存储(每一行有一个行ID号,并且这个行ID号是以坐标方式自增的系统内部的)
- 下图是阿里巴巴关于这块儿的阐述
- 我们的想法,即始PG主键可以不用有序递增,其实我们还是推荐业务尽量保持分布式全局唯一并且有序递增,这样在业务上很方便,比如在sharding时进行分页查询也能用上哦
分页的性能优化
select * from t_order order by id limit 1000000,10
select * from t_order order by id limit 0,1000010 (改写后)
建议的性能优化: select * from t_order where id>1000000 and id<1000010 order by id
或者 select * from t_order where id>1000000 limit 10
即id要是有序自增有时还能用上的啊
mysql与pg的主键索引说明相关推荐
- mysql建表语句主键索引_MySQL添加主键、索引
查看索引 SHOW INDEX FROM 数据库表名 比如:SHOW INDEX FROM order_info; 添加索引 alter table 数据库add index 索引名称(数据库字段名 ...
- mysql中聚簇索引和主键索引
InnoDB索引分为两种: 聚簇索引:也称聚集索引,①一般建表时的主键就会被mysql作为聚簇索引,②如果没有主键,则选择非空唯一的索引作为聚簇索引,③都没有则隐式创建一个索引作为聚簇索引 辅助索引: ...
- mysql主键索引_MySQL索引之主键索引
在MySQL里,主键索引和辅助索引分别是什么意思,有什么区别? 上次的分享我们介绍了聚集索引和非聚集索引的区别,本次我们继续介绍主键索引和辅助索引的区别. 1.主键索引 主键索引,简称主键,原文是PR ...
- MySQL中的索引(主键索引)
MySQL中的索引(主键索引篇) 主键索引是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值.一般是在建表的时候同时添加主键索引: 一.如何添加主键索引 修改表添加主键索引 Alter tab ...
- 【实施工程师之家】——mysql四种索引PRIMARY(主键索引)、INDEX(一般索引)、UNIQUE(非空索引)、FULLTEXT(全文索引)应用
mysql四种索引PRIMARY(主键索引).INDEX(一般索引).UNIQUE(非空索引).FULLTEXT(全文索引)应用 目录 1)PRIMARY: 2)NORMAL: 3)UNIQUE: 4 ...
- MYSQL的全表扫描,主键索引(聚集索引、第一索引),非主键索引(非聚集索引、第二索引),覆盖索引四种不同查询的分析...
文章出处:http://inter12.iteye.com/blog/1430144 MYSQL的全表扫描,主键索引(聚集索引.第一索引),非主键索引(非聚集索引.第二索引),覆盖索引四种不同查询的分 ...
- mysql非主键索引_主键索引和非主键索引的区别
1. 什么是最左前缀原则? 以下回答全部是基于MySQL的InnoDB引擎 例如对于下面这一张表 如果我们按照 name 字段来建立索引的话,采用B+树的结构,大概的索引结构如下 如果我们要进行模糊查 ...
- 主键索引 or 辅助索引?一文告诉你 Mysql limit 优化时的索引选择!
作者 | 吴海存 责编 | 徐威龙 封图| CSDN下载于视觉中国 导读: 本文主要针对limit分页时,是优先基于主键索引还是辅助索引等层面展开分析,对limit及offset的用法以及是否该用索引 ...
- mysql索引类型和区别是什么意思_mysql主键索引和普通索引之间的区别是什么
索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存.MySQL提供多种索引类型供选择:普通索引 .唯一性索引.主键索引 .全文索引等等.下面本篇文章就来给大家介绍一下主键索 ...
最新文章
- linux expect 输入密码,shell脚本无密码登录 expect的使用方法详解
- 【java--反射】注解(反射解析注解+注解应用)
- 使用PHP实现用户登录和注册的功能
- C# 跨线程调用控件
- python动态方法_python中的动态方法生成
- java应用程序无法启动,Apache Tomcat / 6.0.32 - Web应用程序无法启动
- 我在优酷 OTT 端做自动化制图
- Office 2007 Pro/Ent 简体中文版下载
- 护照扫描仪的应用环境解读 SDK数据
- 4种文件扩展名被阻止时发送邮件附件的方法
- 最难学的七大编程语言,VB 第一,Python垫底,看你学的排第几
- 离线高清卫星地图SDK及解决方案
- 问题解决:idea 中无法连接 sql server 数据库,报错 [08S01] 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接
- 车牌识别算法 matlab,车牌识别算法及其MATLAB实现
- 华为路由器ws5200虚拟服务器,华为路由器配置dhcp怎么弄?华为路由WS5200设置DHCP服务器方法...
- SQL Round 取整千 整百 整万
- 女巫煎蛋(omelette for a witch)
- 安全合规/GDPR--26--研究:GDPR疑难点及合规建议
- Caas社区作为一种服务
- 语义分割标记单张图片
热门文章
- 金盘转债上市价格预测
- 程序设计-在校整理-06 最常公共子序列与子串+2048小游戏+KNN简单实例
- golang 使用negroni,实现server
- 长春工业大学计算机研究生专业课,长春工业大学(专业学位)计算机技术研究生考试科目和考研参考书目...
- 安卓App太能乱来了!被曝一天扫你后台1.3万次:小米系统更新,一不小心扯出惊人真相...
- 零基础学3D建模难不难?
- mysql查询数据量
- C语言递归之苹果分盘问题
- 计算机少年宫辅导教师总结,学校信息技术教师的个人工作总结
- 湿寒阳虚体质如何艾灸