mysql 面试题

文章详细阐述了MySQL数据库中的索引类型,包括B+树和哈希索引的差异,以及如何优化SQL查询,如使用覆盖索引、避免全表扫描等。同时,讨论了事务的隔离级别和InnoDB的事务实现原理,以及数据库连接池的作用和重要性。
摘要由CSDN通过智能技术生成
1、NOW()和CURRENT_DATE()有什么区别?
NOW()命令用于显示当前年份,月份,日期,小时,分钟和秒。

CURRENT_DATE()仅显示当前年份,月份和日期。
2、CHAR和VARCHAR的区别?
1.CHAR和VARCHAR类型在存储和检索方面有所不同

2.CHAR列长度固定为创建表时声明的长度,长度值范围是1到255

当CHAR值被存储时,它们被用空格填充到特定长度,检索CHAR值时需删除尾随空格。
3、主键索引与唯一索引的区别
1、 主键是一种约束,唯一索引是一种索引,两者在本质上是不同的。

2、 主键创建后一定包含一个唯一性索引,唯一性索引并不一定就是主键。

3、 唯一性索引列允许多个空值,而主键列不允许为空值。

4、 主键列在创建时,已经默认不为空值 ++ 唯一索引了。

5、 一个表最多只能创建一个主键,但可以创建多个唯一索引。

6、 主键更适合那些不容易更改的唯一标识,如自动递增列、身份证号等。

7、 主键可以被其他表引用为外键,而唯一索引不能。 
4、MySQL中有哪些不同的表格?
共有5种类型的表格:

1、 MyISAM

2、 Heap

3、 Merge

4、 INNODB

5、 ISAM
5、SQL的生命周期?
1、 应用服务器与数据库服务器建立一个连接

2、 数据库进程拿到请求sql

3、 解析并生成执行计划,执行

4、 读取数据到内存并进行逻辑处理

5、 通过步骤一的连接,发送结果到客户端

6、 关掉连接,释放资源
6、你怎么看到为表格定义的所有索引?
索引是通过以下方式为表格定义的:

SHOW INDEX FROM <tablename>;
7、数据库为什么使用B+树而不是B树
1、 B树只适合随机检索,而B+树同时支持随机检索和顺序检索;

2、 B+树空间利用率更高,可减少I/O次数,磁盘读写代价更低。一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储的磁盘上。这样的话,索引查找过程中就要产生磁盘I/O消耗。B+树的内部结点并没有指向关键字具体信息的指针,只是作为索引使用,其内部结点比B树小,盘块能容纳的结点中关键字数量更多,一次性读入内存中可以查找的关键字也就越多,相对的,IO读写次数也就降低了。而IO读写次数是影响索引检索效率的最大因素;

3、 B+树的查询效率更加稳定。B树搜索有可能会在非叶子结点结束,越靠近根节点的记录查找时间越短,只要找到关键字即可确定记录的存在,其性能等价于在关键字全集内做一次二分查找。而在B+树中,顺序检索比较明显,随机检索时,任何关键字的查找都必须走一条从根节点到叶节点的路,所有关键字的查找路径长度相同,导致每一个关键字的查询效率相当。

4、 B-树在提高了磁盘IO性能的同时并没有解决元素遍历的效率低下的问题。B+树的叶子节点使用指针顺序连接在一起,只要遍历叶子节点就可以实现整棵树的遍历。而且在数据库中基于范围的查询是非常频繁的,而B树不支持这样的操作。

5、 增删文件(节点)时,效率更高。因为B+树的叶子节点包含所有关键字,并以有序的链表结构存储,这样可很好提高增删效率。
8、数据库三大范式是什么
第一范式:每个列都不可以再拆分。

第二范式:在第一范式的基础上,非主键列完全依赖于主键,而不能是依赖于主键的一部分。

第三范式:在第二范式的基础上,非主键列只依赖于主键,不依赖于其他非主键。

在设计数据库结构的时候,要尽量遵守三范式,如果不遵守,必须有足够的理由。比如性能。事实上我们经常会为了性能而妥协数据库的设计。
9、怎么优化SQL查询语句吗
1、 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引

