MySQL基础知识

1、事务是什么,以及事务的四大特性?

事务的概念:

        1.事务是访问并可能更新数据库中各项数据的一个执行单元。

        2.事务是一个不可分割的数据库操作序列,也是数据库并发控制的基本单位。

        3.事务的执行结果必须使数据库从一种一致性状态变为另一种一致性的状态。

事务的生命周期:

        由事务开始和事务结束构成。

事务的四大特性:

        1、原子性:事务是一个不可分割的工作单位,整个事务中的所有操作要么全部提交成功,要么全部失败回滚。

        2、一致性:事务执行前后数据库的完整性必须保持一致。

        3、隔离性:事务的执行不能有其他事务的干扰,事务的内部操作和使用数据对其他的并发事务是隔离的,互不干扰。

        4、持久性:事务一旦提交。对数据库的改变就是永久的。

事务的应用:执行多条SQL语句


        public bool ACID(string[] strStudentNoScore) {          

            //打开数据库连接
            sqlcon.Open();

            //声明sql事务
            SqlTransaction myTrans;

            //sql命令对象
            SqlCommand mycmd = new SqlCommand();  

            //声明命令对象的连接数据库
            mycmd.Connection = sqlcon;

            //开启事务
            myTrans = sqlcon.BeginTransaction();

            //设置将在命令对象中执行的事务
            mycmd.Transaction = myTrans;

            try
            {
                //遍历字符串数组中的sql语句
                for (int i = 0; i < strStudentNoScore.Length; i++)
                {
                    mycmd.CommandText = strStudentNoScore[i];

                    int r =mycmd.ExecuteNonQuery();
                }

                //事务提交
                myTrans.Commit();
                return true;
            }
            catch (Exception)
            {
                //执行错误,事务回滚
                if (myTrans != null)
                    myTrans.Rollback();
                return false;
            }
            finally
            {
                //关闭连接                
                if (sqlcon != null)
                    sqlcon.Close();
            }

        }
       

    2、事务的隔离级别有哪些,MySQL默认是哪个?

事务的隔离级别是为了处理数据读取方面碰到的问题:即脏读、不可重复读、幻读。

脏读:一个事务读到了另一个事务正在处理且未提交的数据后,产生未提交的数据依赖现象。

不可重复读:数据库访问中,一个事务进行多次相同的查询,却返回不同的数据。

幻读:同一个事务中进行多次查询,却返回不同的结果集。

不可重复读对应的是Update操作,幻读对应的是Insert操作。幻读是不可重复读的一种特殊场景。

数据库事务的隔离级别从高到低有4种,Read uncommitted 、Read committed 、Repeatable read 、Serializable。

读未提交:一个事务可以读取到另一个事务未提交的数据。

读提交:一个事务要等另一个事务提交后才能读取到数据。

重复度:在事务开启时,不再允许修改操作。

序列化:事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。

Mysql的默认隔离级别是Repeatable read。

3、内连接与左外连接的区别?

内连接:inner join(等值连接) 只返回两个表中联结字段相等的数据。

左外连接也称左连接。以左表为基表,在FROM子句中使用关键字“LEFT OUTER JOIN”或关键字“LEFT JOIN”来连接俩张表。

1.内连接就是取交集的部分。
2.左连接就是左表全部的数据加上交集的数据。

4、InnoDB与MyISAM的区别?

一、InnoDB

1 、支持事务。
2 、使用的锁粒度默认为行级锁,可以支持更高的并发;也支持表锁。
3 、支持外键约束;外键约束其实降低了表的查询速度,增加了表之间的耦合度。

二、MyISAM

1 、不提供事务支持
2 、只支持表级锁
3 、不支持外键

总结:

• MyISAM 管理非事务表,提供高速存储和检索以及全文搜索能力,如果在应用中执行大量 select 操作,应该选择MyISAM。
• InnoDB 用于事务处理,具有 ACID 事务支持等特性,如果在应用中执行大量 insert update 操作,应该选择InnoDB。

5、Mybatis分页插件的原理?

首先分页参数放到 ThreadLocal 中,拦截执行的 sql ,根据数据库类型添加对应的分页语句重写 sql。 例 如:(select * from table where a) 转换为 (select count(*) from table where a) (select * from table where a limit ,) 计算出了total 总条数、 pageNum 当前第几页、 pageSize 每页大小和当前页的数据,是否为首页,是否为尾页,总页数等。

6、MySQL建表时注意什么?

