一、数据库索引
1.1索引的概念
- 是一个排序的列表,存储着索引值和这个值所对应的物理地址(类似于C语言的链表通过指针指向数据记录的内存地址)
- 无须对整个表进行扫描,通过物理地址就可以找到所需数据,因此能加快数据库的查询速度
- 是表中一列或者若干列值排序的方法
- 需要额外的磁盘空间
- 索引就好比是一本书的目录,可以根据目录中的页面快速找到所需的内容
- 建立索引的目的是为了加快对表中记录的查找或排序
1.2索引的作用
- 索引的最基本作用:减少查询时间
- 数据库利用各种快速定位技术,能够大大加快查询速率(这也是创建索引的最主要原因)
- 当表很大或者查询设计到多个表时,可以成千上万倍的提高查询速度
- 可以降低数据库的IO成本,并且还可以降低数据库的排序成本
- 通过创建唯一性索引保证数据表里数据的唯一性
- 可以加快表与表之间的连接
- 在使用分组和排序时,可大大减少分组和排序时间
1.3索引的副作用(缺点)
- 索引需要占用额外的磁盘空间
- 对于MyISAM引擎而言,索引文件和数据文件是分离的,索引文件用于保存数据记录的地址。而InnoDB引擎的表数据文件本身就是索引文件
- 在插入和修改数据时要花费更多的时间,因为索引也要随之变动
1.4创建索引的原则依据(也是索引的相关优化)
- 索引虽可以提升数据库查询的速度,但不是任何情况下都适合创建索引。
因为索引本身会消耗系统资源,在有索引的情况下,数据库会先进行索引查询,然后定位到具体的数据化(记录),但是如果索引使用不当,反而会增加数据库的负担 - 表的主键、外键必须有索引。因为主键具有唯一性,外键关联的是主表的主键,查询时可以快速定位
- 记录数超过300行的表应该有索引。
因为如果没有索引,每次查询的时候都需要把整个表都遍历一次,会严重影响数据库的性能 - 经常与其他表进行连接的表,在连接字段上应该建立索引
- 唯一性太差的字段不适合建立索引
- 更新太频繁的字段不适合创建索引
- 经常出现在where子句中的字段,特别是大表的字段,应该建立索引(唯一性不是太差的字段)
- 索引应该建立在选择性高的字段上
- 索引应该建立在小字段上,对于大的字段甚至超长字段,不要建立索引
1.5索引的分类
- 普通索引
- 唯一索引
- 主键索引
- 组合索引
- 全文索引
1.6创建索引的方法
- 直接创建索引(主键索引无法使用此方式)
create index - 修改表结构方式添加索引
alter update - 创建表结构时创建索引
create table
1.6.1普通索引的创建
- 最基本的索引类型,没有唯一性之类的限制
- 索引名最好使用"index"结尾
- 普通索引的创建方式①:直接创建索引
格式:create index 索引名 on 表名 (列名[length]);
(列名[length]):length是可选性。
如果忽略length的值,则使用整个列的值作为索引。
如果指定使用列的前length个字符来创建索引,这样有利于减小索引文件的大小
mysql> create table 员工信息(工号 int(5),姓名 varchar(10),账号 int(20) not null,密码 int(30) not null,家庭地址 varchar(80),remark text);
Query OK, 0 rows affected (0.07 sec)
mysql> insert into 员工信息 values(1,'王梦瑶','0001','5514','江苏省南京市','内部员工');
Query OK, 1 row affected (0.06 sec)
mysql> insert into 员工信息 values(2,'张梦瑶','0002','5514','江苏省苏州市','第三方员工');
Query OK, 1 row affected (0.05 sec)
mysql> insert into 员工信息 values(3,'陈梦瑶','0003','5515','江苏省扬州州市','派遣员工');
Query OK, 1 row affected (0.00 sec)
mysql> insert into 员工信息 values(4,'孙梦瑶','0004','5516','江苏省常州市','实习员工');
Query OK, 1 row affected (0.05 sec)
mysql> select * from 员工信息;
+--------+-----------+--------+--------+-----------------------+-----------------+
| 工号 | 姓名 | 账号 | 密码 | 家庭地址 | remark |
+--------+-----------+--------+--------+-----------------------+-----------------+
| 1 | 王梦瑶 | 1 | 5514 | 江苏省南京市 | 内部员工 |
| 2 | 张梦瑶 | 2 | 5514 | 江苏省苏州市 | 第三方员工 |
| 3 | 陈梦瑶 | 3 | 5515 | 江苏省扬州州市 | 派遣员工 |
| 4 | 孙梦瑶 | 4 | 5516 | 江苏省常州市 | 实习员工 |
+--------+-----------+--------+--------+-----------------------+-----------------+
4 rows in set (0.00 sec)
mysql> create index 姓名_index on 员工信息(姓名);
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
【指定家庭地址选项里的前8个字符,一个汉字等于2个字符】
mysql> create index 家庭地址_index on 员工信息(家庭地址(8));
Query OK, 0 rows affected (0.07 sec)
Records: 0 Duplicates: 0 Warnings: 0
- 查询索引的方式①
- 查询索引的方式②
- 查询索引的方式③
- 普通索引的创建方式②:修改表方式创建
格式:alter table 表名 add index 索引名(列名);
mysql> alter table 员工信息 add index name_index (姓名);
Query OK, 0 rows affected, 1 warning (0.07 sec)
Records: 0 Duplicates: 0 Warnings: 1
【自动进行排序】
mysql> select 密码 from 员工信息;
+--------+
| 密码 |
+--------+
| 5514 |
| 5514 |
| 5515 |
| 5516 |
+--------+
4 rows in set (0.00 sec)
mysql> show create table 员工信息;
+--------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+--------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 员工信息 | CREATE TABLE "员工信息" (
"工号" int(5) DEFAULT NULL,
"姓名" varchar(10) DEFAULT NULL,
"账号" int(20) NOT NULL,
"密码" int(30) NOT NULL,
"家庭地址" varchar(80) DEFAULT NULL,
"remark" text,
KEY "姓名_index" ("姓名"),
KEY "家庭地址_index" ("家庭地址"(8)),
KEY "name_index" ("姓名")
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+--------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
- 普通索引的创建方式③:创建表的时候指定索引
格式:create table 表名 (字段1 数据类型,字段2 数据类型[,…],index 索引名(列名));
mysql> create table 员工信息2(工号 int(5),姓名 varchar(10),账号 int(20) not null,密码 int(30) not null,家庭地址 varchar(80),remark text,index 密_index(密码));
Query OK, 0 rows affected (0.01 sec)
mysql> show create table 员工信息2;
+---------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+---------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 员工信息2 | CREATE TABLE "员工信息2" (
"工号" int(5) DEFAULT NULL,
"姓名" varchar(10) DEFAULT NULL,
"账号" int(20) NOT NULL,
"密码" int(30) NOT NULL,
"家庭地址" varchar(80) DEFAULT NULL,
"remark" text,
KEY "密_index" ("密码")
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+---------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
1.6.2唯一索引的创建
- 唯一索引与普通索引类似,但区别是唯一索引列的每个值都唯一
- 唯一索引允许有空值,但一张表只能有一个空值(与主键不同之处)
- 如果是用组合索引创建,则列值的组合必须唯一
- 添加唯一键时将自动创建唯一索引
- 唯一索引的创建方式①:直接创建唯一索引
格式:create unique index 索引名 on 表名(列名);
mysql> create table 员工账号2(工号 int(5),姓名 varchar(10),账号 varchar(20) not null,密码 int(30) not null,家庭地址 varchar(80),remark text);
Query OK, 0 rows affected (0.08 sec)
mysql> insert into 员工账号2 values(1,'张梦瑶','0001','5514','江苏省苏州市','第三方员工');
Query OK, 1 row affected (0.00 sec)
mysql> insert into 员工账号2 values(2,'陈梦瑶','0002','5515','江苏省镇江市','内部员工');
Query OK, 1 row affected (0.01 sec)
mysql> insert into 员工账号2 values(3,'王梦瑶','0003','5516','江苏省南京','派遣员工');
Query OK, 1 row affected (0.00 sec)
mysql> insert into 员工账号2 values(4,'赵梦瑶','zmy','5517','江苏省扬州市','派遣员工');
Query OK, 1 row affected (0.01 sec)
mysql> select * from 员工账号2;
+--------+-----------+--------+--------+--------------------+-----------------+
| 工号 | 姓名 | 账号 | 密码 | 家庭地址 | remark |
+--------+-----------+--------+--------+--------------------+-----------------+
| 1 | 张梦瑶 | 0001 | 5514 | 江苏省苏州市 | 第三方员工 |
| 2 | 陈梦瑶 | 0002 | 5515 | 江苏省镇江市 | 内部员工 |
| 3 | 王梦瑶 | 0003 | 5516 | 江苏省南京 | 派遣员工 |
| 4 | 赵梦瑶 | zmy | 5517 | 江苏省扬州市 | 派遣员工 |
+--------+-----------+--------+--------+--------------------+-----------------+
4 rows in set (0.00 sec)
【将员工账号2表里的工号作为唯一索引,并将索引命名为编号】
mysql> create unique index 编号_index on 员工账号2(工号);
Query OK, 0 rows affected (0.06 sec)
Records: 0 Duplicates: 0 Warnings: 0
【查询员工账号2发现工号一行的key列变为唯一索引的UNI】
mysql> desc 员工账号2;
+--------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+-------+
| 工号 | int(5) | YES | UNI | NULL | |
| 姓名 | varchar(10) | YES | | NULL | |
| 账号 | varchar(20) | NO | | NULL | |
| 密码 | int(30) | NO | | NULL | |
| 家庭地址 | varchar(80) | YES | | NULL | |
| remark | text | YES | | NULL | |
+--------------+-------------+------+-----+---------+-------+
6 rows in set (0.00 sec)
- 唯一索引的创建方式②:修改表方式创建唯一索引
格式:alter table 表名 add unique 索引名(列名);
mysql> alter table 员工账号2 add unique 姓名_index(姓名);
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc 员工账号2;
+--------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+-------+
| 工号 | int(5) | YES | UNI | NULL | |
| 姓名 | varchar(10) | YES | UNI | NULL | |
| 账号 | varchar(20) | NO | PRI | NULL | |
| 密码 | int(30) | NO | | NULL | |
| 家庭地址 | varchar(80) | YES | | NULL | |
| remark | text | YES | | NULL | |
+--------------+-------------+------+-----+---------+-------+
6 rows in set (0.00 sec)
- 唯一索引的创建方式三:创建表的时候指定索引
格式:create table 表名 (字段1 数据类型,字段2 数据类型[,…],unique 索引名(列名));
【这里不能使用设置了not null的选项当唯一索引,因为唯一索引允许有空值的存在】
mysql> create table 员工账号223(工号 int(5),姓名 varchar(10),账号 int(20) not null,密码 int(30) not null,家庭地址 varchar(80),remark text,unique 工号_index(工号));
Query OK, 0 rows affected (0.01 sec)
mysql> desc 员工账号223;
+--------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+-------+
| 工号 | int(5) | YES | UNI | NULL | |
| 姓名 | varchar(10) | YES | | NULL | |
| 账号 | int(20) | NO | | NULL | |
| 密码 | int(30) | NO | | NULL | |
| 家庭地址 | varchar(80) | YES | | NULL | |
| remark | text | YES | | NULL | |
+--------------+-------------+------+-----+---------+-------+
6 rows in set (0.00 sec)
1.6.3主键索引的创建
- 主键索引是一种特殊的唯一索引,必须指定为"primary key"
- 一个表只能由一个主键,且不允许有空值
- 添加主键时将自动创建主键索引
- 主键索引的创建方式①:创建表时创建主键索引
格式:create table 表名([…],primary key(列名));
mysql> create table 员工账号10(工号 int(5),姓名 varchar(10),账号 int(20) not null,密码 int(30) not null,家庭地址 varchar(80),remark text,primary key(姓名));
Query OK, 0 rows affected (0.07 sec)
mysql> desc 员工账号10;
+--------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+-------+
| 工号 | int(5) | YES | | NULL | |
| 姓名 | varchar(10) | NO | PRI | NULL | |
| 账号 | int(20) | NO | | NULL | |
| 密码 | int(30) | NO | | NULL | |
| 家庭地址 | varchar(80) | YES | | NULL | |
| remark | text | YES | | NULL | |
+--------------+-------------+------+-----+---------+-------+
6 rows in set (0.01 sec)
- 主键索引的创建方式②:修改表方式创建主键索引
格式:alter table 表名 add primary key(列名);
mysql> alter table 员工账号5 add primary key(账号);
Query OK, 0 rows affected (0.09 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc 员工账号5;
+--------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+-------+
| 工号 | int(5) | YES | | NULL | |
| 姓名 | varchar(10) | YES | | NULL | |
| 账号 | varchar(20) | NO | PRI | NULL | |
| 密码 | int(30) | NO | | NULL | |
| 家庭地址 | varchar(80) | YES | | NULL | |
| remark | text | YES | | NULL | |
+--------------+-------------+------+-----+---------+-------+
6 rows in set (0.00 sec)
1.6.4组合索引的创建(单列索引与多列索引)
- 组合索引可以是单列上创建的索引,也可以是在多列上创建的索引
- 组合索引需要满足最左原则,因为select语句的where条件是依次从左往右执行的,所以在使用select语句查询时where条件使用的字段顺序必须和组合索引中的排序一直,否则索引将不会生效
- 格式:create table 表名(列名1 数据类型,列名2 数据类型,列名3 数据类型,index索引名(列名1,列名2,列名3));
- 查询:select * from 表名 where 列名1=’…’ and 列名2=’…’ and 列名3=’…’;
查询时也需按照创建索引时的从左到右顺序进行查询 - 创建与查询组合索引方式①(create时直接创建组合索引)
mysql> create table 员工账号13(工号 int(10),姓名 char(8),账号 varchar(10),密码 int(10),index 账号_密码_index (账号,密码));
Query OK, 0 rows affected (0.07 sec)
mysql> insert into 员工账号13 values(002,'齐梦瑶','qmy',5514);
Query OK, 1 row affected (0.05 sec)
mysql> insert into 员工账号13 values(003,'陈梦瑶','cmy',5515);
Query OK, 1 row affected (0.05 sec)
mysql> insert into 员工账号13 values(004,'李梦瑶','lmy',5516);
Query OK, 1 row affected (0.05 sec)
mysql> select * from 员工账号13;
+--------+-----------+--------+--------+
| 工号 | 姓名 | 账号 | 密码 |
+--------+-----------+--------+--------+
| 1 | 齐梦瑶 | 101 | 5514 |
| 2 | 齐梦瑶 | qmy | 5514 |
| 3 | 陈梦瑶 | cmy | 5515 |
| 4 | 李梦瑶 | lmy | 5516 |
+--------+-----------+--------+--------+
4 rows in set (0.00 sec)
mysql> select * from 员工账号13 where 账号='cmy' and 密码='5515';
+--------+-----------+--------+--------+
| 工号 | 姓名 | 账号 | 密码 |
+--------+-----------+--------+--------+
| 3 | 陈梦瑶 | cmy | 5515 |
+--------+-----------+--------+--------+
1 row in set (0.05 sec)
- 创建与查询组合索引方式②(先创建表再修改表结构)
mysql> create table 员工账号15(工号 int(10),姓名 char(8),账号 varchar(10),密码 int(10));
Query OK, 0 rows affected (0.07 sec)
mysql> alter table 员工账号15 add index 密码_账号_index(密码,账号);
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> insert into 员工账号15 values(004,'陈梦瑶','cmy',5518);
Query OK, 1 row affected (0.00 sec)
mysql> insert into 员工账号15 values(003,'王梦瑶','wmy',5517);
Query OK, 1 row affected (0.00 sec)
mysql> insert into 员工账号15 values(004,'李梦瑶','lmy',5516);
Query OK, 1 row affected (0.01 sec)
mysql> mysql> select * from 员工账号15;
+--------+-----------+--------+--------+
| 工号 | 姓名 | 账号 | 密码 |
+--------+-----------+--------+--------+
| 4 | 陈梦瑶 | cmy | 5518 |
| 3 | 王梦瑶 | wmy | 5517 |
| 4 | 李梦瑶 | lmy | 5516 |
+--------+-----------+--------+--------+
3 rows in set (0.00 sec)
mysql> show create table 员工账号15;
+----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 员工账号15 | CREATE TABLE "员工账号15" (
"工号" int(10) DEFAULT NULL,
"姓名" char(8) DEFAULT NULL,
"账号" varchar(10) DEFAULT NULL,
"密码" int(10) DEFAULT NULL,
KEY "密码_账号_index" ("密码","账号")
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> select * from 员工账号15 where 账号='wmy' and 密码='5517';
+--------+-----------+--------+--------+
| 工号 | 姓名 | 账号 | 密码 |
+--------+-----------+--------+--------+
| 3 | 王梦瑶 | wmy | 5517 |
+--------+-----------+--------+--------+
1 row in set (0.00 sec)
1.6.5全文索引的创建
- 适合在进行模糊查询的时候使用,例如用在一篇文章中检索文本信息
- MySQL5.6版本以前的fulltext索引仅可用于MyISAM引擎。5.6以后innodb引擎也支持fulltext索引
- 全文索引可以在char、varchar或者text类型的列上创建
- 每个表只允许有一个全文索引
- 创建与查询全文索引方式①:直接创建全文索引
格式:create fulltext index 索引名 on 表名(列名);
mysql> show create table 员工账号11;
+----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 员工账号11 | CREATE TABLE "员工账号11" (
"工号" int(5) DEFAULT NULL,
"姓名" varchar(10) DEFAULT NULL,
"账号" varchar(20) NOT NULL,
"密码" int(30) NOT NULL,
"家庭地址" varchar(80) DEFAULT NULL,
"remark" text
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> create fulltext index 姓名 on 员工账号11(姓名);
Query OK, 0 rows affected, 1 warning (0.26 sec)
Records: 0 Duplicates: 0 Warnings: 1
mysql> show create table 员工账号11;
+----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 员工账号11 | CREATE TABLE "员工账号11" (
"工号" int(5) DEFAULT NULL,
"姓名" varchar(10) DEFAULT NULL,
"账号" varchar(20) NOT NULL,
"密码" int(30) NOT NULL,
"家庭地址" varchar(80) DEFAULT NULL,
"remark" text,
FULLTEXT KEY "姓名" ("姓名")
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
- 创建与查询全文索引方式②:修改表方式创建全文索引
格式:alter table 表名 add fulltext 索引名(列名);
mysql> show create table 员工账号12;
+----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 员工账号12 | CREATE TABLE "员工账号12" (
"工号" int(5) DEFAULT NULL,
"姓名" varchar(10) DEFAULT NULL,
"账号" varchar(20) NOT NULL,
"密码" int(30) NOT NULL,
"家庭地址" varchar(80) DEFAULT NULL,
"remark" text
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> alter table 员工账号12 add fulltext name_index(姓名);
Query OK, 0 rows affected, 1 warning (0.31 sec)
Records: 0 Duplicates: 0 Warnings: 1
mysql> show create table 员工账号12;
+----------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+----------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 员工账号12 | CREATE TABLE "员工账号12" (
"工号" int(5) DEFAULT NULL,
"姓名" varchar(10) DEFAULT NULL,
"账号" varchar(20) NOT NULL,
"密码" int(30) NOT NULL,
"家庭地址" varchar(80) DEFAULT NULL,
"remark" text,
FULLTEXT KEY "name_index" ("姓名")
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+----------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
- 创建与查询全文索引方式③:创建表的时候指定全文索引
格式:create table 表名(字段1 数据类型[,…],fulltext 索引名(列名));
数据类型可以为char、varchar或者text
mysql> create table 员工账号1212(name varchar(10)not null,ago int(3)not null,fulltext 姓名_index(name));
Query OK, 0 rows affected (0.17 sec)
mysql> show create table 员工账号1212;
+------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 员工账号1212 | CREATE TABLE "员工账号1212" (
"name" varchar(10) NOT NULL,
"ago" int(3) NOT NULL,
FULLTEXT KEY "姓名_index" ("name")
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
1.6.6使用全文索引查询
- 格式: select * from 表名 where match(列名) against(‘查询内容’);
mysql> select * from 员工账号11 where match(姓名) against('王梦钥');
+--------+---------------------+--------+--------+-----------------+--------------+
| 工号 | 姓名 | 账号 | 密码 | 家庭地址 | remark |
+--------+---------------------+--------+--------+-----------------+--------------+
| 3 | 王梦瑶,王梦钥 | 0003 | 5516 | 江苏省南京 | 派遣员工 |
+--------+---------------------+--------+--------+-----------------+--------------+
1 row in set (0.00 sec)
mysql> select * from 员工账号11;
+--------+---------------------+--------+--------+--------------------+-----------------+
| 工号 | 姓名 | 账号 | 密码 | 家庭地址 | remark |
+--------+---------------------+--------+--------+--------------------+-----------------+
| 1 | 张梦瑶 | 0001 | 5514 | 江苏省苏州市 | 第三方员工 |
| 2 | 陈梦瑶 | 0002 | 5515 | 江苏省镇江市 | 内部员工 |
| 3 | 王梦瑶,王梦钥 | 0003 | 5516 | 江苏省南京 | 派遣员工 |
| 4 | 赵梦瑶 | zmy | 5517 | 江苏省扬州市 | 派遣员工 |
+--------+---------------------+--------+--------+--------------------+-----------------+
4 rows in set (0.00 sec)
1.7查看索引
1.8数据表内各字段的含义
字段 | 含义 |
---|---|
Table | 表名 |
Non_unique | 如果索引不能包括重复词,则为0 如果可以,则为1 |
Seq_in_index | 索引中的列序号,从 1 开始 |
Column_name | 列名称 |
Collation | 列以什么方式存储在索引中 在 MySQL 中,有值‘A’(升序)或 NULL(无分类) |
Cardinality | 索引中唯一值数目的估计值 |
Sub_part | 如果列只是被部分的编入索引,则为被编入索引的字符的数目 如果整列被编入索引,则为 NULL。 |
Packed | 指示关键字如何被压缩 如果没有被压缩,则为 NULL |
Null | 如果列含有 NULL,则含有 YES 如果没有,则该列含有 NO。 |
Index_type | 用过的索引方法(BTREE, FULLTEXT, HASH, RTREE) |
Comment | 备注 |
1.9删除索引
- ①.直接删除索引
- 格式:drop index 索引名 on 表名;
mysql> show create table 员工信息2;
+---------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+---------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 员工信息2 | CREATE TABLE "员工信息2" (
"工号" int(5) DEFAULT NULL,
"姓名" varchar(10) DEFAULT NULL,
"账号" int(20) NOT NULL,
"密码" int(30) NOT NULL,
"家庭地址" varchar(80) DEFAULT NULL,
"remark" text,
KEY "密_index" ("密码")
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+---------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> drop index 密_index on 员工信息2;
Query OK, 0 rows affected (0.05 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> show create table 员工信息2;
+---------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+---------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 员工信息2 | CREATE TABLE "员工信息2" (
"工号" int(5) DEFAULT NULL,
"姓名" varchar(10) DEFAULT NULL,
"账号" int(20) NOT NULL,
"密码" int(30) NOT NULL,
"家庭地址" varchar(80) DEFAULT NULL,
"remark" text
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+---------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
- ②.修改表方式删除索引
- 格式:alter table 表名 drop index 索引名;
mysql> show create table 员工信息;
+--------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+--------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 员工信息 | CREATE TABLE "员工信息" (
"工号" int(5) DEFAULT NULL,
"姓名" varchar(10) DEFAULT NULL,
"账号" int(20) NOT NULL,
"密码" int(30) NOT NULL,
"家庭地址" varchar(80) DEFAULT NULL,
"remark" text,
KEY "姓名_index" ("姓名"),
KEY "家庭地址_index" ("家庭地址"(8)),
KEY "name_index" ("姓名")
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+--------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> alter table 员工信息 drop index 家庭地址_index;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> show create table 员工信息;
+--------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+--------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 员工信息 | CREATE TABLE "员工信息" (
"工号" int(5) DEFAULT NULL,
"姓名" varchar(10) DEFAULT NULL,
"账号" int(20) NOT NULL,
"密码" int(30) NOT NULL,
"家庭地址" varchar(80) DEFAULT NULL,
"remark" text,
KEY "姓名_index" ("姓名"),
KEY "name_index" ("姓名")
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+--------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
- ③.删除主键索引
- 格式:alter table 表名 drop primary key;
mysql> show create table 员工账号10;
+----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 员工账号10 | CREATE TABLE "员工账号10" (
"工号" int(5) DEFAULT NULL,
"姓名" varchar(10) NOT NULL,
"账号" int(20) NOT NULL,
"密码" int(30) NOT NULL,
"家庭地址" varchar(80) DEFAULT NULL,
"remark" text,
PRIMARY KEY ("姓名")
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> alter table 员工账号10 drop primary key;
Query OK, 0 rows affected (0.09 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> show create table 员工账号10;
+----------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+----------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 员工账号10 | CREATE TABLE "员工账号10" (
"工号" int(5) DEFAULT NULL,
"姓名" varchar(10) NOT NULL,
"账号" int(20) NOT NULL,
"密码" int(30) NOT NULL,
"家庭地址" varchar(80) DEFAULT NULL,
"remark" text
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+----------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
二、事务
2.1事务的概念
- 事务是一种机制、一个操作序列,包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销(回滚)操作请求。即,这一组数据库命令要么都执行,要么都不执行
- 事务是一个不可分割的工作逻辑单元,在数据库系统上执行并发操作时,事务是最小的控制单元
- 事务适用于多用户同时操作的数据库系统场景。例如银行、保险以及证券交易系统等等
- 可以通过事务的整体性以保证数据的一致性
2.2事务的四大特性(ACID)
2.2.1原子性(Atomicity)
- 事务是一个完整的操作,事务的各元素是不可分的
- 事务中的所有元素必须作为一个整体提交或回滚
- 如果事务中的任何元素失败,则整个事务将失败
2.2.2一致性(Consistency)
- 当事务完成时,数据必须处于一致状态
- 在事务开始前,数据库中存储的数据处于一致的状态
- 当事务正在进行时,数据可能处于不一致的状态
- 当事务成功完成时,数据必须再次回到已知的一致状态
2.2.3隔离性(Iolation)
- 对数据进行修改的所有并发事务是彼此隔离的,表名事务必须是独立的,不应该以任何方式依赖于或者影响其他事务(直接干预)
- 修改数据的事务可在另一个使用相同数据的事务开始之前访问这些数据,或者在另一个使用相同数据的事务结束之后访问这些数据
2.2.4持久性(Durability)
- 持久性指的是不管系统是否发生故障,事务处理的结果都是永久的
- 一旦事务被提交,事务的效果会被永久地保留在数据库中
2.3事务之间相互间接影响的四种状态(脏读、不可重复读、幻读、丢失更新)
- 脏读:指一个事务读取了另一个事务未提交的数据,而这个数据是有可能回滚的
- 不可重复读:当一个事务内进行了两个相同的查询却返回了不同数据,这是由于查询系统中其他事务修改的提交而引起的
- 幻读:一个事务A对一个表中的数据进行了修改,但这种修改涉及到了表中的全部数据行。同时,另一个事务B也修改了这个表中的数据,这种修改是向表中插入一行新数据。那么,操作操作事务A的用户会发现表中还有没有修改的数据行,就类似发生了幻觉一样
- 丢失更新:两个事务同时读取同一条记录,A先修改记录,B也修改记录,但是B不知道A修改过,那么B提交数据后B的修改结果将会覆盖A的修改结果
2.4事务的四大隔离(RU、RC、RR、S)
- read uncommitted(RU)
- 读取尚未提交的数据 :不解决脏读
- read committed(RC)
- 读取已经提交的数据 :可以解决脏读
- repeatable read(RR)
- 重复读取:可以解决脏读和不可重复读 。也是mysql默认的
- serializable
- 串行化:可以解决脏读不可重复读和虚读。相当于锁表
- mysql默认的事务处理级别是 repeatable read ,而Oracle和SQL Server是 read committed
2.4.1查询全局事务隔离级别
- 方式一:show global variables like ‘%isolation%’;
- 方式二:SELECT @@global.tx_isolation;
【可以看出mysql默认的事务处理级别为repeatable read】
mysql> SELECT @@global.tx_isolation;
+-----------------------+
| @@global.tx_isolation |
+-----------------------+
| REPEATABLE-READ |
+-----------------------+
1 row in set, 1 warning (0.00 sec)
mysql> show global variables like '%isolation%';
+-----------------------+-----------------+
| Variable_name | Value |
+-----------------------+-----------------+
| transaction_isolation | REPEATABLE-READ |
| tx_isolation | REPEATABLE-READ |
+-----------------------+-----------------+
2 rows in set (0.00 sec)
2.4.2查询会话事务隔离级别
- 方式一:show session variables like ‘%isolation%’;
- 方式二:SELECT @@session.tx_isolation;
- 方式三:SELECT @@tx_isolation;
mysql> show session variables like '%isolation%';
+-----------------------+-----------------+
| Variable_name | Value |
+-----------------------+-----------------+
| transaction_isolation | REPEATABLE-READ |
| tx_isolation | REPEATABLE-READ |
+-----------------------+-----------------+
2 rows in set (0.00 sec)
mysql> SELECT @@session.tx_isolation;
+------------------------+
| @@session.tx_isolation |
+------------------------+
| REPEATABLE-READ |
+------------------------+
1 row in set, 1 warning (0.00 sec)
mysql> SELECT @@tx_isolation;
+-----------------+
| @@tx_isolation |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set, 1 warning (0.00 sec)
2.4.3设置全局事务隔离级别
- 方式:set global transaction isolation level read committed;
mysql> show global variables like '%isolation%';
+-----------------------+----------------+
| Variable_name | Value |
+-----------------------+----------------+
| transaction_isolation | READ-COMMITTED |
| tx_isolation | READ-COMMITTED |
+-----------------------+----------------+
2 rows in set (0.00 sec)
mysql> set global transaction isolation level read uncommitted;
Query OK, 0 rows affected (0.00 sec)
mysql> show global variables like '%isolation%';
+-----------------------+------------------+
| Variable_name | Value |
+-----------------------+------------------+
| transaction_isolation | READ-UNCOMMITTED |
| tx_isolation | READ-UNCOMMITTED |
+-----------------------+------------------+
2 rows in set (0.01 sec)
2.4.4设置会话事务隔离级别
- 方式:set session transaction isolation level read committed;
mysql> SELECT @@tx_isolation;
+-----------------+
| @@tx_isolation |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set, 1 warning (0.00 sec)
mysql> set session transaction isolation level read committed;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT @@tx_isolation;
+----------------+
| @@tx_isolation |
+----------------+
| READ-COMMITTED |
+----------------+
1 row in set, 1 warning (0.00 sec)
2.5事务控制语句
2.5.1概述及说明
- MySQL事务默认是自动提交的,当SQL语句提交时事务就会自动提交
- 日常使用sql语句进行操作之所以可以执行成功,是因为mysql实现了自动提交、执行操作。
但是我们可以关闭自动提交功能。关闭后就只能手动提交,但在我们手动提交前,我们做的修改是在内存中修改的,并不会提交到磁盘,一旦提交到磁盘,那就说明对数据库中的数据进行了修改
MySQL会把我们修改的对象(表)提交一份副本到内存中,方便我们进行修改,修改完之后执行“提交”,就可以直接修改实际数据了
控制语句 | 说明 |
---|---|
BEGIN START TRANSACTION set autocommit=0(禁止自动提交) | 开启一个事务 |
COMMIT COMMIT WORK | 提交事务,并将已对数据库进行的所有修改变为永久性的。 只有执行了COMMIT之后,才会出发I/O流进行写入。 |
ROLLBACK ROLLBACK WORK | 回滚会结束用户的事务,并撤销正在进行的所有未提交的修改。 |
SAVEPOINT S0 | 使用 SAVEPOINT 允许在事务中创建一个回滚点 一个事务中可以有多个SAVEPOINT “S0”代表回滚点名称。 |
ROLLBACK TO [SAVEPOINT] S0 | 将事务回滚到标记点。 |
2.5.2开启、提交事务
2.5.3事务回滚
2.5.4多点回滚
2.5.5使用set设置控制事务
三、存储引擎
- MySQL存储引擎定义
- MySQL中的数据用各种不同的技术存储在文件中,每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力,这些不同的技术以及配套的功能在MySQL中称为存储引擎
- 存储引擎是MySQL将数据存储在文件系统中的存储方式或者存储格式
- MySQL数据库中的组件负责执行实际的数据I/O操作
- MySQL系统中,存储引擎处于文件系统之上,在数据保存到数据文件之前会传输到存储引擎,之后按照各个存储引擎的存储格式进行存储
3.1MyISAM
3.1.1MyISAM概述
- MyISAM与InnoDB是MySQL常用的存储引擎
- MyISAM存储引擎是MySQL关系数据库系统5.5版本之前默认的存储引擎,其前身是ISAM
- ISAM是一个定义明确且经历时间考验的数据表格管理方法,在设计之时就考虑到数据库被查询的次数要远大于更新的次数
- MyISAM管理非事务表,是ISAM的扩展格式
- MylSAM提供ISAM里所没有的索引和字段管理的大量功能
- MyISAM使用一种表格锁定的机制,以优化多个并发的读写操作
- MyISAM提供高速存储和检索,以及全文搜索能力,受到Web开发的青睐
3.1.2 ISAN特点
- ISAM执行读取操作的速度很快
- ISAM不支持事物处理
- ISAM不占用大量的内存和存储资源
- ISAM不能容错
- 使用create table创建时,默认使用的是MyISAM存储引擎
3.1.3 MyISAM特点
- MyISAM不支持事务,也不支持外键
- MyISAM访问速度快
- MyISAM对事务完整性没有要求
- MyISAM在磁盘上存储三个文件
- .frm文件存储表定义
- 数据文件的扩展名为.MYD(MYData)
- 索引文件的扩展是.MYI(MYIndex)
- 采用MyISAM存储引擎数据单独写入或读取,速度过程比较快且占用资源相对较少
- 文件保存位置
3.1.4 MyISAM使用的部分生产场景
- 公司业务不需要事务的支持
- 单方面读取或写入数据比较多的业务
- 服务器硬件资源相对比较差
- 对数据业务一致性要求不是非常高的业务
- 数据修改相对较少的业务
- 使用读写并发访问相对较低的业务
- MyISAM存储引擎数据读写都比较频繁的场景不适合
3.1.5 MyISAM支持的存储格式
- 静态表
- 静态表时默认的存储格式,表中字段都是固定字段,这样每个记录都是固定长度
- 优点是存储非常迅速,容易缓存,出现故障容易恢复
- 缺点是占用的空间通常比动态表多
- 动态表
- 动态表包含可变字段,记录不是固定长度
- 优点是占用空间较少,但是频繁的更新、删除记录会产生碎片
- 需要定期执行optimize table语句或myisamchk -r命令来改善性能,并且出现故障的时候恢复相对比较困难
- 压缩表
- 压缩表由myisamchk工具创建,占据非常小的空间,因为每条记录都是被单独压缩的,所以只会产生非常小的访问负载
3.2 Innodb
3.2.1 Innodb特点
- 支持事务:支持4个事务隔离级别
- 行级锁定,但是全表扫描仍然会是表级锁定
- 读写阻塞与事务隔离级别相关
- 具有非常高效的缓存属性:能缓存索引,也能缓存数据
- 表与主键以簇的方式存储
- 支持分区、表空间,类似oracle数据库
- 支持外键约束,5.5以前不支持全文索引,5.5以后的版本支持全文索引
- 对硬件资源要求比较高
- Innodb 在磁盘上存储成三个文件
- db.opt(表属性文件)
- 表名.frm(表结构文件)
- 表名.ibd(表数据元数据)
3.2.2 innodb和myisam区别
- myisam会保存行数, innodb不保存表的行数
例如select count(*) from table;时innodb需要扫描一遍整个表来计算有多少行,但是myisam只要简单的独处保存好的行数即可。
但是当count(*)语句包含where条件时myisam也需要扫描整个表来获取行数 - 对于自增长字段:innodb中必须包含只有该字段的索引,myisam表中可以和其他字段一起建立组合索引
- 清空整个表时,innod是一行行删除,效率非常慢,myisam则会重建表
3.3 操作
3.3.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.00 sec)
3.3.2 查看指定表使用的存储引擎(共两种)
- 方式一
mysql> show table status from qz where name='员工账号9'\G
*************************** 1. row ***************************
Name: 员工账号9
Engine: InnoDB
Version: 10
Row_format: Dynamic
Rows: 4
Avg_row_length: 4096
Data_length: 16384
Max_data_length: 0
Index_length: 0
Data_free: 0
Auto_increment: NULL
Create_time: 2021-04-13 00:23:06
Update_time: NULL
Check_time: NULL
Collation: utf8_general_ci
Checksum: NULL
Create_options:
Comment:
1 row in set (0.00 sec)
- 方式二
mysql> show create table qz.员工信息;
+--------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+--------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 员工信息 | CREATE TABLE "员工信息" (
"工号" int(5) DEFAULT NULL,
"姓名" varchar(10) DEFAULT NULL,
"账号" int(20) NOT NULL,
"密码" int(30) NOT NULL,
"家庭地址" varchar(80) DEFAULT NULL,
"remark" text,
KEY "姓名_index" ("姓名"),
KEY "name_index" ("姓名")
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+--------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
3.3.3 修改存储引擎(共三种)
- 方式一(alter)
【修改前查询存储引擎ENGINE=InnoDB】
mysql> show create table qz.员工信息;
+--------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+--------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 员工信息 | CREATE TABLE "员工信息" (
"工号" int(5) DEFAULT NULL,
"姓名" varchar(10) DEFAULT NULL,
"账号" int(20) NOT NULL,
"密码" int(30) NOT NULL,
"家庭地址" varchar(80) DEFAULT NULL,
"remark" text,
KEY "姓名_index" ("姓名"),
KEY "name_index" ("姓名")
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+--------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
【修改员工信息表的存储引擎为myisam】
mysql> alter table 员工信息 engine=myisam;
Query OK, 5 rows affected (0.08 sec)
Records: 5 Duplicates: 0 Warnings: 0
【修改后查询存储引擎ENGINE=MyISAM】
mysql> show create table qz.员工信息;
+--------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+--------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 员工信息 | CREATE TABLE "员工信息" (
"工号" int(5) DEFAULT NULL,
"姓名" varchar(10) DEFAULT NULL,
"账号" int(20) NOT NULL,
"密码" int(30) NOT NULL,
"家庭地址" varchar(80) DEFAULT NULL,
"remark" text,
KEY "姓名_index" ("姓名"),
KEY "name_index" ("姓名")
) ENGINE=MyISAM DEFAULT CHARSET=utf8 |
+--------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
- 方式二(配置文件)
- 此方只能够对修改配置文件并重启mysql服务之后创建的表有效,已经存在的表不会更改存储引擎
[root@localhost ~]# vim /etc/my.cnf
23 default-storage-engine=myisam
[root@localhost ~]# systemctl restart mysqld.service
mysql> show create table qz.员工信息;
+--------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+--------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 员工信息 | CREATE TABLE "员工信息" (
"工号" int(8) NOT NULL,
"姓名" varchar(10) NOT NULL,
"性别" varchar(4) NOT NULL,
"家庭住址" varchar(50) NOT NULL,
"手机号码" int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 |
+--------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
- 方式三(create)
mysql> create table 员工信息1 (工号 int(8)not null,姓名 varchar(10) not null,性别 varchar(4) not null,家庭住址 varchar(50) not null,手机号码 int(11)) engine=innodb;
Query OK, 0 rows affected (0.03 sec)
mysql> show create table 员工信息1;
+---------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+---------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 员工信息1 | CREATE TABLE "员工信息1" (
"工号" int(8) NOT NULL,
"姓名" varchar(10) NOT NULL,
"性别" varchar(4) NOT NULL,
"家庭住址" varchar(50) NOT NULL,
"手机号码" int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+---------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
四、总结
4.1 myisam引擎和innodb引擎的区别
myisam | innodb |
---|---|
不支持事务 | 支持事务(4个级别) |
表级锁定 | 行级锁定 |
读取速度快 | 读取速度一般 |
服务器资源开销小 | 服务器资源开销大 |
数据难恢复 | 数据易恢复 |
支持全文索引 | 不支持全文索引 |
不支持外键约束 | 支持外键约束 |
只对索引缓存 不对数据缓存 | 可以高效的缓存索引和数据 |
会保存行数 | 不保存表的行数 |