设为首页 加入收藏

TOP

Mysql详解(一)(一)
2023-07-25 21:32:17 】 浏览:53
Tags:Mysql 详解

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数据按照顺
首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇每日算法题之二叉树的深度 下一篇SELECT COUNT(*) 会造成全表扫描..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目