文章目录
索引的概念
数据库中的索引与书籍中的目录类似
在一本书中,无须阅读整本书,利用目录就可以快速査找所需信息
书中的目录是一个词 语列表,其中注明了包含各个词的页码
数据库索引
在数据库中,索引使数据库程序无须对整个表进行扫描,就可以在其中找到所需数据
数据库中的索引是某个表中一列或者若干列值的集合,以及物理标识这些值的数据页的逻辑指针清单
索引的作用
1、数据库利用各种快速定位技术,能够大大加快查询速率
2、当表很大或查询涉及到多个表时,可以成千上万倍地提高查询速度
3、可以降低数据库的IO成本,并且还可以降低数据库的排序成本IO:输入(写入、更改数据),输出(读取数据)
4、通过创建唯一性索引保证数据表数据的唯一性
5、可以加快表与表之间的连接
6、在使用分组和排序时,可大大减少分组和排序时间
索引的优缺点
优点
可以快速的找到所需要的的资源
缺点
占用空间
索引的分类
1、普通索引
这是最基本的索引类型,而且它没有唯一性之类的限制
2、唯一性索引
这种索引和前面的“普通索引”基本相同,但有一个区别:索引列的所有值都只能出现一次,即必须唯一
3、主键
主键是一种唯一性索引,但它必须指定为“ PRIMARY KEY
4、全文索引
MySQL从32323版开始支持全文索引和全文检索。在 MySQL中全文索引的索引类型为 FULLTEXT,全文索引可以在 ARCHAR或者TEXT类型的列上创建
5、单列索引与多列索引
索引可以是单列上创建的索引,也可以是在多列上创建的索引
外键
主表中的外键是令一张表的主键
创建普通索引
语法:
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);
'//全文索引:往往用于字符串,而不适用于数值类型'
查看索引
语法:
show index from tablename;
show keys from tablename;
例如:
show index from IT_salary;
show keys from IT_salary;
删除索引的方法
drop index index_name on table_name;
例如:drop index n_index on IT_salary
alter table table_name drop index index_name;
alter table IT_salary drop index name_indedx ;
事务
事务的概念
事务是一种机制、一个操作序列,包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行,要么都不执行
事务是一个不可分割的工作逻辑单元,在数据库系统上执行并发操作时,事务是最小的控制单元
适用于多用户同时操作的数据库系统的场景,如银行、保险公司及证券交易系统等等
通过事务的整体性以保证数据的一致性
如果事务成功了一部分,一部分未成功,则执行回滚,回到事务的起点,重新开始操作
事务的特点
原子性(Atomicity)
事务是一个完整的操作,事务的各元素是不可分的(原子的)
事务中的所有元素必须作为一个整体提交或回滚
如果事务中的任何元素失败,则整个事务将失败
一致性(Consistency)
当事务完成时,数据必须处于一致状态!
在事务开始之前,数据库中存储的数据处于一致状态;
在正在进行的事务中,数据可能处于不一致的状态;
当事务成功完成时,数据必须再次回到已知的一致状态
隔离性(Isolation)
对数据进行修改的所有并发事务是彼此隔离的,这表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务
修改数据的事务可以在另一个使用相同数据的事务开始之前访问这些数据,或者在另一个使用相同数据的事务结束之后访问这些数据
持久性(Durability)
事务持久性指不管系统是否发生故障,事务处理的结果都是永久的
一旦事务被提交,事务的效果会被永久地保留在数据库中
事务控制语句
MySQL事务默认是自动提交的,当SQL语句提交时事务便自动提交
事务控制语句
begin 事务的开始
commit 提交
rollback 回滚
savepoint 存档点名称 存档点
release savepoint 存档点名称 删除存档点
rollback to 存档点名称 回滚到某个存档点
set transaction 设置事务
事务的控制方法
手动对事务进行控制的方法
事务处理命令控制事务
begin:开始一个事务
commit:提交一个事务
rollback:回滚一个事务
使用set命令进行控制
set autocommit=0:禁止自动提交
set autocommit=1:开启自动提交(默认)
存档
格式:
savepoint <存档点名称>;
例如:
savepoint s1;
回滚
格式:
rollback to <存档点名称>;
例如:
rollback to s1; '//回到s1的存档点'
rollback; '//回到begin'
'//rollback只能向前回滚,无法向后回滚'
'//commit提交后,事务结束,此时再次使用的rollback属于另一个新的事务,对于已经commit的事务没有任何作用'
视图和存储过程
视图
视图是一张虚拟的表,数据不存在视图中,视图是真实表的映射数据。例如:水中捞月是典型的视图
利用条件筛选,分组,排序等产生出一个结果集(结果集保存在内存中),并且做成持久化保存(保存映射)
视图占用资源小,真实表中数据产生变化,会影响到视图。
创建和查询视图命令
创建视图
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; '//查看视图'
视图的特点
1、安全性高
2、简化sql操作
3、可以针对不同用户创建不同的视图(不同权限的用户浏览不同的信息)
存储过程
存储过程:多用于软件开发方向,
防止代码在网络传输过程中被截获,做了安全性保障。
原始状态:在代码过程中:需要嵌入sql语句,通过连接驱动把sql语句作为参数,传递给MySQL(数据库)进行执行,此时就会有安全风险。
通过存储过程解决安全隐患
存储过程是写在数据库中,并不是程序中。
程序是通过调用存储过程名称去触发sql操作。(类似调用函数)
存储过程优点
代码量优化,传输安全,网络资源优化
存储引擎概念介绍
MySQL中的数据用各种不同的技术存储在文件中,每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力,这些不同的技术以及配套的功能在 MySQL中称为存储引擎
存储引擎就是 MySQL将数据存储在文件系统中的存储方式或者存储格式
目前 MySQL常用的两种存储引擎
MyISAM
InnoDB
(innodb支持事务,myisam不支持事务)
MySQL存储引擎是 MySQL数据库服务器中的组件,负责为数据库执行实际的数据I/O操作
使用特殊存储引擎的主要优点之一在于:
仅需提供特殊应用所需的特性
数据库中的系统开销较小
具有更有效和更高的数据库性能
MySQL系统中,存储引擎处于文件系统之上,在数据保存到数据文件之前会传输到存储引擎,之后按照各个存储引擎的存储格式进行存储
myisam的介绍
myisam不支持事务,也不支持外键
访问速度快
对事物完整性没有要求
myisam在磁盘上存储成三个文件
.frm文件存储表定义
数据文件的扩展名为.MYD(MYData)
索引文件的扩展名是.MYI(MYIndex)
表级锁定形式,数据在更新时锁定整个表(不允许两个人同时操作)
数据库在读写过程中相互阻塞
会在数据写入的过程阻塞用户数据的读取
也会在数据读取的过程中阻塞用户的数据写入
数据单独写入或读取,速度过程较快且占用资源相对少
myisam
静态表
动态表 (直接写入的,数据会随时变的)
压缩表
myisam适用的生产场景举例
公司业务不需要事务的支持
单方面读取或写入数据比较多的业务
myisam存储引擎数据读写都比较频繁场景不适合
使用读写并发访问相对较低的业务
数据修改相对较少的业务
对数据业务一致性要求不是非常高的业务
服务器硬件资源相对比较差
innodb介绍
支持事务:支持4个事务隔离级别
行级(读写分离)锁定,但是全表扫描仍然会是表级锁定
读写阻塞与事务隔离级别相关
具有非常高效的缓存特性:能缓存索引,也能缓存数据
表与主键以簇的方式存储
支持外键约束,5.5以前不支持全文索引,5.5版本以后支持全文索引
对硬件资源要求还是比较高的场合
innodb适用生产场景分析
业务需要事务的支持
行级锁定对高并发有很好的适应能力,但需确保查询是通过索引来完成
业务数据更新较为频繁的场景
如:论坛、微博等
业务数据一致性要求较高
如:银行业务
硬件设备内存较大(因为事务都先放内存),利用innodb较好的缓存能力来提高内存利用率,减少磁盘IO的压力
配置存储引擎
查看表使用的存储引擎
方法1:show table status from库名 where name=表名;
方法2:show create table表名;'//常用'
例如:
MySQL > show table status from yibiao where name='wangermazi'\G
'//使用\G代替分号表示垂直显示结果'
修改存储引擎
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