mysql创建table

innodb 存储引擎,创建一个表

本文分析创建一个段。待叙,主要说明是如何创建一文件,并在文件中分配一个索引。

 

上面是创建一个表的调用图。创建文件和创建一个btr

 

/**********************************************************************//**
Allocates a new file segment inode.
@return    segment inode, or NULL if not enough space */
static
fseg_inode_t*
fsp_alloc_seg_inode(
/*================*/
    fsp_header_t*    space_header,    /*!< in: space header */
    mtr_t*        mtr)        /*!< in/out: mini-transaction */
{
    ulint        page_no;
    buf_block_t*    block;
    page_t*        page;
    fseg_inode_t*    inode;
    ibool        success;
    ulint        zip_size;
    ulint        n;

    ut_ad(page_offset(space_header) == FSP_HEADER_OFFSET);

    if (flst_get_len(space_header + FSP_SEG_INODES_FREE, mtr) == 0) {
        /* Allocate a new segment inode page */

        success = fsp_alloc_seg_inode_page(space_header, mtr);

        if (!success) {

            return(NULL);
        }
    }

    page_no = flst_get_first(space_header + FSP_SEG_INODES_FREE, mtr).page;

    zip_size = fsp_flags_get_zip_size(
        mach_read_from_4(FSP_SPACE_FLAGS + space_header));
    block = buf_page_get(page_get_space_id(page_align(space_header)),
                 zip_size, page_no, RW_X_LATCH, mtr);
    buf_block_dbg_add_level(block, SYNC_FSP_PAGE);

    page = buf_block_get_frame(block);

    n = fsp_seg_inode_page_find_free(page, 0, zip_size, mtr);

    ut_a(n != ULINT_UNDEFINED);

    inode = fsp_seg_inode_page_get_nth_inode(page, n, zip_size, mtr);

    if (ULINT_UNDEFINED == fsp_seg_inode_page_find_free(page, n + 1,
                                zip_size, mtr)) {
        /* There are no other unused headers left on the page: move it
        to another list */

        flst_remove(space_header + FSP_SEG_INODES_FREE,
                page + FSEG_INODE_PAGE_NODE, mtr);

        flst_add_last(space_header + FSP_SEG_INODES_FULL,
                  page + FSEG_INODE_PAGE_NODE, mtr);
    }

    ut_ad(!mach_read_from_8(inode + FSEG_ID)
          || mach_read_from_4(inode + FSEG_MAGIC_N) == FSEG_MAGIC_N_VALUE);
    return(inode);
}

 

 

转载于:https://www.cnblogs.com/kisstherain/p/10258405.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值