2、 用索引可以提高查询

3、 SELECT子句中避免使用*号,尽量全部大写SQL

4、 应尽量避免在 where 子句中对字段进行 is null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,使用 IS NOT NULL

5、 where 子句中使用 or 来连接条件,也会导致引擎放弃使用索引而进行全表扫描

6in 和 not in 也要慎用,否则会导致全表扫描
10、覆盖索引、回表等这些,了解过吗?
1、 覆盖索引: 查询列要被所建的索引覆盖,不必从数据表中读取,换句话说查询列要被所使用的索引覆盖。

2、 回表:二级索引无法直接查询所有列的数据,所以通过二级索引查询到聚簇索引后,再查询到想要的数据,这种通过二级索引查询出来的过程,就叫做回表。
11、MySQL数据库cpu飙升的话,要怎么处理呢?
排查过程:

1、 使用top 命令观察,确定是MySQLd导致还是其他原因。

2、 如果是MySQLd导致的,show processlist,查看session情况,确定是不是有消耗资源的sql在运行。

3、 找出消耗高的 sql,看看执行计划是否准确, 索引是否缺失,数据量是否太大。

处理:

1kill 掉这些线程(同时观察 cpu 使用率是否下降)2、 进行相应的调整(比如说加索引、改 sql、改内存参数)

3、 重新跑这些 SQL。

其他情况:

也有可能是每个 sql 消耗资源并不多,但是突然之间,有大量的 session 连进来导致 cpu 飙升,这种情况就需要跟应用一起来分析为何连接数会激增,再做出相应的调整,比如说限制连接数等
12、说说对SQL语句优化有哪些方法?(选择几条)
1、 Where子句中:where表之间的连接必须写在其他Where条件之前,那些可以过滤掉最大数量记录的条件必须写在Where子句的末尾.HAVING最后。

2、 用EXISTS替代IN、用NOT EXISTS替代NOT IN。

3、 避免在索引列上使用计算

4、 避免在索引列上使用IS NULL和IS NOT NULL

5、 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。

6、 应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描

7、 应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描
13、Innodb的事务与日志的实现方式
有多少种日志

innodb两种日志redo和undo。

日志的存放形式

1、 redo:在页修改的时候,先写到 redo log buffer 里面, 然后写到 redo log 的文件系统缓存里面(fwrite),然后再同步到磁盘文件( fsync)。

2、 Undo:在 MySQL5.5 之前, undo 只能存放在 ibdata文件里面, 5.6 之后,可以通过设置 innodb_undo_tablespaces 参数把 undo log 存放在 ibdata之外。

事务是如何通过日志来实现的

1、 因为事务在修改页时,要先记 undo,在记 undo 之前要记 undo 的 redo, 然后修改数据页,再记数据页修改的 redo。 Redo(里面包括 undo 的修改) 一定要比数据页先持久化到磁盘。

2、 当事务需要回滚时,因为有 undo,可以把数据页回滚到前镜像的 状态,崩溃恢复时,如果 redo log 中事务没有对应的 commit 记录,那么需要用 undo把该事务的修改回滚到事务开始之前。

3、 如果有 commit 记录,就用 redo 前滚到该事务完成时并提交掉。
14、非聚簇索引一定会回表查询吗?
不一定,如果查询语句的字段全部命中了索引,那么就不必再进行回表查询(哈哈,覆盖索引就是这么回事)。

举个简单的例子,假设我们在学生表的上建立了索引,那么当进行select age from student where age < 20的查询时,在索引的叶子节点上,已经包含了age信息,不会再次进行回表查询。
15、Hash索引和B+树所有有什么区别或者说优劣呢?
1、 首先要知道Hash索引和B+树索引的底层实现原理:

2、 hash索引底层就是hash表,进行查找时,调用一次hash函数就可以获取到相应的键值,之后进行回表查询获得实际数据。B+树底层实现是多路平衡查找树。对于每一次的查询都是从根节点出发,查找到叶子节点方可以获得所查键值,然后根据查询判断是否需要回表查询数据。

