MySQL-没有索引的时候数据是个什么样子

从一条记录说起

数据结构

  在innnerDB引擎中上图就是一条记录的数据结构,图中可以看出一条记录分为额外信息和真实信息两大块,真实信息就是各个列的实际值,而额外信息就包含变长字段长度列表,NULL值列表和记录头信息3部分。
.1. 变长字段长度列表.: 在mysql中有基本类型(定长)和变长类型两大块。基本类型有TINYINT ,SMALLINT,INT,INTEGER,BIGINT,FLOAT,DOUBLE。变长类型就有char,varchar,text,DECIMAL等。变长类型就会在此列表中,因为变长字段是由用户自定义的长度,所以mysql需要在字段创建后,需要记录每个变长列实际值。
.2. NULL列表.:对于记录为NULL值的数据会存放在这些地方。
.3. 记录头信息.:记录头信息是由固定的5个字节组成,那么就是40位。这些位一共组合成8个参数。
在这里插入图片描述
  上图就是记录头中各个参数的意思。大家别被这些参数吓到,小编给大家讲讲大概意思。
  前两个预留位就不说了,设计mysql的大叔为了方便扩展用的保留字。
.1.delete_flag:标记记录是否删除,大家可能就会疑惑,平时砸门删除记录,难道不是直接从硬盘上删除了么。其实对于记录的删除,mysql做的事情有很多,这里就浅讲一下,首先记录会讲这个标记为设置为1,但是实际不会从硬盘直接删除,就类似砸门工作中的软删。这么做的目的是为了复用,mysql会像向内存申请一块连续的存储空间,如果下次又有相同的记录进来,直接将标志位复原就行,而不用进i/o,重新排序等操作消耗性能。那么会一直存在不进行物理删除么,其实也不会,mysql有一个线程会专门处理这些标记删除的记录进行实实在在的删除。其实除了删除线程,我们的日志文件也会进行帮忙删除。这里就暂时先不展开了。

2.record_type:0和1好理解,那后面那两个玩意又是啥呢?,其实这两个东西就类似,队长和队尾的兄弟,就是说在表没有记录的时候就会有这两个记录存在,一个永远在队首的位置,一个永远在队尾的位置,其实对数据结构了解的兄弟一眼就看出这就是头结点和尾结点。

  其他参数就是字面含义了,大家其实多看几遍这几个参数,又是头结点,尾结点的,又是记录下一条的记录地址。那么就联想到数据结构-链表了。没错在没有索引树的时候,记录就是通过链表相连的。

存放记录的池子-页

在这里插入图片描述
  原谅小编画图实在太辣鸡就直接抠图了哈。上图就是数据页的结构,其实在前面页提到过页,细心的同学就行发现了页面中最小的记录和最大记录两个参数,这也证实了页是由多个记录组成的。
  我们先来看User Records这个参数,意思是用户的记录(也叫做堆),记录分为mysql自己的系统参数和我们用户插入的记录。那么我们插入的记录都是在这里紧密相连的,前面我们在说一条记录的数据机构的时候提过heap_no这个参数,表示在页中的地址位置,那么就是在User Records中的位置。
  再来谈next_record这个参数,表示下一条记录的位置,其实就知道了队列中你后面那兄弟距离你有多远,Supremum一直是队列中吊车尾的存在所以他的这个参数值就是0了。
  砸门来看看重点n_owned这个参数的目的,前面说过页里面的数据会被分为若干个组,每个组都有个队长,这个值就代表每个组有多少条记录,其实他不仅仅这个作用。我们大概介绍了记录和页的数据结构,那么我们查询记录的时候,mysql到底是怎么遍历的呢?不说废话,搬图!
