事务处理和索引

一,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);

进行恢复之前,要确定目的表和目的列都存在;

如果没有,要创建出来,表名和列名不用一样,但列类型要一样。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容