那么可以看出他们有以下的不同:

1、 hash索引进行等值查询更快(一般情况下),但是却无法进行范围查询。

2、 因为在hash索引中经过hash函数建立索引之后,索引的顺序与原顺序无法保持一致,不能支持范围查询。而B+树的的所有节点皆遵循(左节点小于父节点,右节点大于父节点,多叉树也类似),天然支持范围。

3、 hash索引不支持使用索引进行排序,原理同上。

4、 hash索引不支持模糊查询以及多列索引的最左前缀匹配。原理也是因为hash函数的不可预测。AAAA和AAAAB的索引没有相关性。

5、 hash索引任何时候都避免不了回表查询数据,而B+树在符合某些条件(聚簇索引,覆盖索引等)的时候可以只通过索引完成查询。

6、 hash索引虽然在等值查询上较快,但是不稳定。性能不可预测,当某个键值存在大量重复的时候,发生hash碰撞,此时效率可能极差。而B+树的查询效率比较稳定,对于所有的查询都是从根节点到叶子节点,且树的高度较低。

7、 因此,在大多数情况下,直接选择B+树索引可以获得稳定且较好的查询速度。而不需要使用hash索引。
16、select for update有什么含义,会锁表还是锁行还是其他。
select for update 含义

select查询语句是不会加锁的,但是select for update除了有查询的作用外,还会加锁呢,而且它是悲观锁哦。至于加了是行锁还是表锁,这就要看是不是用了索引/主键啦。

没用索引/主键的话就是表锁,否则就是是行锁。

select for update 加锁验证

表结构:

//id 为主键,name为唯一索引 CREATE TABLE `account` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `balance` int(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `idx_name` (`name`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=1570068 DEFAULT CHARSET=utf8

id为主键,select for update 1270070这条记录时,再开一个事务对该记录更新,发现更新阻塞啦,其实是加锁了。如下图:

我们再开一个事务对另外一条记录1270071更新,发现更新成功,因此,如果查询条件用了索引/主键,会加行锁~

我们继续一路向北吧,换普通字段balance吧,发现又阻塞了。因此,没用索引/主键的话,select for update加的就是表锁
17、你们数据库是否支持emoji表情存储,如果不支持,如何操作?
更换字符集utf8-->utf8mb4
18、索引的数据结构(b树,hash)
索引的数据结构和具体存储引擎的实现有关,在MySQL中使用较多的索引有Hash索引,B+树索引等,而我们经常使用的InnoDB存储引擎的默认索引实现为:B+树索引。对于哈希索引来说,底层的数据结构就是哈希表,因此在绝大多数需求为单条记录查询的时候,可以选择哈希索引,查询性能最快;其余大部分场景,建议选择BTree索引。

B树索引

MySQL通过存储引擎取数据,基本上90%的人用的就是InnoDB了,按照实现方式分,InnoDB的索引类型目前只有两种:BTREE(B树)索引和HASH索引。B树索引是MySQL数据库中使用最频繁的索引类型,基本所有存储引擎都支持BTree索引。通常我们说的索引不出意外指的就是(B树)索引(实际是用B+树实现的,因为在查看表索引时,MySQL一律打印BTREE,所以简称为B树索引)



查询方式:

1、 主键索引区:PI(关联保存的时数据的地址)按主键查询,

2、 普通索引区:si(关联的id的地址,然后再到达上面的地址)。所以按主键查询,速度最快

B+tree性质:

1、 n棵子tree的节点包含n个关键字,不用来保存数据而是保存数据的索引。

2、 所有的叶子结点中包含了全部关键字的信息,及指向含这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。

3、 所有的非终端结点可以看成是索引部分,结点中仅含其子树中的最大(或最小)关键字。

4、 B+ 树中,数据对象的插入和删除仅在叶节点上进行。

5、 B+树有2个头指针,一个是树的根节点,一个是最小关键码的叶节点。

哈希索引