在这里插入图片描述
  这就是一个页的里面记录存放的样子,每个页被分组为若干个组,每个组中的数据按照顺序用单向链表连接起来,每个组中最大的记录(队长)取next_record参数作为槽拿出来连接起来放到左边,那么这个时候我想要查id为6的记录该怎么玩呢?
  一条条遍历肯定是非常耗时,因为记录都是链表,无法向数组那样通过下标就可以取出来。这时候槽的作用就体现出来,我们可以先遍历槽,符合条件再通过槽去找那一组记录,再遍历那一组记录就可以得到值啦。
  这里采用的是二分法进行遍历,首先找到中间槽槽2的位置,通过next_record参数发现是8,那证明前面有8条记录,而记录又是顺序相连的,那么肯定是在槽2或者前面的槽里面,再二分法从槽0和槽2之间查到槽1的位置,发现槽1的next_record参数发现是4,那就证明只可能再槽2中,这时候通过8这条记录往前遍历就可以找到6这条记录啦。
  不得不佩服设计mysql的大叔的睿智,其实这里大家也发现了,虽然使用了二分法避免全表遍历,但是如果记录非常多呢,二分法同样非常耗时。所以mysql大叔就引进了索引这个东西。这个下章会讲到索引的结构。

### MySQL复杂表结构设计与实现 在设计复杂的MySQL表结构时,需综合考虑多个方面以确保数据库系统的高性能、高可用性和易维护性。以下是关于复杂表结构设计的关键要素及其最佳实践: #### 1. 需求分析的重要性 在设计任何数据库之,需求分析是一个不可或缺的过程。通过深入理解业务逻辑和数据存储的需求,可以更合理地定义表之间的关系以及字段属性[^1]。 #### 2. 命名规范 为了便于理解和维护,应采用一致的命名策略。例如,表名通常使用名词单数形式(如`User`),而列名则具体描述该列的内容(如`user_id`, `created_at`)。这种规范化不仅提高了代码可读性,还减少了潜在错误的发生概率[^3]。 #### 3. 数据类型选择 正确选择合适的数据类型对于节省存储空间并提升查询效率至关重要。需要注意的是,在某些情况下,虽然指定了整数类型的显示宽度(如`INT(10)`),但这仅影响输出格式而不改变实际存储大小[^4]。 #### 4. 字段约束设置 利用各种约束条件来保障数据完整性是非常必要的。常见的约束有主键(`PRIMARY KEY`)用于唯一标识每条记录;外键(`FOREIGN KEY`)用来建立不同表格间的关系;还有非空(`NOT NULL`)限制等都可以有效防止非法输入进入系统。 #### 5. 索引优化 适当创建索引可以帮助加速检索操作,但过多或不当使用的索引反而会降低写入速度及增加磁盘占用量。因此,在决定哪些列应该被加索引要仔细权衡利弊,并定期审查现有索引的有效性。 #### 6. 表关联关系处理 当涉及到多张相互依赖的表时,清晰表达它们之间的一对一、一对多或者多对多联系就显得尤为重要了。比如可以通过在外键上添加级联更新/删除选项简化管理流程。 #### 示例:电子商务平台订单管理系统 假设我们要构建一个简单的电商网站后台数据库模型,则可能涉及以下几个主要实体及其对应关系: - 用户 (`users`) - 商品类别 (`categories`) - 商品详情 (`products`) - 购物车项 (`cart_items`) - 订单头信息 (`orders`) - 订单明细行 (`order_details`) 下面是部分SQL语句展示如何按照上述原则搭建这样一个体系: ```sql CREATE TABLE users ( user_id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, email VARCHAR(100) NOT NULL UNIQUE, password_hash CHAR(60) NOT NULL, -- Assuming bcrypt hash length is fixed at 60 chars. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE categories ( category_id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, name VARCHAR(80) NOT NULL UNIQUE COMMENT 'Category Name', description TEXT NULL ); CREATE TABLE products ( product_id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, sku VARCHAR(30) NOT NULL UNIQUE COMMENT 'Stock Keeping Unit', title VARCHAR(255) NOT NULL, price DECIMAL(10 , 2 ) UNSIGNED NOT NULL CHECK (price >= 0), stock_quantity INT UNSIGNED DEFAULT 0, category_id SMALLINT UNSIGNED NOT NULL, FOREIGN KEY fk_products_categories(category_id) REFERENCES categories(category_id) ON DELETE RESTRICT ON UPDATE CASCADE ); ``` 以上仅为一小部分内容片段演示目的所用,请根据实际情况调整参数设定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值