MySQL官方对索引的定义为:索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护者满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。如下面的示意图所示 :
左边是数据表,一共有两列七条记录,最左边的是数据记录的物理地址(注意逻辑上相邻的记录在磁盘上也并不是一定物理相邻的)。为了加快Col2的查找,可以维护一个右边所示的二叉查找树,每个节点分别包含索引键值和一个指向对应数据记录物理地址的指针,这样就可以运用二叉查找快速获取到相应数据。
一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储在磁盘上。索引是数据库中用来提高性能的最常用的工具。
是一个排序的列表,存储这索引值和这个所对应的物理地址
无须对整个表进行扫描,通过物理地址就可以找到所需数据
是表中一列或则若干个值排序的方法
需要额外的磁盘空间
(相当于目录,方便查找 伴随着表存在的! 面对于小量的数据/小篇幅量的数据不需要建立索引
300行以内的不要要建立索引 否则会占用空间)
优势
1) 类似于书籍的目录索引,提高数据检索的效率,降低数据库的IO成本。
2) 通过索引列对数据进行排序,降低数据排序的成本,降低CPU的消耗。
劣势
1) 实际上索引也是一张表,该表中保存了主键与索引字段,并指向实体类的记录,所以索引列也是要占用空间的。
2) 虽然索引大大提高了查询效率,同时却也降低更新表的速度,如对表进行INSERT、UPDATE、DELETE。因为更新表时,MySQL 不仅要保存数据,还要保存一下索引文件每次更新添加了索引列的字段,都会调整因为更新所带来的键值变化后的索引信息。
最基本的索引类型,没有唯性之类的限制
创建普通索引的方式
#进入找数据库配置文件目录
[root@localhost ~]# cd /usr/local/mysql/data/
[root@localhost data]# ls
auto.cnf ib_logfile0 mei shuai
ib_buffer_pool ib_logfile1 mysql sys
ibdata1 ibtmp1 performance_schema
[root@localhost data]# ls mei/
db.opt gg.frm gg.ibd hei.frm hei.ibd
#db.opt:mei库的配置文件 gg.frm:表结构文件(属性信息) gg.idb:索引文件 i就是索引
mysql> use mei;
Database changed
mysql> show tables;
+---------------+
| Tables_in_mei |
+---------------+
| gg |
| hei |
+---------------+
2 rows in set (0.00 sec)
普通索引
方法一:
create index index_name on table_name(column(length)); length是可选择项
示例:
#创建表
mysql> create table shu (id int(3),name varchar(2));
Query OK, 0 rows affected (0.01 sec)
#查看shu表结构
mysql> desc shu;
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| id | int(3) | YES | | NULL | |
| name | varchar(2) | YES | | NULL | |
+-------+------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
#建立索引
mysql> create index id_index on shu(id);
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
#索引MUL建立成功
mysql> desc shu;
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| id | int(3) | YES | MUL | NULL | |
| name | varchar(2) | YES | | NULL | |
+-------+------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
方法二:修改表方式创建
alter table table _name add index index_name(column(length));
实例:
mysql> alter table shu add index zui (name);
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> describe shu;
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| id | int(3) | YES | MUL | NULL | |
| name | varchar(2) | YES | MUL | NULL | |
+-------+------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
方法三:创建时直接索引
mysql> create table lisi(id int,index id_index(id));
Query OK, 0 rows affected (0.01 sec)
mysql> describe lisi;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id | int(11) | YES | MUL | NULL | |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)
mysql> create table li(id int,index shui(id));
Query OK, 0 rows affected (0.01 sec)
mysql> describe li;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id | int(11) | YES | MUL | NULL | |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)
与“普通索引‘基本相同
与普通索引的区别是索引是索引列的所有值只能出现一次,即必须唯一
创建唯一索引的方式
CREATE UNIQUE INDEX index_name ON table_name(column(length));
ALTER TABLE table_name ADD UNIQUE index_name(column(length));
查看索引
#查看所有表
mysql> show tables;
+---------------+
| Tables_in_mei |
+---------------+
| gg |
| hei |
| li |
| lisi |
| num |
| shu |
+---------------+
6 rows in set (0.00 sec)
#\G是竖着查看
mysql> show index from lisi\G
*************************** 1. row ***************************
Table: lisi
Non_unique: 1
Key_name: id_index
Seq_in_index: 1
Column_name: id
Collation: A
Cardinality: 0
Sub_part: NULL
Packed: NULL
Null: YES
Index_type: BTREE
Comment:
Index_comment:
1 row in set (0.00 sec)
示例:设置唯一索引
mysql> create unique index shuai_name on hei(name);
Query OK, 0 rows affected, 1 warning (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 1
mysql> show index from hei\G
*************************** 1. row ***************************
Table: hei
Non_unique: 0
Key_name: unique_name
Seq_in_index: 1
Column_name: name
Collation: A
Cardinality: 2
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
*************************** 2. row ***************************
Table: hei
Non_unique: 0
Key_name: shuai_name
Seq_in_index: 1
Column_name: name
Collation: A
Cardinality: 2
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
3 rows in set (0.00 sec)
mysql> select * from hei;
+----+--------+-------+-----------+
| id | name | score | address |
+----+--------+-------+-----------+
| 1 | lisi | 44.50 | doongjing |
| 2 | wangwu | 77.00 | xiamen |
+----+--------+-------+-----------+
2 rows in set (0.00 sec)
#向数据表插入内容 name里面的值不能出现一样的 即时索引也是约束 可以为空
mysql> insert into hei (name,score,address) values ('lisi'78,'nanjing');
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '78,'nanjing')' at line 1
(备注:唯一索可以为空 但只能一次)
是一种特殊的唯一索引,指定为”PRIMARY KEY"
一个表只能有一个主键,不允许有空值
非空且唯一
语法:
create table tablename([...],primary key(列的列表));
alter table tablename add primary key(列的列表);
例如:
alter table IT_salary add primary key;
'//创建主键索引的两种方式,创建表的时候指定主键索引和后期增加主键索引'
可以是单列上创建的索引,也可以是在多列上创建的索引
最左原则,从化左往右执行
语法:
create table tablename([...],primary key(列的列表));
alter table tablename add primary key(列的列表);
例如:
alter table IT_salary add primary key;
'//创建主键索引的两种方式,创建表的时候指定主键索引和后期增加主键索引'
mysql> alter table hei add fulltext index shu_index(address);
Query OK, 0 rows affected, 1 warning (0.14 sec)
Records: 0 Duplicates: 0 Warnings: 1
#查看表结构
mysql> mysql> desc hei;
+---------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+----------------+
| id | int(3) | NO | PRI | NULL | auto_increment |
| name | char(10) | NO | UNI | NULL | |
| score | decimal(5,2) | YES | | NULL | |
| address | varchar(50) | YES | MUL | 未知 | |
+---------+--------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
#查看索引
mysql> show index from hei\G;
....省略内容
*************************** 4. row ***************************
Table: hei
Non_unique: 1
Key_name: shu_index
Seq_in_index: 1
Column_name: address
Collation: NULL
Cardinality: 2
Sub_part: NULL
Packed: NULL
Null: YES
Index_type: FULLTEXT ##全文索引类型
Comment:
Index_comment:
4 rows in set (0.00 sec)
ERROR:
No query specified
表的主键 、外键必须有索引
记录数超过300行的表应该有索引
经常与其他表进行连接的表,在连接字段上应该建立索引
唯一性太差的字段不适合建立索引
更新太频繁的字段不适合创建索引
2.7:创建索引的原则依据
经常出现在where子句中的字段,特别是大表的字段,应该建立索引
索引应该建立在选择性高的字段上
索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建立索引
2.7:删除索引语法
DROP INDEX index——name ON table——name
ALTER TABLE table——name DROP INDEX index——name;
示例
mysql> drop index shu_index on hei;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
#在查看索引
mysql> show index from hei\G;
..已删除
目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。
而通常我们用的最多的就是第一范式(1NF)、第二范式(2NF)、第三范式(3NF),也就是本文要讲的“三大范式”。
第一范式(1NF):要求数据库表的每一列都是不可分割的原子数据项。
1NF是对属性的原子性
,要求属性具有原子性,不可再分解;
举例说明:
在上面的表中,”家庭信息“和”学校信息学“列均不满足原子性的要求,故不满足第一范式,调整如下:
可见,调整后的每一列都是不可再分的,因此满足第一范式(1NF);
第二范式(2NF):在1NF的基础上,非码属性必须完全依赖于候选码(在1NF基础上消除非主属性对主码的部分函数依赖)
第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。
举例说明:
在上图所示的情况中,同一个订单中可能包含不同的产品,因此主键必须是“订单号”和“产品号”联合组成,
但可以发现,产品数量、产品折扣、产品价格与“订单号”和“产品号”都相关,但是订单金额和订单时间仅与“订单号”相关,与“产品号”无关,
这样就不满足第二范式的要求,调整如下,需分成两个表:
在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)
第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。
举例说明:
上表中,所有属性都完全依赖于学号,所以满足第二范式,但是“班主任性别”和“班主任年龄”直接依赖的是“班主任姓名”,
而不是主键“学号”,所以需做如下调整:
这样以来,就满足了第三范式的要求。
ps:如果把上表中的班主任姓名改成班主任教工号可能更确切,更符合实际情况,不过只要能理解就行。
BEGIN或START TRANSACTION 【事务的开始】
COMMIT 【提交 事务的结束】
ROLLBACK 【回滚】
SAVEPOINT identifier 【存档点】
RELEASE SAVEPOINT identifier 【删除存档点】
ROLL BACK TO identifier 【回滚到某个存档点】 【identifire 存档名称 随意更改】
SETTR ANSACTION 【设置事务】
示例
#开始一个事务 表中没有数据
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
#插入新的数据
mysql> insert into xiao (name,score,address) values ('sange',88,'shanghai');
ERROR 1146 (42S02): Table 'xiao.xiao' doesn't exist
mysql> insert into tom (name,score,address) values ('sange',88,'shannghai');
Query OK, 1 row affected (0.00 sec)
#进行复杂表查询
mysql> select * from tom;
+----+-------+-------+----------+
| id | name | score | address |
+----+-------+-------+----------+
| 1 | sange | 88.0 | shanghai |
+----+-------+-------+----------+
1 row in set (0.00 sec)
#执行事物提交
mysql> commit;
Query OK, 0 rows affected (0.00 sec)
#数据依然在
mysql> select * from tom;
+----+-------+-------+----------+
| id | name | score | address |
+----+-------+-------+----------+
| 1 | sange | 88.0 | shanghai |
+----+-------+-------+----------+
1 row in set (0.00 sec)
#执行一下回滚看一下
mysql> rollback;
Query OK, 0 rows affected (0.00 sec)
#数据依然在
mysql> select * from tom;
+----+-------+-------+----------+
| id | name | score | address |
+----+-------+-------+----------+
| 1 | sange | 88.0 | shanghai |
+----+-------+-------+----------+
1 row in set (0.00 sec)
#假如我们在从从新插入数据信息呢??它会回到哪里?
mysql> insert into tom (name,score,address) values ('zhangsan',64 ,''suzhou');
Query OK, 1 row affected (0.00 sec)
#查询表
mysql> select * from tom;
+----+----------+-------+----------+
| id | name | score | address |
+----+----------+-------+----------+
| 1 | sange | 88.0 | shanghai |
| 2 | zhangsan | 64.0 | suzhou |
+----+----------+-------+----------+
2 rows in set (0.00 sec)
#关闭自动提交功能
mysql> set autocommit=0;
Query OK, 0 rows affected (0.00 sec)
#在插入新的数据
mysql> insert into tom (name,score,address) values ('liuge',81,'nanjing');
Query OK, 1 row affected (0.00 sec)
#查询表数据
mysql> select * from tom;
+----+----------+-------+----------+
| id | name | score | address |
+----+----------+-------+----------+
| 1 | sange | 88.0 | shanghai |
| 5 | zhangsan | 64.0 | suzhou |
| 6 | liuge | 81.0 | nanjing |
+----+----------+-------+----------+
3 rows in set (0.00 sec)
#再次输入rollback;回滚
mysql> rollback;
Query OK, 0 rows affected (0.01 sec)
##set autocommit=0时 后面所有的语句都在事务当中 直到设置set autocommit=1
mysql> select * from tom;
+----+----------+-------+----------+
| id | name | score | address |
+----+----------+-------+----------+
| 1 | sange | 88.0 | shanghai |
| 5 | zhangsan | 64.0 | suzhou |
+----+----------+-------+----------+
2 rows in set (0.00 sec)
#再次插入数据
mysql> insert into tom (name,score,address) values ('liu',84,'nanjjing');
Query OK, 1 row affected (0.00 sec)
mysql> select * from tom;
+----+----------+-------+----------+
| id | name | score | address |
+----+----------+-------+----------+
| 1 | sange | 88.0 | shanghai |
| 5 | zhangsan | 64.0 | suzhou |
| 7 | liu | 84.0 | nanjing |
+----+----------+-------+----------+
3 rows in set (0.00 sec)
#开启自动提交
mysql> set autocommit=1;
Query OK, 0 rows affected (0.00 sec)
#执行回滚
mysql> rollback;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from tom;
+----+----------+-------+----------+
| id | name | score | address |
+----+----------+-------+----------+
| 1 | sange | 88.0 | shanghai |
| 5 | zhangsan | 64.0 | suzhou |
| 7 | liu | 84.0 | nanjing |
+----+----------+-------+----------+
3 rows in set (0.00 sec)
#新建表结构
mysql> create table tt (name varchar(40) not null);
Query OK, 0 rows affected (0.01 sec)
mysql> desc tt;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| name | varchar(40) | NO | | NULL | |
+-------+-------------+------+-----+---------+-------+
1 row in set (0.00 sec)
#表中是空的
mysql> select * from tt;
Empty set (0.00 sec)
#导入tom表中的name数据信息
mysql> insert into tt select name from tom;
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
#生成的新表
mysql> select * from tt;
+----------+
| name |
+----------+
| sange |
| zhangsan |
| liu |
+----------+
3 rows in set (0.01 sec)
#查看tom表
mysql> select * from tom;
+----+----------+-------+----------+
| id | name | score | address |
+----+----------+-------+----------+
| 1 | sange | 88.0 | shanghai |
| 5 | zhangsan | 64.0 | suzhou |
| 7 | liu | 84.0 | nanjing |
+----+----------+-------+----------+
3 rows in set (0.00 sec)
#执行事务的开始
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
#插入信息
mysql> insert into tom (name,score,address) values ('zhouwu',80,'dongbei');
Query OK, 1 row affected (0.00 sec)
#设置存档点 名称为a
mysql> savepoint a;
Query OK, 0 rows affected (0.00 sec)
#查看表
mysql> select * from tom;
+----+----------+-------+----------+
| id | name | score | address |
+----+----------+-------+----------+
| 1 | sange | 88.0 | shanghai |
| 5 | zhangsan | 64.0 | suzhou |
| 7 | liu | 84.0 | nanjing |
| 8 | zhouwu | 80.0 | dongbei |
+----+----------+-------+----------+
4 rows in set (0.00 sec)
#新建一个数据
mysql> insert into tom (name,score,address) values ('shuaige',79,'xinjing');
Query OK, 1 row affected (0.00 sec)
#存档b保留了shuaige字段
mysql> savepoint b;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from tom;
+----+----------+-------+----------+
| id | name | score | address |
+----+----------+-------+----------+
| 1 | sange | 88.0 | shanghai |
| 5 | zhangsan | 64.0 | suzhou |
| 7 | liu | 84.0 | nanjing |
| 8 | zhouwu | 80.0 | dongbei |
| 9 | shuaige | 79.0 | xinjing |
+----+----------+-------+----------+
5 rows in set (0.00 sec)
#再次新建
mysql> insert into tom (name,score,address) values ('shu',79,'xinjing');
Query OK, 1 row affected (0.00 sec)
mysql> select * from tom;
+----+----------+-------+----------+
| id | name | score | address |
+----+----------+-------+----------+
| 1 | sange | 88.0 | shanghai |
| 5 | zhangsan | 64.0 | suzhou |
| 7 | liu | 84.0 | nanjing |
| 8 | zhouwu | 80.0 | dongbei |
| 9 | shuaige | 79.0 | xinjing |
| 10 | shu | 79.0 | xinjing |
+----+----------+-------+----------+
6 rows in set (0.00 sec)
##怎么回到b存档???
mysql> rollback to b;
Query OK, 0 rows affected (0.00 sec)
##shuige已经没了
mysql> select * from tom;
+----+----------+-------+----------+
| id | name | score | address |
+----+----------+-------+----------+
| 1 | sange | 88.0 | shanghai |
| 5 | zhangsan | 64.0 | suzhou |
| 7 | liu | 84.0 | nanjing |
| 8 | zhouwu | 80.0 | dongbei |
| 9 | shuaige | 79.0 | xinjing |
+----+----------+-------+----------+
5 rows in set (0.01 sec)
###回到a存档
mysql> rollback to a;
Query OK, 0 rows affected (0.00 sec)
##shuige没了
mysql> select * from tom;
+----+----------+-------+----------+
| id | name | score | address |
+----+----------+-------+----------+
| 1 | sange | 88.0 | shanghai |
| 5 | zhangsan | 64.0 | suzhou |
| 7 | liu | 84.0 | nanjing |
| 8 | zhouwu | 80.0 | dongbei |
+----+----------+-------+----------+
4 rows in set (0.00 sec)
#引发一个问题 能不能用rollback回到b存档???
##显然是不可能的 回到上个存档的时 下面的存档都会从内存空间释放出来
存档b的节点都依赖于存档a 一旦回到它的上一存档 缓存空间数据都会释放
mysql> rollback to b;
ERROR 1305 (42000): SAVEPOINT b does not exist
##rollback也会事务的结束 接下来实验
mysql> rollback;
Query OK, 0 rows affected (0.01 sec)
#rollback是在事务中
mysql> select * from tom;
+----+----------+-------+----------+
| id | name | score | address |
+----+----------+-------+----------+
| 1 | sange | 88.0 | shanghai |
| 5 | zhangsan | 64.0 | suzhou |
| 6 | liuge | 81.0 | nanjing |
+----+----------+-------+----------+
3 rows in set (0.00 sec)
#事务结束插入数据是不提供的 如果没有结束rollbak是执行许可的
mysql> insert into tom (name,score,address) values ('jerry',66,'tianjing');
Query OK, 1 row affected (0.00 sec)
mysql> select * from tom;
+----+----------+-------+----------+
| id | name | score | address |
+----+----------+-------+----------+
| 1 | sange | 88.0 | shanghai |
| 5 | zhangsan | 64.0 | suzhou |
| 7 | liu | 84.0 | nanjing |
| 11 | jerry | 66.0 | tianjing |
+----+----------+-------+----------+
5 rows in set (0.00 sec)
mysql> rollback;
Query OK, 0 rows affected (0.00 sec)
#没有执行跳转 rollback也可以事务的结束
mysql> select * from tom;
+----+----------+-------+----------+
| id | name | score | address |
+----+----------+-------+----------+
| 1 | sange | 88.0 | shanghai |
| 5 | zhangsan | 64.0 | suzhou |
| 7 | liu | 84.0 | nanjing |
| 11 | jerry | 66.0 | tianjing |
+----+----------+-------+----------+
5 rows in set (0.00 sec)
总结:存储引擎 innodb 前提
三种事务的开始
begin;
set autocommit=1;
start transaction
三种情况结束事务
commit;
set autocommot=1;
rollback
存储引擎介绍
mylSAM不支持事务,也不错支持外键
访问速度快
对事务完整性没有要求
MYlSAM在磁盘存储三个文件:
.frm文件存储表定义
数据文件的扩展名为.MYD
索引文件的扩展名是(.MYlndex)
表级别的锁定方式,数据更新时锁定整个表
数据库在读写过程中相互阻塞
1:也会数据写入的过程阻塞用户数据的读取
2: 也会在数据读写的过程中阻塞用户的数据写入
数据单独写入或读取,速度过程较快占用资源比较少
mylAM支持的存储格式
1:静态表
【直接读写】
2: 动态表
【直接写入】
3: 压缩表
【容量压缩】
共享表空间
表中的数据和索引分散成多个文件进行存储
好处:增加了读写的速度
缺点:一旦进行数据删除,会有冗余的空间,无法使用删除.
独立表空间
表空间 逻辑定义
数据库 物理定义
业务需要事务的支持
行级锁定对高并发有很好的适应能力,但需要确保包查询是通过索引来完成
业务数据更新较为频繁的场景
如:论坛,微博等
业务数据一致性要求较高
如:银行业务
硬件设备内存较大,利用lnnoddb较好的混存能力来提高内存利用率,减少磁盘IO的压力
需要考虑毎个存儲引擎提供了哪些不同的核心功能及应用场景
支持的字段和数据类型
●所有引擎都支持通用的数据类型
●但不是所有的引擎都支持其它的字段类型,如二进制对象
锁定类型:不同的存储引擎支持不同级别的锁定
●表锁定
●行锁定
索引的支持
●建立索引在搜索和恢复数据库中的数据的时候能够显著提高性能
●不同的存储引擎提供不同的制作索引的技术
●有些存储引擎根本不支持索引
事务处理的支持
●事务处理功能通过提供在向表中更新和插入信息期间的可靠性
●可根据企业业务是否要支持事务选择存储引擎
alter tabletable_name engine=引擎
mysql> alter table tom engine=myisam;
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0
#修改下图信息
[root@localhost ~]# vim /etc/my.cnf
#在重启服务
[root@localhost ~]# systemctl restart mysqld
create table 表名(字段) engine=引擎
mysql > create table info (id int(3) not null primary key auto_increment,name varchar(10) not null,score decimal(5,2),address varchar(50) default '未知')engine=myisam;