简要说下,类似于数据结构中简单实现的HASH表(散列表)一样,当我们在MySQL中用哈希索引时,主要就是通过Hash算法(常见的Hash算法有直接定址法、平方取中法、折叠法、除数取余法、随机数法),将数据库字段数据转换成定长的Hash值,与这条数据的行指针一并存入Hash表的对应位置;如果发生Hash碰撞(两个不同关键字的Hash值相同),则在对应Hash键下以链表形式存储。当然这只是简略模拟图。
19、最左匹配原则?
在创建联合索引时候,一般需要遵循最左匹配原则。即联合索引中的属性识别度最高的放在查询语句的最前面。
20、对于关系型数据库而言,索引是相当重要的概念,请回答有关索引的几个问题:
1.索引的目的是什么?

快速访问数据表中的特定信息,提高检索速度

创建唯一性索引,保证数据库表中每一行数据的唯一性。

加速表和表之间的连接

使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间

2.索引对数据库系统的负面影响是什么?

负面影响:

创建索引和维护索引需要耗费时间,这个时间随着数据量的增加而增加;索引需要占用物理空间,不光是表需要占用数据空间,每个索引也需要占用物理空间;当对表进行增、删、改、的时候索引也要动态维护,这样就降低了数据的维护速度。

3.为数据表建立索引的原则有哪些?

在最频繁使用的、用以缩小查询范围的字段上建立索引。

在频繁使用的、需要排序的字段上建立索引

4.什么情况下不宜建立索引?

对于查询中很少涉及的列或者重复值比较多的列,不宜建立索引。

对于一些特殊的数据类型,不宜建立索引,比如文本字段(text)等
21、什么是最左前缀原则?什么是最左匹配原则?
最左前缀原则,就是最左优先,在创建多列索引时,要根据业务需求,where子句中使用最频繁的一列放在最左边。

当我们创建一个组合索引的时候,如(k1,k2,k3),相当于创建了(k1)、(k1,k2)(k1,k2,k3)三个索引,这就是最左匹配原则。。
22、myisamchk是用来做什么的?
它用来压缩MyISAM表,这减少了磁盘或内存使用。
23、说说分库与分表的设计
分库分表方案,分库分表中间件,分库分表可能遇到的问题

「分库分表方案:」

1、 水平分库:以字段为依据,按照一定策略(hash、range等),将一个库中的数据拆分到多个库中。

2、 水平分表:以字段为依据,按照一定策略(hash、range等),将一个表中的数据拆分到多个表中。

3、 垂直分库:以表为依据,按照业务归属不同,将不同的表拆分到不同的库中。

4、 垂直分表:以字段为依据,按照字段的活跃性,将表中字段拆到不同的表(主表和扩展表)中。

「常用的分库分表中间件:」

1、 sharding-jdbc(当当)

2、 Mycat

3、 TDDL(淘宝)

4、 Oceanus(58同城数据库中间件)

5、 vitess(谷歌开发的数据库中间件)

6、 Atlas(Qihoo 360)

「分库分表可能遇到的问题」

1、 事务问题:需要用分布式事务啦

2、 跨节点Join的问题:解决这一问题可以分两次查询实现

3、 跨节点的count,order by,group by以及聚合函数问题:分别在各个节点上得到结果后在应用程序端进行合并。

4、 数据迁移,容量规划,扩容等问题

5、 ID问题:数据库被切分后,不能再依赖数据库自身的主键生成机制啦,最简单可以考虑UUID

6、 跨分片的排序分页问题(后台加大pagesize处理?)
24、什么情况下设置了索引但无法使用
1.以“%”开头的LIKE语句,模糊匹配

2\、OR语句前后没有同时使用索引

3\、数据类型出现隐式转化(如varchar不加单引号的话可能会自动转换为int型)
25、什么是数据库连接池?为什么需要数据库连接池呢?
连接池基本原理:

数据库连接池原理:在内部对象池中,维护一定数量的数据库连接,并对外暴露数据库连接的获取和返回方法。

应用程序和数据库建立连接的过程:

1、 通过TCP协议的三次握手和数据库服务器建立连接

2、 发送数据库用户账号密码,等待数据库验证用户身份

3、 完成身份验证后,系统可以提交SQL语句到数据库执行

