目录
前言:我们前一篇讲了怎样多表之间联合查询,这样的查找效率不高,所以我们这篇将要将一个快的查找,索引---相当于我们书的目录
在创建主键约束(Primary key),唯一约束(Unique),外键约束(Foreign key)时,会自动创建对应列的索引。
show index from 表名;
create index 索引名(你取得别名) on 表名(列名--你想变成索引的列);
最好是在表创建之初就把索引给搞好。
如果在已经有很多条数据的表来创建索引,会吃掉大量的磁盘,系统,在这段时间类,数据库是无法正常的进行工作的。
drop index 索引名 on 表名;
索引保存的数据结构主要为B+树。
1.B+树又叫N叉搜素树,每一个节点上包含N个key值,N个key划分N个区间,最后一个Key就是最大值。
2.父节点的元素会重复出现在子节点上,这样是叶子节点包含了所有数据。
3.叶子节点,用类似链表的方式,首尾相连。
带有主键的表,就是按照主键索引的B+树来组织的。
优点:
1.高度降低下来,比较的时候,硬盘IO次数就比较少。
2.适合范围查询
3.所有的查询,都是落在叶子节点上的,无论查询哪个元素,中间比较的次数差不多,查询操作比较均衡。
假如:索引是主键列id号。
叶子节点:存放了索引信息和data域。
非叶子节点:只存放了索引信息。
如果索引不是主键列
会构造另外一棵B+树,非叶子节点存放的是索引,而叶子节点存放的不是完整的数据行,而是主键。
使用主键列来查询,只要查一次B+ 树就可以了
而使用非主键列的索引来查询,则需要先查询一遍索引的B+树,再查一遍主键列的索引的B+树。(这个叫回表)。
数据库事务是访问并可能操作各种数据项的一个数据库操作的序列。事务处理可以用来维护数据库的完整性,保证成批的Mysql语句(insert update delete)那么全部成功,那么全部失败。
原子性就是把一个事务中的所有操作打包成一个整体,那么全部成功,那么全部失败。如果中间有一个操作失败,就会自动恢复到执行之前的样子,就像这个事务从来没有执行过。也叫做回滚(把执行过的操作逆向恢复回去)。
例如:
张三给李四转100块钱,首先会在张三的账户上扣除一百块钱,等李四收取,之后在李四的账户上增加一百块钱。
这一天,转钱的时候,张三断网了。这就说明这个事务已经失败了,就要进行回滚,从张三的账户上扣除一百块钱进行逆向操作,使张三的账户金额不变。就像没有发生转钱这件事。
事务执行前和事务执行后都是将数据合法的状态,符合预测规则。
如上个例子:
一致性就是,张三账户扣除的钱和李四账户增加的钱要一样多。
事务一旦提交,对数据库的改变都是永久的,事务产生的修改都会存入到硬盘中。
数据库使允许多个事务同时进行操作,隔离性就是防止多个事务并发执行由于交叉而导致数据错误。
隔离性越高,就意味着事务之间的并发程度越低,执行效率越慢,但是数据的准确率越高。
就是两个事务并发执行(如 读,写)读这个事务读入了错误的数据就是脏读。
例如:
写这个事务:张三给老师上传作业。
读这个事务:老师就立马批改这个作业。
写修改这个事务:张三过了一会儿,感觉自己有道题写错了,再一次上传了自己修改过的作业。
脏读:但老师已经把张三第一次上传的作业批改完了。
这是因为读和写这个两个事务是完全并发的。
为了解决脏读问题,我给写加锁(我在写的时候,你不能看,等我写完了,你才可以看)
不可重复度:在一个事务中。连续两次读到的数据结果不一样。
例如:
老师下一次布置作业的时候,规定提交的时间(时间之后可以修改作业)。
写:张三在提交结束前上传了作业。
读:老师正在批改张三的作业。
写:这时候,有道题,张三突然有解题思路,又把作业进行修改,再次提交了作业。
读:老师批改张三作业和之前的不一样了。看不到修改前的那道题是怎样写的。
为了解决不可重复读,给读加锁,(我在读的时候,你不可以修改)
幻读:在同一个事务中,两次读到的结果集不一样。
例如:
老师下一次布置作业,规定在提交作业时间之后不可以再次修改作业。
写:张三提交了作业。
读:老师进行批改作业,看现在提交作业人数有27人。
写:李四问张三有啥作业,却被告之,少写了一道题。又将作业进行撤回。
读:老师批改到一半,看现在提交作业人数只有26人。
在同一个事务中,两次读的结果集不一样。
总结:
以上就是我总结的Mysql的索引和事务,若上面若错误的,请各位铁子留言纠错,若感觉不错,请一键三联。