存储引擎
就是存储数据的方式
查看存储引擎:
show engines;
MyISAM
"""
mysql5.5之前的版本默认引擎
查询速度比InnoDB快,安全性低
不支持事务
支持表级锁
"""
InnoDB
"""
mysql5.6之后的版本默认引擎
查询速度比MyISAM慢,安全性高
支持事务
支持行级锁
外键
"""
MEMORY
"""
数据存在内存中
"""
MyISAM
.frm----> 表结构
.MYD-----> 表数据
.MYI-----> 索引(目录) 优点: 查询速度快
InnoDB
.frm----->表结构
.ibd------>表数据和索引
MEMORY
.frm ----> 表结构
MyISAM和InnoDB引擎的区别?
MyISAM
每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm文件存储表定义。数据文件的扩展名为.MYD (MYData)。
MyISAM表格可以被压缩,而且它们支持全文搜索。不支持事务,而且也不支持外键。如果事物回滚将造成不完全回滚,不具有原子性。在进行updata时进行表锁,并发量相对较小。如果执行大量的SELECT,MyISAM是更好的选择。
MyISAM的索引和数据是分开的,并且索引是有压缩的,内存使用率就对应提高了不少。能加载更多索引,而Innodb是索引和数据是紧密捆绑的,没有使用压缩从而会造成Innodb比MyISAM体积庞大不小
MyISAM缓存在内存的是索引,不是数据。而InnoDB缓存在内存的是数据,相对来说,服务器内存越大,InnoDB发挥的优势越大。
优点:查询数据相对较快,适合大量的select,可以全文索引。
缺点:不支持事务,不支持外键,并发量较小,不适合大量update
InnoDB:
这种类型是事务安全的。.它与BDB类型具有相同的特性,它们还支持外键。InnoDB表格速度很快。具有比BDB还丰富的特性,因此如果需要一个事务安全的存储引擎,建议使用它。在update时表进行行锁,并发量相对较大。如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表。
优点:支持事务,支持外键,并发量较大,适合大量update
缺点:查询数据相对较快,不适合大量的select
数据类型
整形
tinyint smallint int bigint
他们之间的区别就是存储数据的范围不一样
所有整形默认都是带符号的
浮点型
float double decimal
float(8,2)
总共八位,小数两位 eg: 最大值999999.99
double(8,2)
总共八位,小数两位
decimal(8,2)
总共八位,小数两位
精确度
decimal > double > float
字符串
字符串括号内的数字必须写,代表存储字符串的长度
chr(4)
存储4位,不够的空格补齐,超过四位的报错
优点:
查询速度快,整存整取
缺点:
浪费空间
varchar(4)
存储4位,有几位存几位,超过的报错
优点:
节省空间
缺点:
查询速度比char慢
数据类型之日期类型
datetime 年月日时分秒
date 年月日
time 时分秒
year 年
mysql> create table t1 (id int, q_time datetime, a_time date, z_time time, w_time year);
Query OK, 0 rows affected (0.05 sec)
mysql> desc t1;
+--------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+----------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| q_time | datetime | YES | | NULL | |
| a_time | date | YES | | NULL | |
| z_time | time | YES | | NULL | |
| w_time | year | YES | | NULL | |
+--------+----------+------+-----+---------+-------+
5 rows in set (0.01 sec)
mysql> insert into t1 values(1, '2021-7-27 15:42:21', '2021-7-27', '15:42:24', '2021');
Query OK, 1 row affected (0.01 sec)
mysql> select *from t1;
+------+---------------------+------------+----------+--------+
| id | q_time | a_time | z_time | w_time |
+------+---------------------+------------+----------+--------+
| 1 | 2021-07-27 15:42:21 | 2021-07-27 | 15:42:24 | 2021 |
+------+---------------------+------------+----------+--------+
1 row in set (0.00 sec)
枚举
enum
多选一
mysql> create table t1 (id int, gender enum('male', 'female', 'other'));
Query OK, 0 rows affected (0.04 sec)
mysql> desc t1;
+--------+-------------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------------------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| gender | enum('male','female','other') | YES | | NULL | |
+--------+-------------------------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql> insert into t1(id, gender) values(1, 'male');
Query OK, 1 row affected (0.00 sec)
mysql> select * from t1;
+------+--------+
| id | gender |
+------+--------+
| 1 | male |
+------+--------+
1 row in set (0.00 sec)
mysql> insert into t1(id ,gender) values(2, egon); # 报错, 因为这个不在定义的枚举里面
ERROR 1054 (42S22): Unknown column 'egon' in 'field list'
集合
set
多选一
mysql> create table t1(hobby set('read', 'music', 'dbj', 'tea');
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 '' at line 1
mysql> create table t1(hobby set('read', 'music', 'dbj', 'tea'));
Query OK, 0 rows affected (0.04 sec)
mysql> desc t1;
+-------+---------------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------------------------------+------+-----+---------+-------+
| hobby | set('read','music','dbj','tea') | YES | | NULL | |
+-------+---------------------------------+------+-----+---------+-------+
1 row in set (0.00 sec)
mysql> insert into t1 values('read');
Query OK, 1 row affected (0.01 sec)
mysql> insert into t1 values('read,music');
Query OK, 1 row affected (0.01 sec)
mysql> insert into t1 values('read,qe'); # 报错,插入的数据只能是集合里面的,可以是多个
ERROR 1265 (01000): Data truncated for column 'hobby' at row 1
mysql> select * from t1;
+------------+
| hobby |
+------------+
| read |
| read,music |
+------------+
2 rows in set (0.00 sec)
创建表的完整语句
create table 表名 (
字段名 数据类型(长度) 约束条件1 约束条件2,
字段名 数据类型(长度) 约束条件1 约束条件2,
字段名 数据类型(长度) 约束条件1 约束条件2
)
"""
注意:
1.表中字段名和数据类型是必填项, 约束条件可选
2.约束条件可以有多个,依次往下写
3.sql语句最后一个不能加逗号
"""