4、 把连接关闭,TCP四次挥手告别。

数据库连接池好处:

1、 资源重用 (连接复用)

2、 更快的系统响应速度

3、 新的资源分配手段

4、 统一的连接管理,避免数据库连接泄漏
27、列对比运算符是什么?
在SELECT语句的列比较中使用=<><=<> =><<>><=>,AND,OR或LIKE运算符。
28、按照锁的粒度分,数据库锁有哪些呢?锁机制与InnoDB锁算法
按锁粒度分有:表锁,页锁,行锁

按锁机制分有:乐观锁,悲观锁
29、LIKE声明中的%和_是什么意思?
%对应于0个或更多字符,_只是LIKE语句中的一个字符。

如何在Unix和MySQL时间戳之间进行转换?

UNIX_TIMESTAMP是从MySQL时间戳转换为Unix时间戳的命令

FROM_UNIXTIME是从Unix时间戳转换为MySQL时间戳的命令
30、如何定位及优化SQL语句的性能问题?创建的索引有没有被使用到?或者说怎么才可以知道这条语句运行很慢的原因?
对于低性能的SQL语句的定位,最重要也是最有效的方法就是使用执行计划,MySQL提供了explain命令来查看语句的执行计划。 我们知道,不管是哪种数据库,或者是哪种数据库引擎,在对一条SQL语句进行执行的过程中都会做很多相关的优化,对于查询语句,最重要的优化方式就是使用索引。 而执行计划,就是显示数据库引擎对于SQL语句的执行的详细情况,其中包含了是否使用索引,使用什么索引,使用的索引的相关信息等。

 



 

执行计划包含的信息 id 有一组数字组成。表示一个查询中各个子查询的执行顺序;

1、 id相同执行顺序由上至下。

2、 id不同,id值越大优先级越高,越先被执行。

3、 id为null时表示一个结果集,不需要使用它查询,常出现在包含union等查询语句中。

select_type 每个子查询的查询类型,一些常见的查询类型。



table 查询的数据表,当从衍生表中查数据时会显示 x 表示对应的执行计划id partitions 表分区、表创建的时候可以指定通过那个列进行表分区。 举个例子:

create table tmp ( id int unsigned not null AUTO_INCREMENT, name varchar(255), PRIMARY KEY (id) ) engine = innodb partition by key (id) partitions 5;

type(非常重要,可以看到有没有走索引) 访问类型

1、 ALL 扫描全表数据

2、 index 遍历索引

3、 range 索引范围查找

4、 index_subquery 在子查询中使用 ref

5、 unique_subquery 在子查询中使用 eq_ref

6、 ref_or_null 对Null进行索引的优化的 ref

7、 fulltext 使用全文索引

8、 ref 使用非唯一索引查找数据

9、 eq_ref 在join查询中使用PRIMARY KEYorUNIQUE NOT NULL索引关联。

10、 possible_keys 可能使用的索引,注意不一定会使用。查询涉及到的字段上若存在索引,则该索引将被列出来。当该列为 NULL时就要考虑当前的SQL是否需要优化了。

11、 key 显示MySQL在查询中实际使用的索引,若没有使用索引,显示为NULL。

12、 TIPS:查询中若使用了覆盖索引(覆盖索引:索引的数据覆盖了需要查询的所有数据),则该索引仅出现在key列表中

13、 key_length 索引长度

14、 ref 表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值

15、 rows 返回估算的结果集数目,并不是一个准确的值。

16、 extra 的信息非常丰富,常见的有:

17、 Using index 使用覆盖索引

18、 Using where 使用了用where子句来过滤结果集

19、 Using filesort 使用文件排序,使用非索引列进行排序时出现,非常消耗性能,尽量优化。

20、 Using temporary 使用了临时表 sql优化的目标可以参考阿里开发手册

推荐

SQL性能优化的目标:至少要达到 range 级别,要求是ref级别,如果可以是consts最好

说明:

1、 consts 单表中最多只有一个匹配行(主键或者唯一索引),在优化阶段即可读取到数据。

