数据库是用来存储数据的,数据又是存储在表中的,一个数据库中可以包含多张表。

在表中定义列时,应该指定列的名称、数据类型(整型、浮点型、字符串等)和默认值(如果有的话)。

下面是所有数据类型的概述,其中JSON数据类型是一个新的扩展类型

1.数字:TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT和BIT。

2.浮点数:DECIMAL、FLOAT和DOUBLE。

3.字符串:CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。

4.Spatial 数据类型。

5.JSON数据类型。

可以创建多用户的Mysql吗 mysql可以创建多少张表_服务器

创建一张客户数据表:

CREATE TABLE IF NOT EXISTS `customers` (`id` int(11) NOT NULL AUTO_INCREMENT,`first_name` varchar(20) DEFAULT NULL,`last_name` varchar(20) DEFAULT NULL,`country` varchar(20) DEFAULT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

其中的选项解释如下

IF NOT EXISTS:如果存在一个具有相同名字的表,并且你指定了这个子句,MySQL只会抛出一个警告,告知表已经存在。否则,MySQL将抛出一个错误。

id:它被声明为一个整型数,因为它只包含整型数。除此之外,还有两个关键字,AUTO_INCREMENT和PRIMARY KEY。

AUTO_INCREMENT:自动生成线性递增序列,因此不必担心为每一行的id分配值。

PRIMARY KEY:每行都由一个非空的UNIQUE列标识。只有一列应该在表中定义。如果一个表包含AUTO_INCREMENT列,则它会被视为PRIMARY KEY。

first_name、last_name和country:它们包含字符串,因此它们被定义为varchar,且字符长度为20个字节。

Engine:与列定义一起,还应该指定存储引擎。在MySQL中常用的存储引擎包括InnoDB、MyISAM、FEDERATED、BLACKHOLE、CSV和MEMORY。在所有引擎中,InnoDB是唯一的事务引擎,也是默认引擎。

CHARSET:设置表的默认字符集,如果不单独定义则会保持与当前库字符集相同。

COLLATE:字符集排序规则,同样如果不定义也是会继承当前数据库默认字符集排序规则。

可以创建多用户的Mysql吗 mysql可以创建多少张表_数据库_02

列出所有存储引擎:

mysql> SHOW ENGINES;

创建数据表常用语句汇总:

CREATE TABLE new_tblLIKE orig_tbl;

CREATE TABLE new_tblAS SELECT * FROM orig_tbl;

查看库中所有表:

SHOW FULL TABLES WHERE Table_type != 'VIEW'mysql> SHOW TABLES;+----------------+| Tables_in_test |+----------------+| customers || payments |+----------------+2 rows in set (0.00 sec)

模糊查询数据库对应表:比如查询以rs结尾的表可以这样

mysql> SHOW TABLES LIKE '%rs';+----------------------+| Tables_in_test (%rs) |+----------------------+| customers |+----------------------+1 row in set (0.00 sec)

表维护章

分析表

语法:ANALYZE [NO_WRITE_TO_BINLOG | LOCAL] TABLE tbl_name [, tbl_name] ......

功能:用于收集优化器统计信息、和tuning相关

支持引擎:InnoDB,NDB和 MyISAM表。它不适用于视图。

示例图:

可以创建多用户的Mysql吗 mysql可以创建多少张表_MySQL_03

可以创建多用户的Mysql吗 mysql可以创建多少张表_可以创建多用户的Mysql吗_04

分析表主要作用是分析关键字的分布。检查表主要作用是检查表是否存在错误。优化表主要作用是消除删除或者更新造成的空间浪费。

使用ANALYZE TABLE分析表的过程中,数据库系统会对表加一个只读锁。在分析期间,只能读取表中的记录,不能更新和插入记录。

运行结束后ANALYZE TABLE需要从锁表中删除该表。如果运行时间过长或者有事务正在使用该表,则后续的语句和事务必须等待它运行结束后才能继续操作。一般情况下很快就完成了,刷新锁表其实并不明显。

默认情况下,服务器会将ANALYZE TABLE表语句写入二进制日志,要禁止记录日志,请在运行语法中指定可选参数NO_WRITE_TO_BINLOG关键字或其别名LOCAL。

ANALYZE TABLE从INFORMATION_SCHEMA.INNODB_TABLESTATS 表中清除表统计信息 并将STATS_INITIALIZED列设置为Uninitialized。下次访问该表时,将再次收集统计信息。

检查表

语法:CHECK TABLE `tablename` { QUICK | FAST | CHANGED| MEDIUM | EXTENDED }

参数解释:

可以创建多用户的Mysql吗 mysql可以创建多少张表_可以创建多用户的Mysql吗_05

功能:CHECK TABLE检查一个或多个表或视图是否有错误

支持引擎:CHECK TABLE适用于 InnoDB, MyISAM, ARCHIVE,和 CSV表格

示例图:

可以创建多用户的Mysql吗 mysql可以创建多少张表_MySQL_06

下面我们将表文件打开随便编辑一下,前提条件是我们需要先停止MySQL要么会有进程占用无法编辑解释:检查表或视图是否有错误,信息字段输出OK表示正常。

可以创建多用户的Mysql吗 mysql可以创建多少张表_可以创建多用户的Mysql吗_07

上图我们删除了customer.idb文件的一行二进制内容,然后我们在启动MySQL服务器。

可以创建多用户的Mysql吗 mysql可以创建多少张表_服务器_08

此时我们就可以看到我们数据表出错了(这里只是试验,实际开发千万别这么干,很危险,而且修复很麻烦,严重情况下还得重新创建表)。

NOTE:

检查InnoDB表

如果CHECK TABLE遇到损坏的页面,服务器将退出以防止错误传播(错误#10132)。如果损坏发生在辅助索引中,但表数据是可读的,则运行CHECK TABLE仍会导致服务器退出。如果CHECK TABLE遇到损坏的索引DB_TRX_ID或 DB_ROLL_PTR聚集索引中的字段, CHECK TABLE可能导致 InnoDB访问无效的撤消日志记录,从而导致与 MVCC相关的服务器退出。如果CHECK TABLE在InnoDB表或索引中遇到错误,它将报告错误,并且通常会标记索引,有时还会将表标记为已损坏,从而阻止进一步使用索引或表。此类错误包括辅助索引中条目的数量不正确或链接不正确。如果CHECK TABLE在辅助索引中发现条目数不正确,则会报告错误,但不会导致服务器退出或阻止访问文件。CHECK TABLE调查索引页结构,然后调查每个键条目。它不会验证指向群集记录的键指针,也不会遵循BLOB 指针的路径。当InnoDB表被存储在它自己的 .ibd 文件,.ibd文件包含标题信息,而不是表或索引数据。该 CHECK TABLE语句不会检测到仅影响标头数据的不一致。要验证InnoDB .ibd文件的全部内容 ,请使用innochecksum命令。CHECK TABLE在大型InnoDB表上 运行时,其他线程可能在CHECK TABLE执行期间被阻止。为避免超时,操作的信号量等待阈值(600秒)会延长2小时(7200秒)CHECK TABLE。如果InnoDB 检测到240秒或更长时间的信号量等待,它将开始将InnoDB监视器输出打印到错误日志。如果锁定请求超出了信号灯等待阈值,则InnoDB中止该过程。为了完全避免信号灯等待超时,请运行 CHECK TABLE QUICK而不是CHECK TABLE。从MySQL 8.0.14开始,InnoDB支持并行聚集索引读取,这可以提高 CHECK TABLE性能。 InnoDB在CHECK TABLE 操作期间两次读取聚簇索引。可以并行执行第二次读取。innodb_parallel_read_threads 会话变量必须被设置为一个大于1的值用于并行聚簇索引读取发生。默认值为4。用于执行并行聚集索引读取的实际线程数取决于 innodb_parallel_read_threads 设置或要扫描的索引子树的数量,以较小者为准。检查MyIsAm表

CHECK TABLE更新MyISAM表的关键统计信息。如果CHECK TABLE输出未返回OK或Table is already up to date,则通常应修复该表。如果 未指定CHECK TABLE 选项QUICK, MEDIUM或EXTENDED,则动态格式MyISAM表 的默认检查类型为 MEDIUM。优化表

语法:OPTIMIZE [NO_WRITE_TO_BINLOG | LOCAL] TABLE `tablename` [, tbl_name] ......

功能:重新组织表数据和关联索引数据的物理存储,回收表空间 、减少表碎片、提高I/O。对每个表所做的确切更改取决于该表使用的存储引擎。

支持引擎:InnoDB、MyIsAm、ARCHIVE

示例图:

可以创建多用户的Mysql吗 mysql可以创建多少张表_服务器_09

可以创建多用户的Mysql吗 mysql可以创建多少张表_数据库_10

解释:上面语句执行后customers表文件会变的更小(前提条件是表存在碎片有可回收空间)。

在什么情况下用:

OPTIMIZE TABLE的使用取决于表的类型。对于InnoDB创建的表在进行实质性的插入,更新或删除操作之后使用。因为因为该文件是在innodb_file_per_table 启用了该选项的情况下创建的 。重组表和索引,并可以回收磁盘空间以供操作系统使用。对表中FULLTEXT全文索引的列进行实质性的插入,更新或删除操作之后使用。首先设置配置选项 innodb_optimize_fulltext_only=1。为了将索引维护期保持在一个合理的时间内,请设置 innodb_ft_num_word_optimize 选项,以指定要在搜索索引中更新的单词数,并运行一系列OPTIMIZE TABLE语句,直到完全更新搜索索引。执行过大量删除的MyISAM 或ARCHIVE表使用,因为删除的行标记会保留在索引列表中,在磁盘地址上并没有清楚,后续 INSERT操作将重用旧的行位置。您可以OPTIMIZE TABLE用来回收未使用的空间和对数据文件进行碎片整理。在对表进行大量更改之后,该语句还可以显着提高使用该表的语句的性能。NOTE:Msg_text中并不是报错,而是MySQL直接会将InnoDB引擎的表映射一下:

ALTER TABLE `customers` engine=’InnoDB’;

MyIsAm引擎的表不会有这条信息。

维修表

语法:REPAIR [NO_WRITE_TO_BINLOG | LOCAL] TABLE tbl_name [, tbl_name] ...... [QUICK] [EXTENDED] [USE_FRM]

功能:修复可能损坏的表

支持引擎:MyISAM, ARCHIVE和 CSV表,对于 MyISAM表,默认情况下它与myisamchk --recover tbl_name具有相同的效果

示意图:

可以创建多用户的Mysql吗 mysql可以创建多少张表_数据库_11

我们先将我们的 customers 表修改成 MyIsAm 存储引擎,然后对它进行了修复检查。

NOTE:

Repair 一般用于修复MyIsAm 、ARCHIVE和 CSV表。

在执行此操作前一定要备份表,以免造成数据丢失。

如果在执行repair服务器宕机后,启动后必须对所执行表立即执行repair table,然后在运行其他操作。在最坏的情况下,可能有一个新的干净索引文件,而没有有关数据的信息,然后执行的下一个操作可能会覆盖数据文件。所以前面说了一定要备份备份备份。

如果主服务器上的表损坏并REPAIR TABLE在其上运行,则对原始表所做的任何更改都 不会传播到从属服务器。

此语法需要具有SELECT 和INSERT 对表的操作权限。通常情况下我们是不会运行此语句的,但如果真的发生表损坏了,此语句很可能会帮你从MyIsAm表中找回所有数据。

如果你的表经常损坏,那请你找出根本原因解决问题。

可以创建多用户的Mysql吗 mysql可以创建多少张表_mysql 维护_12

下面说说InnoDB强制恢复

注意:一定要在修复之前备份表或者使用SELECT …… INTO OUTFILE ‘PATCH’转存表。

如果你的表是InnoDB引擎并且出现了严重损坏情况下可以执行强制恢复。

可以在配置文件中增加如下选项:

[mysqld]innodb_force_recovery = 1

在紧急情况下此参数设置为大于0的值,就可以启动InnoDB和转储表。这样做之前,请确保你拥有数据库的备份副本,以防万一需要重新创建它。

innodb_force_recovery默认情况下为0(正常启动而不强制恢复)。允许的非零值 innodb_force_recovery是1到6。较大的值包括较小值的功能。

1(SRV_FORCE_IGNORE_CORRUPT). 使服务器即使检测到损坏的页面也可以运行 。尝试 跳过损坏的索引记录和页,这有助于转储表。 SELECT * FROM tbl_name

2(SRV_FORCE_NO_BACKGROUND).阻止主线程和任何清除线程运行。如果在清除操作期间发生崩溃,则此恢复值可防止崩溃 。

3 (SRV_FORCE_NO_TRX_UNDO)崩溃恢复后 不运行事务 回滚。

4 (SRV_FORCE_NO_IBUF_MERGE)防止插入缓冲区合并操作。如果它们会导致崩溃,请不要这样做。不计算表 统计信息。此值可能会永久损坏数据文件。使用此值后,准备删除并重新创建所有二级索引。设置 InnoDB为只读。

5 (SRV_FORCE_NO_UNDO_LOG_SCAN)启动数据库时 不查看撤消日志: InnoDB甚至将未完成的事务也视为已提交。此值可能会永久损坏数据文件。设置InnoDB为只读。

6 (SRV_FORCE_NO_LOG_REDO)不进行与恢复有关的重做日志前滚。此值可能会永久损坏数据文件。使数据库页面处于过时状态,从而可能导致B树和其他数据库结构遭受更多破坏。设置 InnoDB为只读。

可以创建多用户的Mysql吗 mysql可以创建多少张表_服务器_13

查看表状态

语法:SHOW TABLE STATUS [{FROM | IN} db_name] [LIKE 'pattern' | WHERE expr]

解释:上面我们说过数据库各表的信息都保存在INFORMATION_SCHEMA.TABLES表里。可以直接在此表查询也可以通过SHOW TABLE STATUS命令来查询。

SHOW TABLE STATUS 其实和 SHOW TABLES一样,区别就是提供了每个非TEMPORARY 表的很多信息。

可以创建多用户的Mysql吗 mysql可以创建多少张表_数据库_14

输出字段解释:

可以创建多用户的Mysql吗 mysql可以创建多少张表_mysql 维护_15

结语

上面我们学会了表分析、检查、优化(此优化只是优化数据文件)、维修操作,下篇我来学习表常规操作。