一:索引介绍
1.1:索引概念
简单的来说,数据库中的索引与书籍中的目录类似
- 在一本书中,无须阅读整本书,利用目录就可以快速査找所需信息
- 书中的目录是一个词语列表,其中注明了包含各个词的页码
数据库索引
- 是一个排序的列表,存储着索引值和这个值所对应的物理地址
- 无须对整个表进行扫描,通过物理地址就可以找到所需数据
- 是表中一列或者若干列值排序的方法
- 需要额外的磁盘空间
1.2:索引的作用
- 设置了合适的索引之后,数据库利用各种快速的定位技术,能够大大加快查询速率
- 特别是当表很大时,或者查询涉及到多个表时,使用索引可使查询加快成干倍
- 可以降低数据库的IO成本,并且索引还可以降低数据库的排序成本
- 通过创建唯一性索引保证数据表数据的唯一性
- 可以加快表与表之间的连接
- 在使用分组和排序时,可大大减少分组和排序时间
1.3:索引的优缺点
- 优点
- 可以快速的找到所需要的的资源
- 缺点
- 占用空间
1.4:索引的分类
-
普通索引
-
这是最基本的索引类型,而且它没有唯一性之类的限制
-
创建不同索引的方式
-
create index index_name on table table_name(column(length)); '直接创建,length是可选项'
例如:mysql> create index id_index on info(id);
alter table table_name add index index_name(column(length)); '修改表当时创建'
例如:alter table info add index name_index (name);
create table 'table' (id int(3) not null auto_increment,name varchar(10) not null,score decimal(5,2),address varchar(50) default '未知',primary key ('id'),index index_name (id(length)))
例如:mysql> create table info (id int(3) not null auto_increment,name char(10) not null,score decimal(5,2),address varchar(50) default '未知',primary key (id),index name_index (name)); '创建表时创建'
Query OK, 0 rows affected (0.01 sec)
-
唯一性索引
-
这种索引和前面的“普通索引”基本相同,但有一个区别:索引列的所有值都只能出现一次,即必须唯一
-
创建唯一索引的方式
-
create unique index index_name on table_name(column(length));
alter table table_name add unqiue index_name(column(length));
create table 'table' (id int(3) not null auto_increment,name varchar(10) not null,score decimal(5,2),address varchar(50) default '未知',primary key ('id'),unique index index_name (id(length)))
例如:mysql> create table infos (id int(3) not null auto_increment,name char(10) not null,score decimaal(5,2),address varchar(50) default '未知',primary key (id),unique index name_index (name));
Query OK, 0 rows affected (0.02 sec)
-
主键索引
-
主键是一种唯一性索引,但它必须指定为" primary key"
-
一个表只能有一个主键,不允许有空值
-
创建主键索引的方式
-
create table tablename([...],primary key(列的列表));
alter table tablename add primary key(列的列表);
create table 'table_name' (id int(11) not null auto_increment,name char(10) not null,primary key (id));
-
全文索引
- MySQL从32323版开始支持全文索引和全文检索。在 MySQL中全文索引的索引类型为 FULLTEXT,全文索引可以在CHAR、VARCHAR或者TEXT类型的列上创建
create fulltext index <索引的名字> on tablename(列的列表);
例如:mysql> create fulltext index full_index_name on info(name);
alter table info add fulltext index addr_index(address);'不能加数值的'
-
单列索引与多列索引
-
索引可以是单列上创建的索引,也可以是在多列上创建的索引
-
最左原则,从左往右依次执行
-
创建组合索引的方式
-
create table user(name varchar(9),age int(3),sex tinyint(1),INDEX user(name,age,sex));
1.5:创建索引的原则依据
- 表的主键、外键必须有索引
- 数据量超过300行的表应该有索引
- 经常与其他表进行连接的表,在连接字段上应该建立索引
- 唯一性太差的字段不适合建立索引
- 更新太频繁地字段不适合创建索引
- 经常出现在 Where子句中的字段,特别是大表的字段,应该建立索引
- 索引应该建在选择性高的字段上
- 索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引
1.6:外键与候选键
外键:主表中的外键是令一张表的主键
候选键:除了主键之外都是候选键
1.7:查看索引
语法:
show index from tablename;
show keys from tablename;
例如:
mysql> show index from info\G;
mysql> show keys from info\G; '\G代替分号表示垂直显示结果'
1.8:删除索引
语法:
drop index index_name on table_name;
例如:mysql> drop index name_index on info;
alter table table_name drop index index_name;
例如:mysql> alter table infos drop index name_index
1.9:表的文件分类
- 表的结构文件
- 表的数据文件
- 表的索引文件
- myisam不支持事务,但经常被访,被读取性能较好
1.10:创建表和索引的结构分析
create table info (id int not null primary key auto_increment,name char(10) not null,score decimal(5,2);
'decimal:浮点型,小数点,例如:decimal(5,2)表示五个有效数字,两个小数,例如:100.00'
'int不填写具体指,默认为11个字符'
'插入数据时,不写列的时候,默认是从第一个列开始匹配'
二:事务
2.1:概念
- 事务是一种机制、一个操作序列,包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行,要么都不执行
- 事务是一个不可分割的工作逻辑单元,在数据库系统上执行并发操作时,事务是最小的控制单元
- 适用于多用户同时操作的数据库系统的场景,如银行、保险公司及证券交易系统等等
- 通过事务的整体性以保证数据的一致性
- 如果事务成功了一部分,一部分未成功,则执行回滚,回到事务的起点,重新开始操作
2.2:数据库设计三大范式
2.2.1:第一范式(确保每列保持原子性)
第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值。
2.2.2:第二范式(确保表中的每列都和主键相关)
第二范式在第一范式的基础之上更进一层。第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。
2.2.3:第三范式(确保每列都和主键列直接相关,而不是间接相关)
第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。
2.3:事务的ACID特点
2.3.1:原子性(Atomicity)
- 事务是一个完整的操作,事务的各元素是不可分的(原子的)
- 事务中的所有元素必须作为一个整体提交或回滚
- 如果事务中的任何元素失败,则整个事务将失败
2.3.2:一致性(Consistency)
- 当事务完成时,数据必须处于一致状态!
- 在事务开始之前,数据库中存储的数据处于一致状态;
- 在正在进行的事务中,数据可能处于不一致的状态;
- 当事务成功完成时,数据必须再次回到已知的一致状态
2.3.3:隔离性(Isolation)
- 对数据进行修改的所有并发事务是彼此隔离的,这表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务
- 修改数据的事务可以在另一个使用相同数据的事务开始之前访问这些数据,或者在另一个使用相同数据的事务结束之后访问这些数据
2.3.4:持久性(Durability)
- 事务持久性指不管系统是否发生故障,事务处理的结果都是永久的
- 一旦事务被提交,事务的效果会被永久地保留在数据库中
2.4:事务控制
- 默认情况下 MySQL的事务是自动提交的,当sql语句提交时事务便自动提交
2.4.1:事务控制语句
begin或start transaction '一个事务开始'
commit '提交一个事务'
rollback '回滚一个事务'
savepoint identifier '存档点'
release savepoint identifier '删除存档点'
rollback to identifier '回滚到identifier存档点'
set transaction '设置事务'
2.4.2:控制事务的方法有哪些?
- 手动对事务进行控制的方法
- 事务处理命令控制
- 使用set设置事务处理方式
2.4.3:控制事务的命令有哪些?
- 使用事务处理命令控制事务
- bein:开始一个事务
- commit:提交一个事务
- rollback:回滚一个事务
- 使用set命令进行控制
- set autocommit=0:禁止自动提交
- set autocommit=1:开启自动提交
2.4.4:事务处理命令控制事务
mysql> use school; '进入库'
Database changed
mysql> create table kfc_test (id int(5))engine=innodb; '创建数据表'
Query OK, 0 rows affected (0.00 sec)
mysql> select * from kfc_test; '查看表数据'
Empty set (0.00 sec)
mysql> begin; '开始事务'
Query OK, 0 rows affected (0.00 sec)
mysql> insert into kfc_test value(1); '插入数据'
Query OK, 1 row affected (0.00 sec)
mysql> insert into kfc_test value(2);
Query OK, 1 row affected (0.00 sec)
mysql> commit; '提交事务'
Query OK, 0 rows affected (0.00 sec)
mysql> select * from kfc_test;
+------+
| id |
+------+
| 1 |
| 2 |
+------+
2 rows in set (0.00 sec)
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into kfc_test value(3);
Query OK, 1 row affected (0.00 sec)
mysql> rollback; '回滚'
Query OK, 0 rows affected (0.00 sec)
mysql> select * from kfc_test; '因为回滚所以数据没有插入'
+------+
| id |
+------+
| 1 |
| 2 |
+------+
2 rows in set (0.00 sec)
三:视图和存储过程
3.1:什么是视图?
- 视图是一张虚拟的表,数据不存在视图中,视图是真实表的映射数据。例如:水中捞月是典型的视图
- 利用条件筛选,分组,排序等产生出一个结果集(结果集保存在内存中),并且做成持久化保存(保存映射)
- 视图占用资源小,真实表中数据产生变化,会影响到视图。
3.2:创建和查询视图命令
'创建视图'
create view <视图名称>
create view info_view as select id,name,age from info 条件
'多表相连的条件是on'
'单表相连的条件是where'
'查询视图'
select * from info_view;
select name,age from info_view;
- 查询多表相连
select info.id,info.name,info.age,info,score,info.addr,hob.hobname from info inner join hob on info.hobby=hob.id; '//从info表和hob表中选择info.id,info.name,info.age,info,score,info.addr,hob.hobname且info表中的hobby=hob表中的id'
'inner join:内部相连'
- 创建多表相连查询视图
create view info_hob_view as select info.id,info.name,info.age,info,score,info.addr,hob.hobname from info inner join hob on info.hobby=hob.id; '//将刚刚的多表相连查询创建名为info_hob_view的视图'
select * from info_hob_view; '查看视图'
3.3:视图特点
- 安全性高
- 简化sql操作
- 可以针对不同用户创建不同的视图(不同权限的用户浏览不同的信息)
3.4:存储过程
3.4.1:什么是存储过程?
-
存储过程:多用于软件开发方向,
防止代码在网络传输过程中被截获,做了安全性保障。
-
原始状态:在代码过程中:需要嵌入sql语句,通过连接驱动把sql语句作为参数,传递给MySQL(数据库)进行执行,此时就会有安全风险。
-
通过存储过程解决安全隐患
存储过程是写在数据库中,并不是程序中。
程序是通过调用存储过程名称去触发sql操作。(类似调用函数)
3.4.2:存储过程有什么优点?
- 存储过程优点:代码量优化,传输安全,网络资源优化
四:存储引擎
4.1:存储引擎
- MySQL中的数据用各种不同的技术存储在文件中,每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力,这些不同的技术以及配套的功能在 MySQL中称为存储引擎
- 存储引擎就是 MySQL将数据存储在文件系统中的存储方式或者存储格式
- 目前 MySQL常用的两种存储引擎
- MyISAM
- InnoDB
- MySQL存储引擎是 MySQL数据库服务器中的组件,负责为数据库执行实际的数据I/O操作
- 使用特殊存储引擎的主要优点之一在于:
- 仅需提供特殊应用所需的特性
- 数据库中的系统开销较小
- 具有更有效和更高的数据库性能
- MySQL系统中,存储引擎处于文件系统之上,在数据保存到数据文件之前会传输到存储引擎,之后按照各个存储引擎的存储格式进行存储
4.2:MyISAM的介绍
4.2.1:MyISAM概念
- MyISAM存储引擎是 MySQL关系数据库系统5.5版本之前默认的存储引擎,前身是ISAM
- ISAM是一个定义明确且历经时间考验的数据表格管理方法,在设计之时就考虑到数据库被查询的次数要远大于更新的次数
- ISAM的特点
- 优点:ISAM执行读取操作的速度很快
- 优点:不占用大量的内存和存储资源
- 缺点:不支持事务处理
- 缺点:不能够容错
- MyISAM管理非事务表,是lSAM的扩展格式
- 提供ISAM里所没有的索引和字段管理的大量功能
- MyISAM使用一种表格锁定的机制,以优化多个并发的读写操作
- MyISAM提供高速存储和检索,以及全文搜索能力,受到web开发的青睐
4.2.2:MyISAM
- 不支持事务,也不支持外键
- 访问速度快
- 对事务完整性没有要求
- 表级锁定形式,数据在更新时锁定整个表
- 数据库在读写过程中相互阻塞
- 会在数据写入的过程阻塞用户数据的读取
- 也会在数据读取的过程中阻塞用户的数据写入
- 可通过key_buffer_size来设置缓存索引,提高访问性能,减少磁盘I/O的压力
- 但缓存只会缓存索引文件,不会缓存数据
- 釆用 MyISAM存储引擎数据单独写入或读取,速度过程较快且占用资源相对少
- MyISAM存储引擎它不支持外键约束,只支持全文索引
- 每个MyISAM在磁盘上存储成三个文件,每一个文件的名字以表的名字开始,扩展名指出文件类型
- MyISAM在磁盘上存储成三个文件
- .frm文件存储表定义
- 数据文件的扩展名为.MYD( MYData)
- 索引文件的扩展名是.MYI( MYIndex)
- MyLAM支持的存储格式
静态表,动态表,压缩表
4.2.3:MyISAM适用的生产场景
- 公司业务不需要事务的支持
- 一般单方面读取数据比较多的业务,或单方面写入数据比较多的业务
- MyISAM存储引擎数据读写都比较频繁场景不适合
- 使用读写并发访问相对较低的业务
- 数据修改相对较少的业务
- 对数据业务一致性要求不是非常高的业务
- 服务器硬件资源相对比较差
4.3:InnoDB
4.3.1:InnoDB有什么特点?
- 支持事务:支持4个事务隔离级别
- 行级锁定,但是全表扫描仍然会是表级锁定
- 读写阻塞与事务隔离级别相关
- 具有非常高效的缓存特性:能缓存索引,也能缓存数据
- 表与主键以簇的方式存储
- 支持分区、表空间,类似 oracle数据库
- 支持外键约束,5.5以前不支持全文索引,5.5版本以后支持全文索引
- 对硬件资源要求还是比较高的场合
4.3.2:InnoDB适用生产场景
- 业务需要事务的支持
- 行级锁定对高并发有很好的适应能力,但需确保查询是通过索引来完成
- 业务数据更新较为频繁的场景,如:论坛,微博等
- 业务数据一致性要求较高,例如:银行业务
- 硬件设备内存较大,利用 Innodb较好的缓存能力来提高内存利用率,减少磁盘I/O的压力
4.4:生产环境中依据什么选择存储引擎?
-
需要考虑毎个存儲引擎提供了哪些不同的核心功能及应用场景
-
支持的字段和数据类型
●所有引擎都支持通用的数据类型
●但不是所有的引擎都支持其它的字段类型,如二进制对象 -
锁定类型:不同的存储引擎支持不同级别的锁定
●表锁定
●行锁定 -
索引的支持
●建立索引在搜索和恢复数据库中的数据的时候能够显著提高性能
●不同的存储引擎提供不同的制作索引的技术
●有些存储引擎根本不支持索引 -
事务处理的支持
●事务处理功能通过提供在向表中更新和插入信息期间的可靠性
●可根据企业业务是否要支持事务选择存储引擎
4.5:配置存储引擎
- 在企业中选择好合适的存储引擎之后,就可以进行修改了
- 修改步骤
●查看数据库可配置的存储引擎
●查看表正在使用的存储引擎
●配置存储引擎为所选择的类型 - 使用 show engines查看系统支持的存储引擎
- 查看表使用的存储引擎
方法1:show table status from库名 where name=表名;
方法2:show create table表名;'常用'
4.6:修改存储引擎
方法一:alter table修改
alter table table_name engine=引擎;
方法二:修改my.cnf,指定默认存储引擎并重启服务
default-storage-engine=InoDB
方法三:create table创建表时指定存储引擎
create table 表名(字段) engine=引擎
方法四:Mysql_convert_table_firmat转化存储引擎
Mysql_convert_table_format-user=root--password=密码--sock=/tmp/mysql.sock-engine=引擎 库名 表名