MySQL 建表的经验有很多,下边列举一些:
1 、注意选择存储引擎,如果要支持事务需要选择 InnoDB
2 、注意字段类型的选择,对于日期类型如果要记录时分秒建议使用 datetime ,只记录年月日使用 date
类型,对于字符类型的选择,固定长度字段选择 char ,不固定长度的字段选择 varchar varchar char
节省空间但速度没有 char 快;对于内容介绍类的长广文本字段使用 text longtext 类型 ; 如果存储图片等
二进制数据使用 blob longblob 类型;对金额字段建议使用 DECIMAL ;对于数值类型的字段在确保取
值范围足够的前提下尽量使用占用空间较小的类型,
3 、主键字段建议使用自然主键,不要有业务意义,建议使用 int unsigned 类型,特殊场景使用 bigint
型。
4 、如果要存储 text blob 字段建议单独建一张表,使用外键关联。
5 、尽量不要定义外键,保证表的独立性,可以存在外键意义的字段。
6 、设置字段默认值,比如:状态、创建时间等。
7 、每个字段写清楚注释。
8 、注意字段的约束,比如:非空、唯一、主键等。

7、如何查看MySQL的执行计划?

方法一、使用explain执行下面语句:

explain select * from t_user;

方法二、使用图形化界面(Navicat)解释器

结果:

分析执行计划,重点关注id, type, key, rows, extra信息。id查看表加载顺序,type查看索引类型,key查看使用的具体索引,rows关注查找结果所需遍历的数据量大不大,extra关注其他一些影响性能的关键信息。

8、索引失效的情况?

1) 没有查询条件,或者查询条件没有建立索引 

2) 在查询条件上没有使用引导列 

3) 查询的数量是大表的大部分,应该是30%以上。 

4) 索引本身失效

5) 查询条件使用函数在索引列上,或者 对索引列进行运算, 运算包括(+,-,*,/,! 等) 错误的例子:select * from test where id-1=9; 正确的例子:select * from test where id=10; 

6) 对小表查询 

7) 提示不使用索引

8) 统计数据不真实 

9)like "%_" 百分号在前. 



9、什么是回表查询?

1.首先得知道Mysql 的 InnoDB引擎的索引结构即 B+树

B+ 树 索引主要分为两个:聚簇索引 和 非聚簇索引

  • 聚簇索引:也就是平常我们说的主键索引,在 B+ 树中叶子节点存的是整行数据。

  • 非聚簇索引:非聚集索引即索引结构和数据分开存放的索引。

我们如果使用主键查找,那么使用的是聚簇索引,能直接获取到数据,而如果我们使用非聚簇索引查找,如果该索引不包含我们需要查找的的全部字段,那么就需要根据叶子节点存储的主键值在进行一次查找来找到我们需要的数据,这就是回表查询。

2.回表查询需要二次查询,那么效率肯定就会低,那么为了解决这个问题,我们可以使用覆盖索引

如果一个索引包含(或者说覆盖)所有需要查询的字段的值,我们就称之为“覆盖索引”。

如主键索引,如果一条 SQL 需要查询主键,那么正好根据主键索引就可以查到主键。

再如普通索引,如果一条 SQL 需要查询 name,name 字段正好有索引, 那么直接根据这个索引就可以查到数据,也无需回表。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL是一种关系型数据库管理系统,它可以用来存储和管理数据。以下是一些MySQL基础知识: 1. 数据库MySQL中的数据库是一个容器,用于存储数据表和其他对象。 2. 数据表:数据表是MySQL中的基本对象,用于存储数据。每个数据表都有一个唯一的名称,并且包含一些列,每列都有一个数据类型。 3. 列:列是数据表中的一个字段,用于存储特定类型的数据。每个列都有一个名称和一个数据类型。 4. 行:行是数据表中的一个记录,包含一组值,每个值都对应一个列。 5. 主键:主键是数据表中的一个列,用于唯一标识每个记录。主键列的值必须是唯一的,并且不能为NULL。 6. 外键:外键是一个列,它引用了另一个表中的主键列。外键用于建立表之间的关系。 7. 索引:索引是一种数据结构,用于加快数据检索速度。MySQL支持多种类型的索引,包括B树索引和哈希索引。 8. 视图:视图是一个虚拟的表,它是由一个或多个数据表的查询结果组成的。视图可以简化复杂的查询,并提高查询性能。 9. 存储过程:存储过程是一种预编译的代码块,它可以接受参数并返回结果。存储过程可以简化复杂的操作,并提高数据库性能。 10. 触发器:触发器是一种特殊的存储过程,它会在数据表上执行特定的操作。触发器可以用于实现数据约束和业务逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值