前言
一:索引
1.1:什么是索引(index)?
- 数据库中的索引与书籍中的目录类似
- 在一本书中,无须阅读整本书,利用目录就可以快速査找所需信息
- 书中的目录是一个词语列表,其中注明了包含各个词的页码
- 数据库索引
- 在数据库中,索引使数据库程序无须对整个表进行扫描,就可以在其中找到所需数据
- 数据库中的索引是某个表中一列或者若干列值的集合,以及物理标识这些值的数据页的逻辑指针清单
1.2:索引有什么作用?
- 设置了合适的索引之后,数据库利用各种快速的定位技术,能够大大加快查询速率
- 特别是当表很大时,或者查询涉及到多个表时,使用索引可使查询加快成干倍
- 可以降低数据库的IO成本,并且索引还可以降低数据库的排序成本
- 通过创建唯一性索引保证数据表数据的唯一性
- 可以加快表与表之间的连接
- 在使用分组和排序时,可大大减少分组和排序时间
1.3:索引的优缺点是什么?
- 优点
- 可以快速的找到所需要的的资源
- 缺点
- 占用空间
1.4:索引的分类
- 普通索引
- 这是最基本的索引类型,而且它没有唯一性之类的限制
- 唯一性索引
- 这种索引和前面的“普通索引”基本相同,但有一个区别:索引列的所有值都只能出现一次,即必须唯一
- 主键
- 主键是一种唯一性索引,但它必须指定为“ PRIMARY KEY
- 全文索引
- MySQL从32323版开始支持全文索引和全文检索。在 MySQL中全文索引的索引类型为 FULLTEXT,全文索引可以在 ARCHAR或者TEXT类型的列上创建
- 单列索引与多列索引
- 索引可以是单列上创建的索引,也可以是在多列上创建的索引
1.5:创建索引有什么原则依据?
- 表的主键、外键必须有索引
- 数据量超过300行的表应该有索引
- 经常与其他表进行连接的表,在连接字段上应该建立索引
- 唯一性太差的字段不适合建立索引
- 更新太频繁地字段不适合创建索引
- 经常出现在 Where子句中的字段,特别是大表的字段,应该建立索引
- 索引应该建在选择性高的字段上
- 索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引
1.6:什么是外键?
- 主表中的外键是令一张表的主键
1.7:如何创建索引?
-
根据企业需求选择了合适的索引之后,可使用 CREATE INDEX创建索引
-
CREATE INDEX加上各个索引关键字便可创建各个类型的索引
-
创建普通索引
语法: create index <索引的名字> on tablename(列的列表); 例如: create index salary on IT_salary; '//一张表同一列可以做多个索引'
-
创建唯一性索引
语法: create unique index <索引的名字> on tablename(列的列表); 例如: create unique index salary_unique on IT_salary;
-
创建主键索引
语法: create table tablename([...],primary key(列的列表)); alter table tablename add primary key(列的列表); 例如: alter table IT_salary add primary key; '//创建主键索引的两种方式,创建表的时候指定主键索引和后期增加主键索引'
-
创建全文索引
语法: create fulltext index <索引的名字> on tablename(列的列表); 例如: create fulltext index full_index_addr on IT_salary(addr); '//全文索引:往往用于字符串,而不适用于数值类型'
1.8:如何查看索引?
-
语法: show index from tablename; show keys from tablename; 例如: show index from IT_salary; show keys from IT_salary;
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:原子性(Atomicity)
- 事务是一个完整的操作,事务的各元素是不可分的(原子的)
- 事务中的所有元素必须作为一个整体提交或回滚
- 如果事务中的任何元素失败,则整个事务将失败
2.2.2:一致性(Consistency)
- 当事务完成时,数据必须处于一致状态!
- 在事务开始之前,数据库中存储的数据处于一致状态;
- 在正在进行的事务中,数据可能处于不一致的状态;
- 当事务成功完成时,数据必须再次回到已知的一致状态
2.2.3:隔离性(Isolation)
- 对数据进行修改的所有并发事务是彼此隔离的,这表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务
- 修改数据的事务可以在另一个使用相同数据的事务开始之前访问这些数据,或者在另一个使用相同数据的事务结束之后访问这些数据
2.2.4:持久性(Durability)
- 事务持久性指不管系统是否发生故障,事务处理的结果都是永久的
- 一旦事务被提交,事务的效果会被永久地保留在数据库中
2.3:如何操作事务?
- 默认情况下 MySQL的事务是自动提交的,当sql语句提交时事务便自动提交
2.3.1:控制事务的方法有哪些?
- 手动对事务进行控制的方法
- 事务处理命令控制
- 使用set设置事务处理方式
2.3.2:控制事务的命令有哪些?
- 使用事务处理命令控制事务
- bein:开始一个事务
- commit:提交一个事务
- rollback:回滚一个事务
- 使用set命令进行控制
- set autocommit=0:禁止自动提交
- set autocommit=1:开启自动提交
2.3.3:如何存档?
-
格式: savepoint <存档点名称>; 例如: savepoint s1;
2.3.4:如何回滚?
-
格式: rollback to <存档点名称>; 例如: rollback to s1; '//回到s1的存档点' rollback; '//回到begin' '//rollback只能向前回滚,无法向后回滚' '//commit提交后,事务结束,此时再次使用的rollback属于另一个新的事务,对于已经commit的事务没有任何作用'
三:视图和存储过程
3.1:视图
3.1.1:什么是视图?
- 视图是一张虚拟的表,数据不存在视图中,视图是真实表的映射数据。例如:水中捞月是典型的视图
- 利用条件筛选,分组,排序等产生出一个结果集(结果集保存在内存中),并且做成持久化保存(保存映射)
- 视图占用资源小,真实表中数据产生变化,会影响到视图。
3.1.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.1.3:视图特点
- 安全性高
- 简化sql操作
- 可以针对不同用户创建不同的视图(不同权限的用户浏览不同的信息)
3.2:存储过程
3.2.1:什么是存储过程?
-
存储过程:多用于软件开发方向,
防止代码在网络传输过程中被截获,做了安全性保障。
-
原始状态:在代码过程中:需要嵌入sql语句,通过连接驱动把sql语句作为参数,传递给MySQL(数据库)进行执行,此时就会有安全风险。
-
通过存储过程解决安全隐患
存储过程是写在数据库中,并不是程序中。
程序是通过调用存储过程名称去触发sql操作。(类似调用函数)
3.2.2:存储过程有什么优点?
- 存储过程优点:代码量优化,传输安全,网络资源优化
四:存储引擎
4.1:什么是存储引擎?
-
MySQL中的数据用各种不同的技术存储在文件中,每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力,这些不同的技术以及配套的功能在 MySQL中称为存储引擎
-
存储引擎就是 MySQL将数据存储在文件系统中的存储方式或者存储格式
-
目前 MySQL常用的两种存储引擎
- MyISAM
- InnoDB
-
MySQL存储引擎是 MySQL数据库服务器中的组件,负责为数据库执行实际的数据I/O操作
-
使用特殊存储引擎的主要优点之一在于:
- 仅需提供特殊应用所需的特性
- 数据库中的系统开销较小
- 具有更有效和更高的数据库性能
-
MySQL系统中,存储引擎处于文件系统之上,在数据保存到数据文件之前会传输到存储引擎,之后按照各个存储引擎的存储格式进行存储
-
从程序开发角度来说:
- 不同语言安装不同的驱动创建不同的connector
- connection pool中有多个对象(空闲的进程/线程)
- connector和connection pool的对象连接MySQL server
- 连接池作用:优化连接效率
-
从系统角度:
-
依靠进程或者线程链接数据库的对象,就需要.sock文件创建pid去连接
-
具体文件内容通过存储引擎存储在硬盘上,通过各种管理工具(Management Server)管理
privilege:特权
parser:分析器
query:查询
optimizer:优化程序
数据库的日志文件是重中之重,需要单独备份。
-
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)
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表名;'//常用' 例如: MySQL > show table status from yibiao where name='wangermazi'\G '//使用\G代替分号表示垂直显示结果'
-
4.6:如何修改存储引擎?
-
共有四种方法
-
方法一:
-
alter table 修改; 格式: alter table table_name engine=引擎; 例如: MySQL> alter table user_info engin=MyISAM;
-
方法二:
-
修改my.cnf,指定默认存储引擎并重启服务 格式: default-storage-engine=InnoDB 例如: vim my.cnf default-storage-engine=InnoDB
-
方法三:
-
create table 创建表时指定存储引擎 格式: create table 表名 (字段) engine=引擎 例如: MySQL> create table yibiao(id int)engine=MyISAM;
-
方法四:
-
Mysql_convert_table_format转化存储引擎 格式: Mysql_convert_table_format-user=root--password=密码--sock=/tmp/mysql.sock-engine=引擎 库名 表名 例如: [root@localhost ~]# yum install perl-DBI perl-DBD-MySQL -y [root@localhost ~]# /usr/local/mysql/bin/bysql_convert_table_format --user=root --passwork='123' --sock=/tmp/mysql.sock auth