2、 ref 指的是使用普通的索引(normal index)。

3、 range 对索引进行范围检索。

反例:

explain表的结果,type=index,索引物理文件全扫描,速度非常慢,这个index级别比较range还低,与全表扫描是小巫见大巫。
### [2、索引有哪几种类型?]

主键索引: 数据列不允许重复,不允许为NULL,一个表只能有一个主键。

唯一索引: 数据列不允许重复,允许为NULL值,一个表允许多个列创建唯一索引。

1、 可以通过 `ALTER TABLE table_name ADD UNIQUE (column);` 创建唯一索引

2、 可以通过 `ALTER TABLE table_name ADD UNIQUE (column1,column2);` 创建唯一组合索引

普通索引: 基本的索引类型,没有唯一性的限制,允许为NULL值。

1、 可以通过`ALTER TABLE table_name ADD INDEX index_name (column);`创建普通索引

2、 可以通过`ALTER TABLE table_name ADD INDEX index_name(column1, column2, column3);`创建组合索引

全文索引: 是目前搜索引擎使用的一种关键技术。

可以通过`ALTER TABLE table_name ADD FULLTEXT (column);`创建全文索引
 [3、前缀索引]

1、语法:`index(field(10))`,使用字段值的前10个字符建立索引,默认是使用字段的全部内容建立索引。

2、前提:前缀的标识度高。比如密码就适合建立前缀索引,因为密码几乎各不相同。

3、实操的难度:在于前缀截取的长度。

4、 我们可以利用`select count(*)/count(distinct left(password,prefixLen));`,通过从调整`prefixLen`的值(从1自增)查看不同前缀长度的一个平均匹配度,接近1时就可以了(表示一个密码的前`prefixLen`个字符几乎能确定唯一一条记录)
[5、联合索引是什么?为什么需要注意联合索引中的顺序?]
MySQL可以使用多个字段同时建立一个索引,叫做联合索引。在联合索引中,如果想要命中索引,需要按照建立索引时的字段顺序挨个使用,否则无法命中索引。

具体原因为:
MySQL使用索引时需要索引有序,假设现在建立了"name,age,school"的联合索引,那么索引的排序为: 先按照name排序,如果name相同,则按照age排序,如果age的值也相等,则按照school进行排序。
当进行查询时,此时索引仅仅按照name严格有序,因此必须首先使用name字段进行等值查询,之后对于匹配到的列而言,其按照age字段严格有序,此时可以使用age字段用做索引查找,以此类推。因此在建立联合索引的时候应该注意索引列的顺序,一般情况下,将查询需求频繁或者字段选择性高的列放在前面。此外可以根据特例的查询或者表结构进行单独的调整。
 [6、Myql中的事务回滚机制概述]
事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位,事务回滚是指将该事务已经完成的对数据库的更新操作撤销。
要同时修改数据库中两个不同表时,如果它们不是一个事务的话,当第一个表修改完,可能第二个表修改过程中出现了异常而没能修改,此时就只有第二个表依旧是未修改之前的状态,而第一个表已经被修改完毕。而当你把它们设定为一个事务的时候,当第一个表修改完,第二表修改出现异常而没能修改,第一个表和第二个表都要回到未修改的状态,这就是所谓的事务回滚
[7、MySQL中有哪几种锁,列举一下?]

如果按锁粒度划分,有以下3种:
1、 表锁: 开销小,加锁快;锁定力度大,发生锁冲突概率高,并发度最低;不会出现死锁。
2、 行锁: 开销大,加锁慢;会出现死锁;锁定粒度小,发生锁冲突的概率低,并发度高。
3、 页锁: 开销和加锁速度介于表锁和行锁之间;会出现死锁;锁定粒度介于表锁和行锁之间,并发度一般
 [8、limit 1000000 加载很慢的话,你是怎么解决的呢?]  

方案一:如果id是连续的,可以这样,返回上次查询的最大记录(偏移量),再往下limit

select id,name from employee where id>1000000 limit 10.
方案二:在业务允许的情况下限制页数:
建议跟业务讨论,有没有必要查这么后的分页啦。因为绝大多数用户都不会往后翻太多页。
方案三:order by + 索引(id为索引)

