Mysql的介绍
【1】MySQL是一个轻量级关系型数据库管理系统,将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,就增加了速度并提高了灵活性。
【2】sql语言分类:
名称 | 解释 | 命令 |
DDL | 定义和管理数据对象,如:数据库,数据表等 | create,drop,alter |
DML | 用于操作数据库对象所包含的数据 | insert,delete,update |
DQL | 用于查询数据库对象所包含的数据 | select |
DCL | 用于管理数据库,包括管理权限和数据更改 | grant,commit,rollback |
【3】索引分类
1)聚簇索引(又称为主键索引,本质上数据是存储在叶子节点上)
2)非二级索引(又称为二级索引,本质上叶子节点只存储数据的id,需要进行回表获得数据)
【1】类型
(1)NORMAL(普通索引,也是最常用的)
(2)FULLTEXT(全文索引)
(3)SPATIAL(空间索引)
(4)UNIQUE(唯一索引)
【2】方法
(1)BTREE(也就是B+Tree)
(2)HASH(也就是hash table结构)
【3】字段个数
(1)单个
(2)多个(组合索引又称为复合索引)
Mysql的列的数据类型详解
【1】数值
类型 | 解释 | 大小 |
tinyint | 十分小的数据 | 1个字节 |
smallint | 较小的数据 | 2个字节 |
int | 标准的整数 | 4个字节 |
bigint | 较大的数据 | 8个字节 |
float | 浮点数 | 4个字节 |
double | 浮点数 | 8个字节 |
decimal | 字符串形式的浮点数 | 16个字节 |
【2】字符串
类型 | 解释 | 大小 |
char | 字符串固定的大小 | 0-255 |
varchar | 可变字符串 | 0-65535 |
tinytext | 微型文本 | 2^8-1 |
text | 保存大文本 | 2^16-1 |
【3】时间和日期
类型 | 解释 | 大小 |
date | 日期格式:YYYY-MM-DD | 3字节 |
time | 时间格式:HH:mm:ss | |
datetime | 日期格式:YYYY-MM-DD HH:mm:ss | 8字节 |
timestamp | 时间戳,从1970.1.1至现在的毫秒数 | 4字节 |
year | 年份表示 |
【4】null,没有值【注意:使用NULL进行运算,结果为NULL】
Mysql的存储引擎【存储引擎生效的单位是表】
【1】展示
mysql> show engines; +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ | Engine | Support | Comment | Transactions | XA | Savepoints | +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ | InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES | | MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO | | MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO | | BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO | | MyISAM | YES | MyISAM storage engine | NO | NO | NO | | CSV | YES | CSV storage engine | NO | NO | NO | | ARCHIVE | YES | Archive storage engine | NO | NO | NO | | PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO | | FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL | +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ 9 rows in set (0.06 sec)
【2】MyISAM存储引擎
【2.1】文件说明
//每张表对应会有三个文件 //MyISAM索引文件和数据文件是分离的(非聚集) user.MYI //索引存储的信息 user.MYD //数据存储的信息 user.frm //数据表结构的信息
【2.2】图示
【3】InnoDB存储引擎
【3.1】文件说明
//每张表对应会有两个文件 //表数据文件本身就是按B+Tree组织的一个索引结构文件 //聚集索引-叶节点包含了完整的数据记录 article.frm //数据表结构的信息 article.ibd //数据与索引存储的信息
【3.2】图示
【3.3】为什么建议InnoDB表必须建主键,并且推荐使用整型的自增主键?
1)首先如果不建立的话,它会从数据列中找出全部不同的一列作为主键,如果找不到会创建一个隐藏列作为主键。那么既然会有隐藏列列了,干脆直接创建就好。
2)如果使用UUID作为主键,首先,UUID不易于存储,16字节128位,通常以36长度的字符串表示,很多场景不适用。其次新行的主键值不一定比之前的主键值大,所以innoDb无法做到总是把新行插入到索引的最后,而需要为新行寻找合适的位置来分配新的空间,这个过程会导致:
【1】写入的目标页可能从缓存上移除了,或者还没有加载到缓存上,innodb写入之前需要先从磁盘找到目标页,会产生大量的随机IO; 【2】因为写入是乱序的,innoDb 要做频繁的分页操作,以便为行产生新的空间,页分裂导致移动大量的数据,一次插入最少需要修改三个页以上; 【3】频繁的页分裂,页会变得稀疏并被不规则的填充,最终会导致数据会有碎片; 【4】随机值(uuid和雪花id)载入到聚簇索引,有时候会需要做一次OPTIMEIZE TABLE来重建表并优化页的填充,这将又需要一定的时间消耗。
3)使用自增主键则可以避免上述问题:
【1】自增主键值是顺序的,所以Innodb把每一条记录都存储在一条记录的后面。当达到页面的最大填充因子时候(innodb默认的最大填充因子是页大小的15/16,会留出1/16的空间留作以后的修改),下一条记录就会写入新的页中; 【2】数据按照顺