文章目录
一、索引
1、索引的概念
优点:能够快速找到所需数据资源的位置
缺点:占用资源
数据库中的索引与书籍中的目录类似
- 在一本书中,无须阅读整本书,利用目录就可以快速查找所需信息
- 书中的目录是一个词语列表,其中注明了包含各个词的页码
数据库索引
-
在数据库中,索引使数据库程序无须对整个表进行扫描,就可以在其中找到所需数据
-
数据库中的索引是某个表中一列或者若干列值的集合,以及物理标识这些值的数据页的逻辑指针清单
2、索引的作用
-
设置了合适的索引之后,数据库利用各种快速的定位技术,能够大大加快查询速率
-
特别是当表很大时,或者查询涉及到多个表时,使用索 引可使查询加快成干倍
-
可以降低数据库的IO(输入输出)成本,并且索引还可以降低数据库的排序成本
-
通过创建唯一性索引保证数据表数据的唯一性
-
可以加快表与表之间的连接
-
在使用分组和排序时,可大大减少分组和排序时间
3、索引的分类
普通索引
- 这是最基本的索引类型,而且它没有唯一性之类的限制
唯一性索引(唯一索引允许为空)
- 这种索引和前面的**“普通索引”基本相同**,但有一个区别:索引列的所有值只能出现一次,即必须唯一
主键
- 主键是一种唯一性索引,但它必须指定为“PRIMARY KEY”
全文索引
- MySQL从3.23.23版开始支持全文索引和全文检索。在MySQL中,全文索引的索引类型为FULLTEXT,全文索引可以在VARCHAR或者TEXT类型的列上创建
单列索引与多列索引
- 索引可以是在单列上创建的索引,也可以是在多列上创建的索引
4、创建索引的原则依据
-
表的主键、外键必须有索引
-
数据量超过300行的表应该有索引
-
经常与其他表进行连接的表,在连接字段上应该建立索引
-
唯一性太差的字段不适合建立索引
-
更新太频繁地字段不适合创建索引
-
经常出现在Where子句中的字段,特别是大表的字段, 应该建立索引
-
索引应该建在选择性高的字段上
-
索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引
外键:主表中的外键是另一张表中的主键(外键允许重复,主键不允许重复)
候选键:除了主键及外键,其他均为候选键
5、创建索引的方法
-
根据企业需求选择了合适的索引之后,可使用create index 创建索引
-
create index 加上各个索引关键字便可创建各个类型的索引
-
创建普通索引
create index <索引的名字> on tablename (列的列表);
创建普通索引示例
create index info_index on info(name);
索引是表的一部分(依赖于表);表名(字段)
(列的列表)字段列表
-
创建唯一性索引
create unique index <索引的名字> on tablename(列的列表);
创建唯一索引示例
create unique index info_unique_index on info(name);
-
创建主键索引
1、创建表时定义索引
create table tablename ([…],primary key (列的列表));
或
2、表已经创建完成,通过alter更改表结构,添加索引
alter table tablename add primary key (列的列表);
创建主键索引示例
alter table a add primary key (name);
-
查看索引
show index form tablename;
或
show keys from tablename;
查看索引示例
6、索引示例
#创建表
#添加记录
在不指定列的情况化,默认第一个值仍是第一个值id,但id列标识符列自动填写,类型是int类型,而指定值的第一个类型是字符串,所以会报错,为了避免这种情况,所以需要指定列(字段)的情况下指定值
#创建普通索引
#查询索引
#创建主键
在已有表的情况下创建主键
#创建唯一索引
一个列(字段)可以创建多个索引(name创建了两个索引:普通索引,唯一索引)
#全文索引(对字符串类型进行定义索引)
二、事务
1、事务的概念
回滚:回到事务的起点
-
事务是一种机制、一个操作序列,包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行, 要么都不执行
-
事务是一个不可分割的工作逻辑单元,在数据库系统上 执行并发操作时,事务是最小的控制单元
-
适用于多用户同时操作的数据库系统的场景,如银行、 保险公司及证券交易系统等等
-
通过事务的整体性以保证数据的一致性
2、事务的ACID特点
原子性
- 事务是一个完整的操作,事务的各元素是不可分的(原子的)
- 事务中的所有元素必须作为一个整体提交或回滚
- 如果事务中的任何元素失败,则整个事务将失败
一致性
-
当事务完成时,数据必须处于一致状态;
在事务开始之前,数据库中存储的数据处于一致状态;
在正在进行的事务中,数据可能处于不一致的状态;
当事务成功完成时,数据必须再次回到已知的一致状态
隔离性
事务必须是独立的,不依赖或影响其他事务
-
对数据进行修改的所有并发事务是彼此隔离的,这表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务
-
修改数据的事务可以在另一个使用相同数据的事务开始之前访问这些数据,或者在另一个使用相同数据的事务结束之后访问这些数据
持久性
事务处理的结果时永久的,一旦事务提交,事务的效果将会被永久的保留在数据库中
事务的操作,不可逆
- 事务持久性指不管系统是否发生故障,事务处理的结果都是永久的
- 一旦事务被提交,事务的效果会被永久地保留在数据库中
3、事务的操作
1、默认情况下MySQL的事务是自动提交的,当sql语句提交时事务便自动提交
2、手动对事务进行控制的方法
- 事务处理命令控制
- 使用set设置事务处理方式
是在内存上修改(会释放 ),只有在硬盘上将会永久性的修改
1)事务处理命令控制事务
- begin:开始一个事务
- commit:提交一个事务
- rollback:回滚一个事务
2)使用set命令进行控制
- set autocommit=0 :禁止自动提交,等同于开启了begin (可以回滚)
- set autocommit=1 :开启自动提交(不能回滚)
4、事务示例
#启用begin,添加记录
#启用存档(存档查看是存当前记录)
#存档点的数据 是写在存档之后,如果执行回档,是回到刚执行存档后的状态
#直接回滚,则是回到begin时的状态,并且不能再次回到存档位置(存档是在内存上的,会及时释放)
#提交事务(一旦提交,会永久的保存,不可逆)
三、视图
1、概念
视图是一张虚拟的表,数据不存在视图中
是一张真实表的映射数据(比如:水中捞月)
真实表产生变化,也会影响到视图的变化
利用条件筛选,分组,排序等产生出一个结果集。并且做成持久化保存,只保存映射(结果集保存在内存)
可以根据不同用户创建不同的视图(不同的用户,看到的视图是不一样的)
2、视图作用
1、方便sql语句操作
2、不同权限用户的信息浏览(不同权限看到的视图信息时不同的)
3、安全
**优点:**空间占用小,经常查询的表可以做成视图
命令语法:
create view 视图名称 as 查询语句
多表相连的条件使用on ; 单表条件使用where
3、视图示例
#创建视图
#查询视图
#通过创建的视图,进行相应的查询
#多表相连,在创建一张表
#多表相连查询(内连 inner join、左联、右联)
#基于多表相连创建视图
简化了命令操作,相当于创建了快捷方式
视图是虚拟的,是真实表的映射,视图中是无法更改数据的,须在实际表中更改,视图也会随之更改
四、存储过程(软件开发方向)
防止代码在网络传输过程中被截获,做了安全性保障
原始状态:代码中需要嵌入SQL语句,通过连接驱动把SQL语句作为参数,传递给Mysql(数据库)进行执行
存储过程是写在数据库中,并不是程序中。(增删改查的内容,提前定义好)
程序是通过调用存储过程名称去触发操作SQL语句操作。
优点:代码量优化,传输安全,网络优化
五、存储引擎
1、存储引擎的概念
-
MySQL中的数据用各种不同的技术存储在文件中,每 一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力,这些不同的技术以及配套的功能在MySQL中称为存储引擎
-
存储引擎就是MySQL将数据存储在文件系统中的存储方式或者存储格式
-
目前MySQL常用的两种存储引擎
- MyISAM
- InnoDB
-
MySQL存储引擎是MySQL数据库服务器中的组件,负责为数据库执行实际的数据I/O(输入/输出)操作
-
使用特殊存储引擎的主要优点之一在于,仅需提供特殊应用所需的特性,数据库中的系统开销较小,具有更有 效和更高的数据库性能
-
MySQL系统中,存储引擎处于文件系统之上,在数据保存到数据文件之前会传输到存储引擎,之后按照各个 存储引擎的存储格式进行存储
数据库解刨图:
从程序层面:开发语言,驱动连接——>connectors 对象——>数据库——>connection pool连接池(加速访问)——>连接池创键多个连接对象(也可以不放连接对象,但高并发时,连接时间会特别长)
拿数据:数据是放在磁盘上的(file system)——management services(管理工具)——interface(支持功能dml、视图等)——parser(分析器;各种快速提取,查看,对象的权限)——(优化)——(缓存区)——pluggable storage engines (各种模式,myisam,innodb)——file system(存数据的地方)——files&logs(日志文件,数据库的核心命脉,日志文件要单独备份)
从系统层面解释:进程或者线程连接数据库,必须有.sock通讯文件(传输介质),没有通讯文件就不会有pid
2、MyISAM
1)MyISAM介绍
-
MyISAM存储引擎是MySQL关系数据库系统5.5版本之前默认的存储引擎,前身是ISAM
-
ISAM是-一个定义明确且历经时间考验的数据表格管理 方法,在设计之时就考虑到数据库被查询的次数要远大 于更新的次数
-
ISAM的特点
- ISAM执行读取操作的速度很快(优点)
- 不占用大量的内存和存储资源 (优点)
- 不支持事务处理 (缺点)
- 不能够容错 (缺点)
-
MyISAM管理非事务表,是ISAM的扩展格式
-
提供ISAM里所没有的索引和字段管理的大量功能
-
MyISAM使用一种表格锁定的机制,以优化多个并发的读写操作
-
MyISAM提供高速存储和检索,以及全文搜索能力,受到web开发的青睐
优化方面:注重读 读>写
2)MyISAM的特点
-
不支持事务
-
表级锁定形式,数据在更新时锁定整个表
-
数据库在读写过程中互相阻塞(读就不写,写就不读)
- 会在数据写入的过程中阻塞用户数据的读取
- 也会在数据读取的过程中阻塞用户的数据写入
-
可通过key_buffer_size来设置缓存索引,提高访问性能,减少磁盘IO的压力
- 但缓存只会缓存索引文件,不会缓存数据
-
采用MyISAM存储引擎数据单独写入或读取,速度过程 较快且占用资源相对少
-
MyISAM存储引擎它不支持外键约束,只支持全文索引
-
每个MyISAM在磁盘上存储成三个文件,每-一个文件的名字以表的名字开始,扩展名指出文件类型
-
MyISAM在磁盘 上存储的文件
- .frm文件存储表定义(表的结构文件“属性信息”)
- 数据文件的扩展名为.MYD (MYData) (表的数据文件)
- 索引文件的扩展名是.MYI (MYIndex) (表的索引文件)
3、MyISAM使用的生产场景
-
公司业务不需要事务的支持
-
一般单方面读取数据比较多的业务,或单方面写入数据比较多的业务
-
MyISAM存储引擎数据读写都比较频繁场景不适合
-
使用读写并发访问相对较低的业务
-
数据修改相对较少的业务
-
对数据业务一致性要求不是非常高的业务
-
服务器硬件资源相对比较差
3、InnoDB
1)InnoDB的特点
-
支持事务:支持4个事务隔离级别
-
行级锁定,但是全表扫描仍然会是表级锁定
-
读写阻塞与事务隔离级别相关
-
具有非常高效的缓存特性:能缓存索引,也能缓存数据
-
表与主键以簇的方式存储
-
支持分区、表空间,类似oracle数据库
-
支持外键约束,5.5以前不支持全文索引,5.5版本以后支持全文索引
-
对硬件资源要求比较高的场合
2)InnoDB使用的生产场景
-
需要考虑每个存储引擎提供了哪些不同的核心功能及应用场景
-
支持的字段和数据类型
- 所有引擎都支持通用的数据类型
- 但不是所有的引擎都支持其它的字段类型,如二进制对象
-
锁定类型:不同的存储引擎支持不同级别的锁定
- 表锁定
- 行锁定*
4、企业选择存储引擎依据
-
索引的支持
- 建立索引在搜索和恢复数据库中的数据的时候能够显著提高性能
- 不同的存储引擎提供不同的制作索引的技术
- 有些存储引擎根本不支持索引
-
事务处理的支持
- 事务处理功能通过提供在向表中更新和插入信息期间的可靠性
- 可根据企业业务是否要支持事务选择存储引擎
5、配置存储引擎
-
**在企业中选择好合适的存储引擎之后,就可以进行修改了 **
-
修改步骤
- 查看数据库可配置的存储引擎
- 查看表正在使用的存储引擎
- 配置存储引擎为所选择的类型
-
使用show engines查看系统支持的存储引擎
-
查看表使用的存储引擎
-
方法1:show table status from 库名 where name='表名‘;
-
方法2:show create table 表名;
方法一示例:
-
方法二示例:
6、修改存储引擎
方法一:alter table修改
alter table table_name engine=引擎
方法二:修改my.cnf,指定默认存储引擎并重启服务(指定默认后,后面所有创建的表默认存储引擎为MyISAM)
default-storage-engine=MyISAM
方法三:create table创建表时指定存储引擎
create table 表名 (字段) engine=引擎
方法四:Mysql_convert_table_format转化存储引擎
Mysql_convert_table_format -user=root --password=密码 --sock=/tmp/mysql.sock --engine=引擎 库名 表名