mysql之mysql数据在磁盘的储存方式

Wesley13
• 阅读 671

mysql的数据在磁盘上的存储:
    数据
        由多个磁盘block组成的,存储引擎负责管理数据

        磁盘是block设备,数据在磁盘上的存放也是按照存放的。
        mysql读取表到内存的时候,也必许按照一的方式读取。假设要查询的表在和其他表在都在同一个内。加载的时候除了读取要查询的表,其他表也一并被读取出来。

        当一个内的部分表被删除时,这是就是形成了碎片。这样会降低装载到内存的速度。

        所以会生成一个头,记录一个快内表的大小,有无空闲空间,空闲空间的位置。

文件的记录组织类型:
    堆文件组织:
        把行简单的堆起来,没有顺序,记录可能在文件的任何地方。
        查询效率低

    顺序文件组织:
        把行按照某字段(搜索码、排序码)的值顺序记录。
        更新代价大。

    散列文件组织:
        人为将表分成多个部分,每个部分称为桶。根据行中的某个或某些字段做使用散列函数做哈希运算,运算结果属于某个范围的放在指定的桶中。多个桶组成一个表。
        桶有可能溢出。所以要选定一个合适散列函数,让行平均在各个桶中。

表的组成:
    表是由表定义和表数据组成的。和block=inode+data类似。
    表定义:表的结构,字段类型和长度等。
    表数据:字段的属性值。

表空间(table space):
    用于实现将多个表的数据组织在一个数据文件中的一个逻辑管理组件。是一种高级的空间管理器。有点类似于逻辑卷。

数据字典(data directory):
    各种关系的元数据。

    关系的名字
    字段名称
    字段类型和长度
    视图
    完整性约束
    用户的名字
    权限
    用户的密码
    ...

mysql的数据储存:
    MyISAM:
        *.frm 表结构定义文件
        *.MYD 表数据文件
        *.MYI 表索引文件

    InnoDB:
        所有表共享一个表空间文件。即把众多表示数据文件放在一个文件内。这个文件叫做表空间文件
        建议分开存放。

        修改后的文件
            *.frm 表结构定义文件
            *.opt 选项文件。包含默认字符集和排序规则。
            *.ibd 表空间(表数据和表索引)

        方法如下:
            mysql>SHOW VARIABLES LIEK '%innodb%'; 查看和innodb相关的会话变量。
                innodb_file _per_table  OFF 默认是不启用。

            #vim /etc/my.cnf
                [mysqld]
                    innodb_file_per_table = 1 
            #systemctl reload mysqld

            mysql>SHOW GLOBAL VARIABLES LIEK '%innodb%'; 查看innodb的全局变量。

    mysql初始化后,默认mysql数据库的格式是MyISAM。其他的数据库的格式取决于默认设置

    查看mysql支持的存储引擎:
        mysql>SHOW ENGINES;

        表头行中:
            Engine 引擎名称
            Suuport YSE表示支持,DEFAULT表示为默认引擎
            Commnet 描述信息
            Transaction  是否支持事务
            XA 是否支持分布式事务
            Savepoint 是否支持保存点,支持事务的引擎才支持保存点

    查看表的状态信息:
        mysql>SHOW TABLE STATUS [FROM|IN DBNAME] [LIKE ‘PATTERN’|WHERE EXPR]

        例如:
            mysql>USE mysql
            mysql>SHOW TABLE STATUS LIKE 'user' \G 查看mysql库中user表的状态信息

    查看服务器支持的字符集:
        mysql>SHOW CHARACTER SET;

    查看服务器支持的排序规则:
        mysql>SHOW COLLATION;

实例:
    1.显示字符集和排序规则:
        mysql>SHOW CHARACTER SET;  显示字符集
        mysql>SHOW COLLATION; 显示排序规则

    2.创建数据库,指定字符集为gbk,排序规则为gbk_chinese_ci
        mysql>CREATE DATABASE IF NOT EXISTS test CHARACTER SET 'gbk' COLLATE 'gbk_chinese_ci';
        或
        mysql>CREATE SCHEMA IF NOT EXISTS test CHARACTER SET 'gbk' COLLATE 'gbk_chinese_ci';

    3.删除数据库:
        mysql>DROP DATABASE test;

    4.数据库重命名:
        一般情况下,数据库是不能重命名的,以下方法也不建议使用。
        思路:数据库本质上也是几个文件的组成,只要修改文件文件名即可变相的改变数据库的名字。

        #mysqladmin shutdown
        #cd $DATA_DIR
        #mv test.* abc.*
        #service mysqld start 

    5.向courses表中插入数据:
        mysql>INSERT INTO courses (CourName) values ('httpd'),('dns'),('mysql');
        mysql>SELECT * FROM courses; 查看表的数据
        mysql>SHOW INDEXES FROM courses; 查看表的索引

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
9个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这