MySQL基础
1.存储引擎
1.1MyISAM
MySQL5.5以及之前默认存储引擎MyISAM
如果应用是以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性、并发性要求不高,那么可以选择这个存储引擎。
MyISAM一个表对应三个文件表结构、表中的数据、存储索引
1.2InnoDB
MySQL5.6之后默认存储引擎InnoDB
用于事务处理应用程序,支持外键和行级锁。
InnoDB一个表对应两个文件表结构、表中的数据和索引存在一个文件
2.InnoDB介绍
1- 事务处理(transaction processing)可以用来维护数据库的完整性,它保证成批的MySQL操作要么完全执行,要么完全不执行。
2- 支持行级锁和表级锁,默认为行级锁。
表级锁: 开销小,加锁快;不会出现死锁(因为MyISAM会一次性获得SQL所需的全部锁);锁定粒度大,发生锁冲突的概率最高,并发度最低。
行级锁: 开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
3- 外键(froeign key)外键为某个表中的一列,它包含两一个表的主键值,定义了两个表之间的关系。
3.查看数据库的存储引擎
# 查看数据库的默认存储引擎 mysql> show variables like "default_storage_engine"; +------------------------+--------+ | Variable_name | Value | +------------------------+--------+ | default_storage_engine | InnoDB | +------------------------+--------+ 1 row in set, 1 warning (0.00 sec) # 查看数据库支持的存储引擎 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.00 sec)
4.指定存储引擎
4.1在见表时指定存储引擎
# 创建存储引擎为InnoDB的表 mysql> create table indb (id int, name char(12)) engine=innodb; Query OK, 0 rows affected (0.04 sec) # 创建存储引擎为MyISAM的表 mysql> create table myam (id int, name char(12)) engine=myisam; Query OK, 0 rows affected (0.01 sec) # 修改表的存储引擎 mysql> alter table indb engine=myisam; Query OK, 0 rows affected (0.04 sec) Records: 0 Duplicates: 0 Warnings: 0
4.2在配置文件中指定存储引擎
查看my.ini配置文件 # 创建新表时将使用的默认存储引擎 default-storage-engine=INNODB
5.MySQL常见数据类型
类型 | 大小 | 范围(有符号) | 范围(无符号)unsigned约束 | 用途 |
int | 1字节 | (-128,127) | (0,255) | 小整数值 |
float |
4 字节 float(255,30) |
(-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) | 0,(1.175 494 351 E-38,3.402 823 466 E+38) | 单精度 浮点数值 |
char |
0-255字节 |
- | - | 定长字符串 |
varchar | 0-65535 字节 | - | - | 变长字符串 |
datetime | 8 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 年月日时分秒 |
enum |
对1-255个成员的枚举需要1个字节存储; 对于255-65535个成员,需要2个字节存储; 最多允许65535个成员。 |
- | - | 选择性别 |
set |
1-8个成员的集合,占1个字节 9-16个成员的集合,占2个字节 17-24个成员的集合,占3个字节 25-32个成员的集合,占4个字节 33-64个成员的集合,占8个字节 |
- | - | 多选:兴趣爱好 |
常见数据类型说明
字符串,描述的都是字符 # char 定长字段 255 相对浪费空间 存取的速度比varchar要快 # char(10) # 'hellohello1' --> 'hellohello' # 'hello ' # varchar 变长字段 65535 相对节省空间 存取的速度比varchar要慢 # varchar(200) # 'hellohello1' --> '10hellohello' # 'hello' --> '5hello' # 常见的场景 # 手机号 char(11) # 身份证号 char(18) # 用户名 char(14) # 密码 char(12) # 评论 varchar 时间 # datetime 集合和枚举 # hobby set('抽烟','喝酒','烫头') # gender enum('男','女')
6.MySQL的约束条件
not null :非空约束,指定某列不能为空; default:默认值约束,指定某列的默认值 unique:唯一约束,指定某列或者几列组合不能重复; auto_increment:自增约束,指定某int、非空列自动增加 primary key:主键,指定该列的值可以唯一地标识该列记录 foreign key:外键,指定该行记录从属于主表中的一条记录,主要用于参照完整性
not null
mysql> create table not_null (id int not null); Query OK, 0 rows affected (0.69 sec) mysql> desc not_null; +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | id | int(11) | NO | | NULL | | +-------+---------+------+-----+---------+-------+ 1 row in set (0.01 sec) mysql> insert into not_null values (null); ERROR 1048 (23000): Column 'id' cannot be null mysql> insert into not_null values(1); Query OK, 1 row affected (0.40 sec) mysql> desc not_null; +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | id | int(11) | NO | | NULL | | +-------+---------+------+-----+---------+-------+ 1 row in set (0.00 sec) mysql> select * from not_null; +----+ | id | +----+ | 1 | +----+ 1 row in set (0.00 sec)
default
mysql> create table name_sex (id int, name char(12), sex char(10) default 'male'); Query OK, 0 rows affected (0.52 sec) mysql> desc name_sex; +-------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+----------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | name | char(12) | YES | | NULL | | | sex | char(10) | YES | | male | | +-------+----------+------+-----+---------+-------+ 3 rows in set (0.00 sec) mysql> insert into name_sex (name) values ('zhangsan'); Query OK, 1 row affected (0.44 sec) mysql> select * from name_sex; +------+----------+------+ | id | name | sex | +------+----------+------+ | NULL | zhangsan | male | +------+----------+------+ 1 row in set (0.00 sec) mysql> insert into name_sex (id, name) values (2, 'lisi'); Query OK, 1 row affected (0.04 sec) mysql> select * from name_sex; +------+----------+------+ | id | name | sex | +------+----------+------+ | NULL | zhangsan | male | | 2 | lisi | male | +------+----------+------+ 2 rows in set (0.00 sec) mysql> insert into name_sex (name, sex) values ('wangwu', 'female'); Query OK, 1 row affected (0.04 sec) mysql> select * from name_sex; +------+----------+--------+ | id | name | sex | +------+----------+--------+ | NULL | zhangsan | male | | 2 | lisi | male | | NULL | wangwu | female | +------+----------+--------+ 3 rows in set (0.00 sec)