select id,name from employee order by id  limit 1000000,10

方案四:利用延迟关联或者子查询优化超多分页场景。(先快速定位需要获取的id段,然后再关联)
SELECT a.* FROM employee a, (select id from employee where 条件 LIMIT 1000000,10 ) b where a.id=b.id
 [9、MySQL中int(20)和char(20)以及varchar(20)的区别]
1、 int(20) 表示字段是int类型,显示长度是 20
2、 char(20)表示字段是固定长度字符串,长度为 20
3、 varchar(20) 表示字段是可变长度字符串,长度为 20
[10、什么是内连接、外连接、交叉连接、笛卡尔积呢?]
1、 内连接(inner join):取得两张表中满足存在连接匹配关系的记录。
2、 外连接(outer join):取得两张表中满足存在连接匹配关系的记录,以及某张表(或两张表)中不满足匹配关系的记录。
3、 交叉连接(cross join):显示两张表所有记录一一对应,没有匹配关系进行筛选,也被称为:笛卡尔积。

[11、drop、delete与truncate的区别]

deletetruncatedrop
类型DMLDDLDDL
回滚可回滚不可回滚不可回滚
删除内容表结构还在,删除表的全部或者一部分数据行表结构还在,删除表中的所有数据从数据库中删除表,所有的数据行,索引和权限也会被删除
删除速度删除速度慢,逐行删除删除速度快删除速度最快
[12、MySQL的复制原理以及流程]
「主从复制原理,简言之,就三步曲,如下:」
1、 主数据库有个bin-log二进制文件,纪录了所有增删改Sql语句。(binlog线程)
2、 从数据库把主数据库的bin-log文件的sql语句复制过来。(io线程)
3、 从数据库的relay-log重做日志文件中再执行一次这些sql语句。(Sql执行线程)
上图主从复制分了五个步骤进行:
步骤一:主库的更新事件(update、insert、delete)被写到binlog
步骤二:从库发起连接,连接到主库。
步骤三:此时主库创建一个binlog dump thread,把binlog的内容发送到从库。
步骤四:从库启动之后,创建一个I/O线程,读取主库传过来的binlog内容并写入到relay log
步骤五:还会创建一个SQL线程,从relay log里面读取内容,从Exec_Master_Log_Pos位置开始执行读取到的更新事件,将更新内容写入到slave的db
 [13、Innodb的事务实现原理?]
1、 原子性:是使用 undo log来实现的,如果事务执行过程中出错或者用户执行了rollback,系统通过undo log日志返回事务开始的状态。
2、 持久性:使用 redo log来实现,只要redo log日志持久化了,当系统崩溃,即可通过redo log把数据恢复。
3、 隔离性:通过锁以及MVCC,使事务相互隔离开。
4、 一致性:通过回滚、恢复,以及并发情况下的隔离性,从而实现一致性。
 [14、UNION与UNION ALL的区别?]
1、 Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序;
2、Union All:对两个结果集进行并集操作,包括重复行,不进行排序;
3 、UNION的效率高于 UNION ALL
 [15、事务的隔离级别有哪些?MySQL的默认隔离级别是什么?]
1、 读未提交(Read Uncommitted)
2、 读已提交(Read Committed)
3、 可重复读(Repeatable Read)
4、 串行化(Serializable)
MySQL默认的事务隔离级别是可重复读(Repeatable Read)
 [16、隔离级别与锁的关系]
1、在Read Uncommitted级别下,读取数据不需要加共享锁,这样就不会跟被修改的数据上的排他锁冲突
2、 在Read Committed级别下,读操作需要加共享锁,但是在语句执行完以后释放共享锁;
3、 在Repeatable Read级别下,读操作需要加共享锁,但是在事务提交之前并不释放共享锁,也就是必须等待事务执行完毕以后才释放共享锁。
4、 SERIALIZABLE 是限制性最强的隔离级别,因为该级别**锁定整个范围的键**,并一直持有锁,直到事务完成。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值