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