一,MySQL事务处理
1,定义:事务就是将一组SQL语句放在同一批次内去执行
如果一个SQL语句出错,则该批次内的所有SQL都将被取消执行
注意:MySQL事务处理只支持innodb和bdb数据表类型
2,事务的ACID原则
(1)原子性(atomic):不可拆分性
(2)一致性(consist):一起执行或都不执行
(3)隔离性(isolated):各个事务
(4)持久性(durable):执行后,数据产生永久性改变
3, 实现:
(1)set autocommit:使用set语句来改变自动提交模式
set autocommit = 0; #关闭自动提交模式
set autocommit = 1; #开启自动提交模式
注意:
MySQL中默认是自动提交
使用事务时应先关闭自动提交
(2)实现方法
set autocommit = 0: 关闭自动提交模式
start transaction:开始一个事务,标记事务的起始点
commit:提交一个事务给数据库
rollback:将事务回滚,数据回到本次事务的初始状态
set autocommit = 1:还原MySQL数据库的自动提交
#现实中,commit和rollback是通过编程语言(java,PHP等)来判断的
commit也是事务成功执行的标志,也是结尾。
步骤:关闭自动提交--开始事务--执行语句--提交(提交失败,回滚)--开启自动提交
二,索引
1,定义:索引(Index)是帮助MySQL高效获取数据的数据结构;
索引是一种数据结构,存在数据库中某个位置,查询时,先经过数据结构查询,然后确定目标数据位置,相当于一本书的目录;而这个定位的过程,使用算法来实现的。
2,作用:添加特定标记,提高查询效率,实现相应功能。
A)索引可以避免全表扫描。多数查询可以仅扫描少量索引页及数据页,而不是遍历所有数据页。
B)对于非聚集索引,有些查询甚至可以不访问数据页。
C)聚集索引可以避免数据插入操作集中于表的最后一个数据页。
D)一些情况下,索引还可用于避免排序操作。
3,分类:
(1)主键索引(primary key)
主键:某一个属性能唯一标识一条记录
特点:
确保数据记录的唯一性
确定特定数据记录在数据库中的位置
(2)唯一索引(unique)
作用:避免同一个表中某数据列中的值重复,并不是为了提高查询效率。
与主键索引的区别
#主键索引只能有一个,不重复且非空;
#唯一索引可有多个,不重复但可以为空;
使用:
列末尾添加:unique
表末尾添加:unique key(列名);
(3)常规索引(index/key)
作用:快速定位特定数据
注意:
经常被当做查找条件的字段才添加常规索引
不宜添加太多常规索引
使用:
创建表时:index/key id (studentno, subjectno),(id为重命名)
创建表后:alter table `result` add index/key id(studentno, subjectno);
(4)全文索引(fulltext)(要查找的数据不能超过一列数据的50%)
作用:快速定位特定数据
注意:
只能用于MyISAM类型的数据表
只能用于char, varchar, text数据列类型
适用大型数据集
使用:fulltext(studentname)
注意:除了全文索引,其他索引添加后,使用时会自动调用相应的数据结构
而全文索引需要特定的语句去启动
select * from student where match(studentname) against('李%');
select * from student where studentname like '李%';(普通的)
4,添加索引的方式:
(1)创建列时,直接添加
(2)创建完列后,在末尾添加
(3)创建完表后,以修改表的形式进行添加
#explain:可以检验MySQL语句的实现过程,SQL语句是否优秀,和explain中的type,rows有关,type级别越高,rows越小,语句越优秀。
type级别:const, eq_reg, ref, range, indexhe 和all,越来越低。
(能达到最高级别的一般是主键索引)
例:explain select * from student;
5,显示索引信息
show index from student;
6,删除索引
(1)drop index testno on test3;
testno:索引名
test3:表名
(2)alter table test3 drop index c;
c:索引名
特例:删除主键索引
alter table test3 drop primary key;
7,索引准则
(1)索引不是越多越好
(2)不要对经常变动的数据加索引
(3)小数据量的表建议不加索引
(4)索引一般应加在查找条件的字段(性别除外,数据体较少)
(5)选择什么样的索引,应根据列的特性决定。
8,导致索引失效的两种情况
(1)模糊查询和索引一起用
select * from student where studentname like '%郭%'
前模糊:查所有行,导致索引失效
后模糊:正常查询
(2)两个条件并列
select * from student where studentno = 1000 or studentno = 1003;
9,索引的存储
一条索引记录中包含的基本信息包括:键值(即你定义索引时指定的所有字段的值)+逻辑指针(指向数据页或者另一索引页)。
当你为一张空表创建索引时,数据库系统将为你分配一个索引页,该索引页在你插入数据前一直是空的。此页此时既是根结点,也是叶结点。每当你往表中插入一行数据,数据库系统即向此根结点中插入一行索引记录。当根结点满时,数据库系统大抵按以下步骤进行分裂:
A)创建两个儿子结点
B)将原根结点中的数据近似地拆成两半,分别写入新的两个儿子结点
C)根结点中加上指向两个儿子结点的指针
通常状况下,由于索引记录仅包含索引字段值(以及4-9字节的指针),索引实体比真实的数据行要小许多,索引页相较数据页来说要密集许多。一个索引页可以存储数量更多的索引记录,这意味着在索引中查找时在I/O上占很大的优势,理解这一点有助于从本质上了解使用索引的优势。
MySQL的B+ 树是从最早的平衡二叉树演化而来的。B+ 树是由二叉查找树、平衡二叉树(AVLTree)和平衡多路查找树(B-Tree)逐步优化而来。
二叉查找树:左子树的键值小于根的键值,右子树的键值大于根的键值。
AVL 树:平衡二叉树(AVL 树)在符合二叉查找树的条件下,还满足任何节点的两个子树的高度最大差为 1。
平衡多路查找树(B-Tree):为磁盘等外存储设备设计的一种平衡查找树。
B-Tree 中的每个节点根据实际情况可以包含大量的关键字信息和分支,例:
以根节点为例,关键字为 17 和 35,P1 指针指向的子树的数据范围为小于 17,P2 指针指向的子树的数据范围为 17~35,P3 指针指向的子树的数据范围为大于 35。
模拟查找关键字 29 的过程:
1)、根据根节点找到磁盘块 1,读入内存。【磁盘 I/O 操作第 1 次】
2)、比较关键字 29 在区间(17,35),找到磁盘块 1 的指针 P2。
3)、根据 P2 指针找到磁盘块 3,读入内存。【磁盘 I/O 操作第 2 次】
4)、比较关键字 29 在区间(26,30),找到磁盘块 3 的指针 P2。
5)、根据 P2 指针找到磁盘块 8,读入内存。【磁盘 I/O 操作第 3 次】
6)、在磁盘块 8 中的关键字列表中找到关键字 29。
10,索引覆盖
索引覆盖是这样一种索引策略:当某一查询中包含的所需字段皆包含于一个索引中,此时索引将大大提高查询性能。
包含多个字段的索引,称为复合索引。索引最多可以包含31个字段,索引记录最大长度为600B。如果你在若干个字段上创建了一个复合的非聚集索引,且你的查询中所需Select字段及Where,Order By,Group By,Having子句中所涉及的字段都包含在索引中,则只搜索索引页即可满足查询,而不需要访问数据页。由于非聚集索引的叶结点包含所有数据行中的索引列值,使用这些结点即可返回真正的数据,这种情况称之为“索引覆盖”。
在索引覆盖的情况下,包含两种索引扫描:1)匹配索引扫描、2)非匹配索引扫描
1)匹配索引扫描
此类索引扫描可以让我们省去访问数据页的步骤,当查询仅返回一行数据时,性能提高是有限的,但在范围查询的情况下,性能提高将随结果集数量的增长而增长。
针对此类扫描,索引必须包含查询中涉及的的所有字段,另外,还需要满足:Where子句中包含索引中的“引导列”(Leading Column),例如一个复合索引包含A,B,C,D四列,则A为“引导列”。如果Where子句中所包含列是BCD或者BD等情况,则只能使用非匹配索引扫描。
2)非配置索引扫描
正如上述,如果Where子句中不包含索引的导引列,那么将使用非配置索引扫描。这最终导致扫描索引树上的所有叶子结点,当然,它的性能通常仍强于扫描所有的数据页。
三,MySQL的备份
1,数据库备份的必要性
(1)保证重要数据不丢失
(2)数据转移
2,MySQL数据库备份方法
(1)mysqldump备份工具
mysqldump备份(导出) source命令恢复
***mysqldump和mysql同级的命令(cmd中不能再MySQL中输入mysqldump)
mysqldump --help|more 帮助你查看mysqldump的可选参数
mysqldump客户端
作用:
转储数据库
手机数据库进行备份
将数据转移到另一个SQL服务器(不一定是MySQL服务器)
1]语法:
mysql -h 主机名 -u 用户名 p [options] 数据库名
[table1 table2 table3] > path/filename.sql(需保证该目录读写权限)
例:mysqldump -uroot -p(kgc) school grade student > h:/chenxuan/school.sql,回车
设置跳过某语句
mysqldump -uroot -p(kgc) --skip-add-drop-table school grade student ... 回车
设置把列明加载上
mysqldump -uroot -p(kgc) --skip-add-drop-table -c school grade ... 回车
还可以为数据添加锁;
或不转表的任何信息,只转结构;
或只转储给定的where条件选择的记录;
注意:p后面的密码可以先不输入
2]当忘记某个命令时,可以:
客户端名(mysqldump)--help 回车(全部显示)
客户端明(mysqldump)--help | more 回车(分屏显示)
命令恢复
第一:source命令恢复
1,先登录MySQL(mysqldump不用)
2,确定你要备份到哪个库(use 库名)
3,source h:/chenxuan/school.sql(脚本路径)
第二:MySQL命令恢复
在MySQL外面,用mysql -uroot -pkgc test<脚本路径(test目的库)
(2)数据库管理工作,如SQLyog
(3)使用SQL命令备份
1],备份数据(备份的目的文件不能提前存在)
select studentno, studentname into outfile '脚本路径' from student;
2],数据恢复
load data infile '脚本路径' into table student(id, name);
进行恢复之前,要确定目的表和目的列都存在;
如果没有,要创建出来,表名和列名不用一样,但列类型要一样。