网站建设捌金手指花总二,支持wordpress的主机,泰安网络公司推荐,seo网站案例1、什么是数据库事务#xff1f;
数据库事务: 是数据库管理系统执行过程中的一个逻辑单位#xff0c;由一个有限的数据库操作序列构成#xff0c;这些操作要么全部执行,要么全部不执行#xff0c;是一个不可分割的工作单位。
2、Mysql事务的四大特性是什么#xff1f;
…1、什么是数据库事务
数据库事务: 是数据库管理系统执行过程中的一个逻辑单位由一个有限的数据库操作序列构成这些操作要么全部执行,要么全部不执行是一个不可分割的工作单位。
2、Mysql事务的四大特性是什么
原子性 事务作为一个整体被执行包含在其中的对数据库的操作要么全部被执行要么都不执行。一致性 指在事务开始之前和事务结束以后数据不会被破坏假如A账户给B账户转10块钱不管成功与否A和B的总金额是不变的。隔离性 多个事务并发访问时事务之间是相互隔离的即一个事务不影响其它事务运行效果。持久性 表示事务完成以后该事务对数据库所作的操作更改将持久地保存在数据库之中。
3、事务ACID特性的实现原理
原子性是使用 undo log 来实现的如果事务执行过程中出错或者用户执行了rollback系统通过undo log日志返回事务开始的状态。持久性使用 redo log 来实现只要redo log日志持久化了当系统崩溃即可通过redo log把数据恢复。隔离性通过锁以及 MVCC,使事务相互隔离开。一致性通过回滚、恢复以及并发情况下的隔离性从而实现一致性。
有关MVCC相关知识可以参考:看一遍就懂MVCC原理详解
4、事务的隔离级别有哪些
读未提交Read Uncommitted最低级别任何情况都无法保证读已提交Read Committed可避免脏读的发生可重复读Repeatable Read可避免脏读、不可重复读的发生串行化Serializable可避免脏读、不可重复读、幻读的发生
Mysql默认的事务隔离级别是可重复读(Repeatable Read)
5、什么是脏读、不可重复读、幻读呢
脏读: 脏读指的是读到了其他事务未提交的数据未提交意味着这些数据可能会回滚也就是可能最终不会存到数据库中也就是不存在的数据。读到了并不一定最终存在的数据这就是脏读。不可重复读: 不可重复读指的是在一个事务内最开始读到的数据和事务结束前的任意时刻读到的同一批数据出现不一致的情况。幻读: 幻读并不是说两次读取获取的结果集不同幻读侧重的方面是某一次的 select 操作得到的结果的数据状态无法支撑后续的业务操作。更为具体一些select 某记录是否存在不存在准备插入此记录但执行 insert 时发现此记录已存在无法插入此时就发生了幻读。
具体看之前写的一篇文章一文详解脏读、不可重复读、幻读
6、datetime和timestamp的区别
它们和date的区别在于: date存储精度到天它们存储精度都为秒。
它们的区别在于
datetime 的日期范围是 1001——9999 年timestamp 的时间范围是 1970——2038 年datetime 存储时间与时区无关timestamp 存储时间与时区有关显示的值也依赖于时区datetime 的存储空间为 8 字节timestamp 的存储空间为 4 字节datetime 的默认值为 nulltimestamp 的字段默认不为空(not null)默认值为当前时间(current_timestamp)
7、varchar和char有什么区别
char是一个定长字段,假如申请了char(10)的空间,那么无论实际存储多少内容.该字段都占用10个字符,而varchar是变长的,也就是说申请的只是最大长度,占用的空间为实际字符长度1,最后一个字符存储使用了多长的空间。
在检索效率上来讲,char varchar,因此在使用中,如果确定某个字段的值的长度,可以使用char,否则应该尽量使用varchar.例如存储用户MD5加密后的密码,则应该使用char。
8、count(1)、count(*) 与 count(列名) 的区别
count(*)包括了所有的列相当于行数在统计结果的时候不会忽略列值为NULLcount(1)包括了忽略所有列用1代表代码行在统计结果的时候不会忽略列值为NULLcount(列名)只包括列名那一列在统计结果的时候会忽略列值为空这里的空表示null的计数即某个字段值为NULL时不统计。
阿里巴巴Java开发手册有一条强制建议不要使用count(列名)或count(常量)来代替count(*)。count(*)就是SQL92定义的标准统计行数语法跟数据库无关。
9、exist和in的区别
-- inselect * from a where id in (select id from b);-- existsselect * from A where exists(select 1 from B where B.id A.id);
使用in时,sql语句是先执行子查询也就是先查询子表b再查主表a。而使用exists是先查主表a ,再查询子表b。
根据小表驱动大表(即小的数据集驱动大的数据集)的原则,如果主查询中的表较大且又有索引时应该用in。 反之如果外层的主查询记录较少子查询中的表大又有索引时使用exists。
还有一点注意的是用 exists 该子查询实际上并不返回任何数据而是返回值True或False。
not in 和not exists
如果查询语句使用了not in 那么内外表都进行全表扫描没有用到索引而not extsts 的子查询依然能用到表上的索引。所以无论那个表大用not exists都比not in要快。
10、truncate、delete与drop区别
| | delete | truncate | drop | | -------- | ---------------------------------------- | ------------------------------ | -------------------------------------------------- | | 类型 | DML | DDL | DDL | | 回滚 | 可回滚 | 不可回滚 | 不可回滚 | | 删除内容 | 表结构还在删除表的全部或者一部分数据行 | 表结构还在删除表中的所有数据 | 表结构也会删除所有的数据行索引和权限也会被删除 | | 删除速度 | 删除速度慢逐行删除 | 删除速度快 | 删除速度最快 |
11、union与union all的区别
Union对两个结果集进行并集操作不包括重复行同时进行默认规则的排序Union All对两个结果集进行并集操作包括重复行不进行排序
从效率上说union all 要比union快很多所以如果可以确认合并的两个结果集中不包含重复的数据的话那么就使用union all
12、group by 和 distinct 的区别
它们本质语言逻辑上的数据处理动作先后是不一样distinct 是先获取结果集再去重复记录。group by 是基于KEY先分组再返回计算结果。
从效率上来讲 group by和distinct都能使用索引,在相同语义下从执行效率上也看不到明显的差异;
那为什么大家都更推崇使用group by
group by语义更为清晰group by可对数据进行更为复杂的一些处理
由于distinct关键字会对所有字段生效在进行复合业务处理时group by的使用灵活性更高group by能根据分组情况对数据进行更为复杂的处理例如通过having对数据进行过滤或通过聚合函数对数据进行运算。
13、Blob和text有什么区别
Blob用于存储二进制数据而Text用于存储大字符串。Blob值被视为二进制字符串字节字符串,它们没有字符集并且排序和比较基于列值中的字节的数值。text值被视为非二进制字符串字符字符串。它们有一个字符集并根据字符集的排序规则对值进行排序和比较。
14、常见的存储引擎有哪些
Mysql中常用的四种存储引擎分别是MyISAM、InnoDB、MEMORY、ARCHIVE。Mysql 5.5版本后默认的存储引擎为InnoDB。
15 说一说InnoDB与MyISAM的区别
MyISAM和InnoDB两者之间还是有着明显区别
1) 事务支持
MyISAM不支持事务而InnoDB支持。
2) 表锁差异
MyISAM只支持表级锁。
InnoDB支持事务和行级锁是innodb的最大特色。行锁大幅度提高了多用户并发操作的新能。但是InnoDB的行锁,只有在索引上才可能是行锁否则还是表锁。
3索引结构
MyISAM引擎使用BTree作为索引结构叶节点的data域存放的是数据记录的地址即MyISAM索引文件和数据文件是分离的MyISAM的索引文件仅仅保存数据记录的地址。MyISAM中索引检索的算法为首先按照BTree搜索算法搜索索引如果指定的Key存在则取出其data域的值然后以data域的值为地址读取相应数据记录。MyISAM的索引方式也叫做“非聚集”的。
InnoDB引擎也使用BTree作为索引结构但是InnoDB的数据文件本身就是索引文件叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键因此InnoDB表数据文件本身就是主索引。这种索引叫做“聚焦索引”。InnoDB的辅助索引的data域存储相应记录主键的值而不是地址。
4表主键
MyISAM允许没有任何索引和主键的表存在索引都是保存行的地址。 InnoDB如果没有设定主键或者非空唯一索引就会自动生成一个6字节的主键(用户不可见)数据是主索引的一部分其它索引保存的是主索引的值。
5) 表的具体行数
MyISAM保存有表的总行数如果select count(*) from table;会直接取出出该值。
InnoDB没有保存表的总行数(只能遍历)如果使用select count(*) from table就会遍历整个表消耗相当大但是在加了where条件后myisam和innodb处理的方式都一样。
6) 外键
MyISAM不支持
InnoDB支持
16 bin log/redo log/undo log是什么
bin log、redo log、undo log三种日志属于不同级别的日志按照Mysql的划分可以分为服务层和引擎层两大层bin log是在服务层实现的redo log、undo log是在引擎层实现的且是innodb引擎独有的主要和事务相关。
1、bin log
bin log是Mysql数据库级别的文件记录对Mysql数据库执行修改的所有操作不会记录select和show语句。使用任何存储引擎的 Mysql 数据库都会记录 binlog 日志。
在实际应用中 binlog 的主要使用场景有两个分别是 主从复制 和 数据恢复 。
主从复制 在 Master 端开启 binlog 然后将 binlog发送到各个 Slave 端 从而达到主从数据一致。 数据恢复 通过使用 Mysqlbinlog 工具来恢复数据。
2、redo log
redo log中记录的是要更新的数据比如一条数据已提交成功并不会立即同步到磁盘而是先记录到redo log中等待合适的时机再刷盘为了实现事务的持久性。
如果没有redo log,那么每次事务提交的时候将该事务涉及修改的数据页全部刷新到磁盘中。但是这么做会有严重的性能问题主要体现在两个方面
因为 Innodb 是以 页 为单位进行磁盘交互的而一个事务很可能只修改一个数据页里面的几个字节这个时候将完整的数据页刷到磁盘的话太浪费资源了
一个事务可能涉及修改多个数据页并且这些数据页在物理上并不连续使用随机IO写入性能太差
因此 Mysql 设计了 redo log 具体来说就是只记录事务对数据页做了哪些修改这样就能完美地解决性能问题了(相对而言文件更小并且是顺序IO)。
3、undo log
除了记录redo log外当进行数据修改时还会记录undo logundo log用于数据的撤回操作它保留了记录修改前的内容。通过undo log可以实现事务回滚并且可以根据undo log回溯到某个特定的版本的数据实现MVCC。
17 bin log和redo log有什么区别
bin log会记录所有日志记录包括InnoDB、MyISAM等存储引擎的日志redo log只记录innoDB自身的事务日志。bin log只在事务提交前写入到磁盘一个事务只写一次而在事务进行过程会有redo log不断写入磁盘。bin log是逻辑日志记录的是SQL语句的原始逻辑redo log是物理日志记录的是在某个数据页上做了什么修改。
18 说一下数据库的三大范式
第一范式数据表中的每一列每个字段都不可以再拆分。第二范式在第一范式的基础上非主键列完全依赖于主键而不能是依赖于主键的一部分。第三范式在满足第二范式的基础上表中的非主键只依赖于主键而不依赖于其他非主键。
19 什么是存储过程有哪些优缺点
存储过程就是一些编译好了的SQL语句这些SQL语句代码像一个方法一样实现一些功能对单表或多表的增删改查然后给这些代码块取一个名字在用到这个功能的时候调用即可。
优点
存储过程是一个预编译的代码块执行效率比较高存储过程在服务器端运行减少客户端的压力允许模块化程序设计只需要创建一次过程以后在程序中就可以调用该过程任意次类似方法的复用一个存储过程替代大量SQL语句 可以降低网络通信量提高通信速率可以一定程度上确保数据安全
缺点
调试麻烦可移植性不灵活重新编译问题
20 主键使用自增ID还是UUID?
推荐使用自增ID,不要使用UUID。
因为在InnoDB存储引擎中,主键索引是作为聚簇索引存在的,也就是说,主键索引的B树叶子节点上存储了主键索引以及全部的数据(按照顺序),如果主键索引是自增ID,那么只需要不断向后排列即可,如果是UUID,由于到来的ID与原来的大小不确定,会造成非常多的数据插入,数据移动,然后导致产生很多的内存碎片,进而造成插入性能的下降。
21 超大分页怎么处理?
用id优化
先找到上次分页的最大ID,然后利用id上的索引来查询,类似于
select * from user where id1000000 limit 100
这样的效率非常快,因为主键上是有索引的,但是这样有个缺点,就是ID必须是连续的,并且查询不能有where语句,因为where语句会造成过滤数据。
用覆盖索引优化
Mysql的查询完全命中索引的时候,称为覆盖索引,是非常快的,因为查询只需要在索引上进行查找,之后可以直接返回,而不用再回表拿数据.因此我们可以先查出索引的ID,然后根据Id拿数据.
select * from table where id in (select id from table where age 20 limit 1000000,10)
在业务允许的情况下限制页数
建议跟业务讨论有没有必要查这么后的分页啦。因为绝大多数用户都不会往后翻太多页。
22 一个6亿的表a一个3亿的表b通过外间tid关联你如何最快的查询出满足条件的第50000到第50200中的这200条数据记录。
这是一道腾讯的面试题其实这个问题和上面是同一个问题都是超大分页的问题,这就像读书的时候做数学题一样上面是公式、定理下面是题目所以要学会举一反三。
1、如果A表TID是自增长,并且是连续的,B表的ID为索引
select * from a,b where a.tid b.id and a.tid500000 limit 200;
2、如果A表的TID不是连续的,那么就需要使用覆盖索引.TID要么是主键,要么是辅助索引,B表ID也需要有索引。
select * from b , (select tid from a limit 50000,200) a where b.id a .tid;
23 日常开发中是怎么优化SQL的
这个问题问的挺大的可以也先从几个大的纬度来回答。
添加合适索引优化表结构优化查询语句
然后针对每个大的纬度稍微讲几句。
1、添加合适索引
对作为查询条件和order by的字段建立索引。对于多个查询字段的考虑建立组合索引同时注意组合索引字段的顺序,将最常用作限制条件的列放在最左边依次递减。索引不宜太多一般5个以内。
2、优化表结构
选择正确的数据类型对于提高性能也是至关重要。下面给出几种原则:
数字型字段优于字符串类型
若只含数值信息的字段尽量不要设计为字符型这会降低查询和连接的性能并会增加存储开销。
数据类型更小通常更好
使用最小的数据类型,会减少磁盘的空间内存和CPU缓存。好比时间类型尽量使用TIMESTAMP类型因为其存储空间只需要 DATETIME 类型的一半。对于只需要精确到某一天的数据类型建议使用DATE类型因为他的存储空间只需要3个字节比TIMESTAMP还少。
尽量使用 NOT NULL
NULL 类型比较特殊SQL 难优化。如果是一个组合索引那么这个NULL 类型的字段会极大影响整个索引的效率。此外NULL 在索引中的处理也是特殊的也会占用额外的存放空间。
3、优化查询语句
分析语句是否加载了不必要的字段/数据。分析SQl执行计划是否命中索引等。如果SQL很复杂优化SQL结构如果表数据量太大考虑分表