带你一文看懂MySqL中的事务与索引

子查询:在一条sql语句中嵌入在其他sql语句中的select语句,也叫嵌套查询

        单行子查询:返回一行记录的子查询。

                查询与“成绩优秀” 同学的同班同学:

select * from student where classes_id=(select classes_id from student where 
name='成绩优秀');

       多行子查询:返回多行记录的子查询(关键字IN和NOT IN)

select * from score where course_id in (select id from course where name='语文' or name='数学');

select * from score where course_id not in (select id from course where name!='语文' and name!='数学');

先将语文和数学的课程ID获取出来,然后使用成绩表的每一条数据在集合中进行对比,是否在集合中,IN适用于子条件结果较少的场景。

        多列包含查询

select * from score sco where exists (select sco.id from course cou where (name='语文' or name='英文') and cou.id = sco.course_id);

select * from score sco where not exists (select sco.id from course cou where (name!='语文' and name!='英文') and cou.id = sco.course_id);

先从成绩表中取出成绩,然后将成绩的课程ID放到子条件中进行查询判断查询结果是否为真,若为真则取出,若为假则丢弃。适用于后表数据记录较多的场景。

合并查询:将多条sql语句的执行结果合并到一起--union,union all,前后查询的结果集中,字段需要一致。

union该操作符用于取得两个结果集的并集。当使用该操作符时,自动去掉结果集中的重复行。

select * from course where id<3 union select * from course where name='英文';
-- 或者使用or来实现
select * from course where id<3 or name='英文';

union all:该操作符用于取得两个结果的并集。当使用该操作符时,不会去掉结果集中的重复行。

select * from course where id<3 union all select * from course where name='英文';

索引与事务:

语句后边加上\G可以改变表的查看方式。

索引:数据库中对数据进行存储的一种数据结构。

         类型:存储结构:B/B+树,hash,...

         作用:索引就像是一本书中内容的目录,大大提高对于数据检索的效率。

         使用性质:主键索引、唯一键索引、外键索引、普通索引

         聚簇索引:索引的叶子节点就是数据,索引与数据都是顺序存储。

                          一张表只能有一个。针对范围性或有序的数据查询效率较高。

                          在插入数据时需要调整存储结构效率较低,常用于自增属性的主键(尽可能少的调整存储结构)

         非聚簇索引:索引与数据都是单独存储,数据的存储是无序的。可以有多个。        

         创建:创建数据库表的时候,会伴随主键(PRIMARY KEY),唯一键(UNIQUE),外键(FOREIGN KEY)而创建索引。

            创建普通索引: create index 索引名 on 表名(字段名);//直接针对某张表

             通过修改表结构添加主键或唯一键或外键方式添加索引:

                                            alter table student add unique key uk(name);

             查看索引:show index from 表名;

             删除索引:drop index 索引名 on 表名;

事务:将多条SQL语句当作一个整体进行执行的功能。

          操作:

                开始事务:start  transaction

                回滚事务:rollback

                提交事务:commit

start transaction;
--小明账户减少2000
update accout set money=money-2000 where name = '阿里巴巴';
-- 小黑账户增加2000

update accout set money=money+2000 where name = '四十大盗';
commit;

事务存在的必要性:当数据库不支持事务的时候有可能出现的情况。

      脏写:事务A进行了一条数据的修改操作;在事务还没有提交的时候事务B又对数据进行修改

带你一文看懂MySqL中的事务与索引_第1张图片

 脏读:事务A开始事务,修改了数据;事务B查询到了修改后数据;事务A提交或回滚事务。

举个例子:财务给小明发了5000工资,修改了数据库;小明一查账户自己收到5000;财务发现工资发错了,回滚了事务,读取到了事务还没提交之前所作的修改。

带你一文看懂MySqL中的事务与索引_第2张图片

 

 不可重复读:事务A先读取数据;事务B修改数据;事务B提交事务;事务A再次读取数据,事务A在不同的阶段所读取到的数据不同。

带你一文看懂MySqL中的事务与索引_第3张图片

 幻读:事务A读取某个范围内的记录;事务B天机了一条记录;事务B提交事务;事务A再次读取范围内的记录。(主要针对数据的添加/删除)

带你一文看懂MySqL中的事务与索引_第4张图片

特性:

       原子性:要么操作全部完成,要么就不做

       一致性:若数据库只包含了完整的事务则处于一致性;若事务进行中出现异常中断,则处于非一致性。(一致性基于原子性实现)

       持久性:事务一旦提交,就会进行持久化存储的磁盘中

       隔离性:保证并发中多个事务不会互相产生影响。

事务的隔离级别:

带你一文看懂MySqL中的事务与索引_第5张图片

 查看当前数据库的隔离级别:select @@tx_isolation;

                                                网页IM系统,两个用户若是同时注册,是怎么保证不会重复注册?

当前数据库的隔离级别是可重复度--不会出现脏读,幻读,不可重复读情况;查询数据不再存在则添加,在当前数据库的隔离级别下不会出现重复注册。

 

 

 

 

         

你可能感兴趣的:(mysql,索引)