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

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; 查看表的索引

时间: 2025-01-12 23:40:51

mysql之mysql数据在磁盘的储存方式的相关文章

mysql批量更新数据(性能优化) 第一种方式

首先想到的是,一条一条更新的速度太慢了,然后就想批量更新,一次更新N条数据.实践是检验真理的唯一标准,不一会儿,代码就敲完了,重新试了一下,效果依旧不理想.啊哦,真是要崩溃!后面又想到了利用异步,我一下子开多个mysql连接,同时处理,可是依旧慢的一笔.然后就放弃了,更新的效率肯定是满足不了了.然后就想着绕弯子了,我新建一张表,把旧表数据取出来,处理完后,直接插入到新表,然后再把旧表删除,把新表重新命名成旧表的名字.想想,insert into的速度应该会比update快不少.但是要把旧表数据全

mysql批量更新数据(性能优化)--第二种方式

Spring+Mybatis 手动控制事务 参考: https://blog.csdn.net/qq_41750175/article/details/87621170 public boolean testDelete(String jobCode) throws Exception { boolean flag = false; //1.获取事务控制管理器 DataSourceTransactionManager transactionManager = HqznContext.getBea

mysql表ibdata1数据切换到单个表储存、默认导出的表结构

释放MySQL ibdata1文件的空间 mysqldump选项: --add-drop-table:在每个创建数据库表语句前添加删除数据库表的语句: --add-locks:备份数据库表时锁定数据库表: --all-databases:备份MySQL服务器上的所有数据库: --comments:添加注释信息: --compact:压缩模式,产生更少的输出: --complete-insert:输出完成的插入语句: --databases:指定要备份的数据库: --default-charact

MySQL学习笔记(13)之储存引擎

储存引擎 1.概念:数据库对同样的数据,有着不同的储存方式和管理方式. 2.MyISAM: 1.MyISAM表是独立于操作系统的,这说明可以轻松地将其从Windows服务器移植到Linux服务器:每当我们建立一个MyISAM引擎的表时,就会在本地磁盘上建立三个文件,文件名就是表明. 2.MyISAM表无法处理事务,这就意味着有事务处理需求的表,不能使用MyISAM存储引擎. 3.MyISAM存储引擎特别适合在以下几种情况下使用: 3.1选择密集型的表.MyISAM存储引擎在筛选大量数据时非常迅速

mysql的char数据类型和varchar数据类型的选择

mysql的char数据类型和varchar数据类型的选择 存储引擎对于选择char和varchar的影响: 对于MyISAM存储引擎:最好使用固定长度的数据列代替可变长度的数据列.这样可以使整个表静态化,从而使数据检索更快,用空间换时间 对于InnoDB存储引擎:使用可变长度的数据列,因为InnoDB数据表的存储格式不分固定长度和可变长度,因此使用char不一定比使用 varchar更好,但由于varchar是按照实际的长度存储,比较节省空间,所以对磁盘I/O和数据存储总量比较好 mysql并

【MySQL】MySQL中针对大数据量常用技术_创建索引+缓存配置+分库分表+子查询优化(转载)

原文地址:http://blog.csdn.net/zwan0518/article/details/11972853 目录(?)[-] 一查询优化 1创建索引 2缓存的配置 3slow_query_log分析 4分库分表 5子查询优化 二数据转移 21插入数据 如今随着互联网的发展,数据的量级也是撑指数的增长,从GB到TB到PB.对数据的各种操作也是愈加的困难,传统的关系性数据库已经无法满足快速查询与插入数据的需求.这个时候NoSQL的出现暂时解决了这一危机.它通过降低数据的安全性,减少对事务

mysql导入导出数据

大家都知道myisam读数据时比innodb要快,但导入大量表是myisam的记录特别慢,下面是我总结的mysql在导入导出大数据时加快速度的方法 一.使用into outfile导出.load data导入数据1.导出大数据表(into outfile导出的数据是文本) mysql> select count(*) from app_china; +----------+ | count(*) | +----------+ | 17931 | +----------+ 1 row in set

MySQL schema和binary log磁盘空间趋势分析

Author:Skate Time:2015/01/05 MySQL schema和binary log磁盘空间趋势分析 [[email protected] dist]# ./mysqlsize  --help usage: Database diskspace usage v0.1 ,(C) Copyright Skate 2014 [-h] [--load LOAD] --dbtype DBTYPE --cfg CFG --field FIELD --datadir DATADIR --l

redis作为mysql的缓存服务器(读写分离,通过mysql触发器实现数据同步)

一.redis简介Redis是一个key-value存储系统.和Memcached类似,为了保证效率,数据都是缓存在内存中.区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步.在部分场合可以对关系数据库起到很好的补充作用.它提供了Java,C/C++(hiredis),C#,PHP,JavaScript,Perl,Object-C,Python,Ruby等客户端,使用很方便. 二.架构图<ignore_js_