MySQL数据库面试题[万字汇总]

news2024/10/7 16:26:55

1) MySQL数据库相关错题本

1、存储引擎相关

1、MySql的存储引擎的不同

MySQL存储引擎主要有InnoDB, MyISAM, Memory, 这三个区别在于:

  1. Memory是内存数据引擎, 会断电重启(在双M或者主从架构下会产生较多异常), 且不支持行级锁. 默认索引是数组索引, 支持B+索引

  1. InnoDB和MyISAM的区别: 事务(日志), 索引(主键, 外键索引,文件组织结构), 锁级别,

  • 事务处理方面:MyISAM强调的是性能,查询的速度比InnoDB更快,但是,不支持事务,InnoDB是支持事务的。

  • 外键:InnoDB支持外键,MyISAM不支持。

  • 锁:InnoDB支持行锁和表锁,默认会使用行锁,而MyISAM只是支持表锁。由于行锁是能更好的支持并发操作,因此,InnoDB更加适合插入和更新操作较多的情况,而MyISAM适用于频繁查询操作。

  • 全文索引:MyISAM支持全文索引,InnoDB不支持。但是,在5.6版本开始InnoDB也开始支持全文索引。

  • 表主键:MyISAM允许没有主键的表存在,而InnoDB如果不存在主键,会自动生成一个6字节的主键。

  • 查询表的行数[count(*)]差异:InnoDB不保存表的函数信息,因此,select count(*)时会扫描整个表来进行计算;MyISAM内置了计数器,只需要简单的读取保存好的行数即可。

2 简单说一下存储引擎做了什么?

存储引擎主要负责的是数据的存储和提取.

3. InnoDB是否有hash索引

InnoDB没有Hash索引, MySQL的其他数据引擎,如Memory就支持Hash索引.

4.InnoDB使用delete删除一条数据后, 数据什么时候从硬盘上真正消失? 什么时候页合并

数据在删除后, 会产生标志位, 会形成数据空洞. 然后数据不会被删除,只会被覆盖. 如果一个页上所有的数据都被删除了, 那么整页将会被认为可重用, 不会被删除.

所以如果delete删除所有表数据, 数据文件的size不会变小.

-- TODO

5. InnoDB在没有主键时, 会帮我们创建主键, 这个主键我们可以作为查询条件吗?

不可以, 因为这个主键对用户不可见, 所以如果没有主键的话, 就无法使用主键索引了.

InnoDB建议我们自己建表时声明一个主键,如果没有会找到第一个非空唯一索引作为主键,如果没有才会自己生成一个6字节的主键,并且这个主键是由MySQL提供下一位主键的值, 多表会产生竞争, 总之InnoDB强烈建议一定要有自增的主键.

6. 一张有自增id的表,当数据记录到了20之后,删除了第18,19,20条记录,再把MySQL重启,再插入一条记录,这条记录的id是21还是18呢?

当表的引擎采用MyISAM时,是21,当表的引擎采用InnoDB时是18。

MyISAM引擎会把表自增主键的最大id记录到数据文件中,做了持久化,重启后也不会消失,而InnoDB是将自增主键的最大id记录在内存中,重启后,会丢失。

2 Mysql事务相关问题

1、事务的四个特性,并发事务可能出现的问题, 以及MySQL(InnoDB)具体落地的相关措施

ACID, 核心就是一致性, 它是通过MVCC解决脏读和不可重复读问题, 通过nextKeyLock中的行锁和间隙锁避免幻读,通过redoLog和MySQL的binLog来保证事务的可回滚.

PS: 丢失修改是由锁处理,幻读是通过next-key-lock来解决的.

2. 为什么批量插入建议使用手动提交事务

因为每条sql语句都是一个单独的事务, 而开启事务和提交事务都需要消耗资源, 使用手动提交, 可以大大减少开启和提交事务造成的损耗.

事务相关的代码:

start transaction;-- 开启事务
rollback;
commit;

3. 为什么有很多公司不使用默认的RR级别, 而是用RC级别呢?(和行锁范围和MVCC有关)

3.1 MySQL默认RR隔离级别的原因

主要和MySQL主从复制相关,因为MySQL在主从复制过程中是通过binlog进行数据同步的,而MySQL早期只有statement这种binlog格式,这种格式下,binlog记录的是SQL语句的原文。事务之间可能存在强制的前后关系, 但是原语无法完美回放,这就会导致备库在进行SQL回放之后,结果和主库不一致。

为了解决这个问题,MySQL采用了RR这种隔离级别,因为在RR中,会在更新数据的时候增加记录锁的同时增加间隙锁,可以避免事务乱序的情况发生。

后续版本中提供了row 和mix的binlog格式, 如果需要修改隔离级别为RC, 需要把statement改为row格式.

3.2 为什么大厂要将隔离级别修改成RC?

3.2.1 与MVCC的开启有关

在RC中,每次读取都会重新生成一个快照,不使用MVCC, 总是读取行的最新版本。

在RR中,使用MVCC, 快照会在事务中第一次查询语句执行时生成,是看不到其它事务所提交的更改。

在RC级别中,支持半一致读,一条update语句,如果where条件匹配到的记录已经加锁,那么InnoDB会返回记录最近提交的版本,由MySQL上层判断此是否真的需要加锁。

3.2.2 与间隙锁有关

在RC中,只会对索引增加行锁,不会添加另外两种锁。

在RR中,为了解决幻读问题,三种锁都支持。

3.2.3 与主从同步有关

MySQL的binlog主要支持三种格式,分别是statement、row和mixed。

在RC中,只支持row格式的binlog。如果指定了mixed作为binlog格式,那么如果使用RC,服务器会自动使用基于row格式的日志记录。

在RR中,可以同时支持三种格式的binlog。

3.2.4 为什么选择RC?

大厂之所以使用RC,主要原因有二,其一是提升并发,其二是减少死锁。

为什么RC要比RR并发度好?

因为RC在加锁过程中,是不需要添加Gap Lock和Next-Key Lock的,只需要对要修改的记录添加行级锁就行了。另外,RC还支持半一致读,可以大大的减少了更新语句时行锁的冲突。对于不满足更新条件的记录,可以提前释放锁,提升并发度。

为什么RC可以减少死锁发生?

因为RR会增加Gap Lock和Next-Key Lock,这就使得锁的粒度变大了,那么就容易导致死锁的概率增大(占地太宽了,别人占不到地方了)。

4. 为什么redoLog+binLog才能回滚事务, 一个binLog不可以吗? 为什么?

4.1 redo Log和binLog的区别:

  1. redo log 是 InnoDB 引擎特有的;binlog 是 MySQL 的 Server 层实现的,所有引擎都可以使用。

  1. redo log 是物理日志,记录的是“在某个数据页上做了什么修改,实现 crash-safe,即使数据库发生异常重启,之前提交的记录都不会丢失。而 binlog 是逻辑日志,记录的是写入性操作(不包括查询)信息,比如“给 ID=5 这一行的 c 字段加 1 ”,保证数据的一致性。

  1. redo log 是循环写的,空间固定会用完;binlog 是可以追加写入的。“追加写”是指 binlog 文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。

  1. binlog 仅在事务提交时记录,并且对于每一个事务,仅包含对应事务的一个日志。而对于 redo log,由于其记录的是物理操作日志,因此每个事务对应多个日志条目。

4.2 两阶段提交

4.3 为什么需要redoLog才能做到crash-safe.

由于 binlog 记录的是写入性操作,如果想用 binlog 来恢复数据,我们必须知道现在得从哪里开始,因为一条语句多执行几次会带来数据上的错误。但是 binlog 虽然保存了所有的历史操作,但是它没有标识每条操作是否已经写入磁盘,所以我们确定从哪开始。

而 redo log 记录的是数据页的更改,并且刷盘完成的数据会从 redo log 中删除。

5. innodb里,为什么不采用MyISAM的count(*)的计数方案?

因为InnoDB支持事务, 需要在事务中手动更新count的值。 不能再采用同一变量的方案了。

3. 查询优化相关问题

1.创建索引, 查看索引,删除索引的语句

  • 创建索引一共有三种方案, 一种是建表时, 一种是修改表结构(以索引为主,以表结构为主).

  • # 主键索引, 索引 CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, INDEX [indexName] (username(length)) );

  • # 修改表结构 ALTER TABLE table_name ADD INDEX index_name(column_name);

  • # 创建index在表上. CREATE INDEX index_name ON table_name (column_name)

  • 查看索引

  • SHOW INDEX FROM [表名] FROM [库名]

  • 删除索引

  • DROP INDEX [索引名] ON [表名]

  • ALTER TABLE [表名] DROP (INDEX index_name)/(PRIMARY KEY)/(FOREIGN KEY fk_name);

2. 对于逻辑上保证唯一的列, 唯一索引和普通索引,如何选择.

选择普通索引, 因为唯一索引会使ChangeBuffer优化无效. ChangeBuffer 能合并对磁盘的操作, 从而减少IO消耗.

但是阿里的规范里推荐使用唯一索引, 因为'逻辑上保证唯一'这一点往往无法实现, 使用唯一索引可以避免污染数据, 在重复问题产生时就可以发现而不是等到之后.

3. 字符串不加引号会使索引失效吗? 为什么

因为发生了隐式转化, 相当于Java调用了toString函数, 调用了函数所以无法使用索引.

4.where a = 1 or b =2如果a有索引, b没有, 会使索引失效吗?

会使索引失效. 因为就算a使用了索引, b依然会触发全表扫描, 那么使用a索引就显得多此一举. 如果b有索引,那么就会Using sort union(a_idx,b_idx)

5. 在一个大表上, 这个表只有四个字段(id, username, password, status); sql如下, 如何优化?

SELECT id, username , password FROM user  WHERE username='abcd';

建立username前缀索引.

6. 说一下索引的设计原则, 不少于四条

  1. 选择性越大越好, 低于0.2的建议不建立索引.

  1. 读操作比例越大的越适合建立索引

  1. 一般一个表不建议建5个索引以上

  1. 组合索引的建立原则: 能够尽可能的用上索引覆盖的顺序建立组合索引

  1. 在小表上不建议建立索引, 因为mysql可能会认为全表扫描代价更大, 从而全表扫描,浪费空间.

**7. 简单说一下你知道的主键的设计原则 **

  1. 主键最好是不要用uuid这种只保证唯一而不保证有序的列作为主键, 会产生较多的页分裂.

  1. 一般建议使用自增索引, 或者业务能保证递增,唯一的列.

  1. 分布式情况下, 可以使用推特的雪花算法或者美团的leaf算法.

8. 如果需要建立一个组合索引, a 列升序,B 列降序, 语法应该怎么写?

ALTER TABLE ADD INDEX a_asc_b_des (a asc, b dec);

9. 说一下 Using filesort 和 Using index 的区别.

fileSort重点不是file,而是调用了排序算法, 如果需要排序的内容比较多, MySQL内存可能不够用的话,那么会把中间结果存到临时表里, 这种排序操作会很浪费内存和CPU资源, 所以一般建议使用索引的有序性来解决.

10. limit语句如何优化? sql如下

select * from user order by user_id limit 60000,10 ;(100w数据耗时 0.19s)
# 首先分析下, 拖慢性能的原因是因为limit 需要跳过前2000000条, 所以就需要先便利前面的数据

# 1. limit要求需要按照索引顺序从前往后扫描60000行, 所以比较慢
# 2. select * 和 select 某一列,主要的区别在于MySQL的内存在读一列或几列时, 能够读取更多的数据, select * 会扫描所有数据, 所以会读磁盘更多次.
# 3. select 非索引和selct 索引的区别在于"索引覆盖"

所以第一步先只使用id定位到目标第一行,然后再让id > 目标id, limit 10即可
select * from choice where choice_id>=(select choice_id from choice limit 60000,1) limit 10;(100w数据耗时 0.02s)

11. count(*), count(id),count(column(not null)),count(column),count(1),count(100)的区别

count本质上就是取括号里的内容,然后判断是否为null.

所以如果列数越好, 并且没有null的可能, 那么一定是最快的. 按照这个结论可以排序如下:

count(column) < count(*) < count(column(not null)) ≈ count(id) < count(1) = count(100)

然后 MySQL在这里做了一个优化: count(*) 优化为count(1).

12. 为什么建议每列都有默认值,最好是加上not null约束

NULL列需要行中的额外空间来记录它们的值是否为NULL。每个NULL列需要额外一位,向上舍入到最近的字节。

3. SQL性能分析, 你怎么去做?

  1. 慢查询日志, mysql 会将执行时间大于某一个阈值的sql记录到慢查询日志里面.

  1. profile, 通过'SET profiling = 1'开启 profile分析,通过命令查看所有操作花费的时间:show profiles;;通过上一步得到的Query_id,查询指定Query_id的SQL语句的各个阶段花费的时间: show profile for query query_id;

  1. explain, 分析sql执行具体情况.

4. 如何查看慢查询日志?

  1. 启用慢查询日志配置: set global slow_query_log=’ON’; 可以更新long_query_time的值, 如默认为10.000, 那么大于10s的会被记录

  1. 设置打印格式: set global log_output=’FILE’;

  1. 插入执行时间大于我们设定的值的慢查询sql : select * from mysql.slow_log;

5. limit 语句如何优化?

回表查询优化分页,

# 原sql: 
select id, name from tableName limit 1000,10
# 优化sql:
# 主要通过利用普通索引加速全表扫描来进行优化, (回表IO相对于全表扫描可以忽略不记)
select g1.id, g1,name inner join (select id from tableName order by column limit 1000,10) t1 on g1.id=t1.id;

select id, name from tableName where id in (select id from tableName order by column limit 1000,10);
# inner join和in的区别.
# 主要就是inner join, MySQL更会优化一些, 一般建议用Inner join, 只有少数特殊情况, 如子集中的个数有限且较少时.

6. order by是如何排序的, 如何优化

  • 全字段排序, 就是直接全表扫描所有需要返回的字段.

  • 如果一行的全字段长度大于max_length_for_sort_data, 会使用row_id排序, 就是只让order By的条件列参与排序,这样好处就是减少对sort_buffer大小的依赖, 坏处就是增加了回表次数

  • 使用索引, 直接有序, 然后回表

  • 使用组合索引, 产生索引覆盖, 来解决索引产生的回表问题,.

优化:

  1. 排序的字段增加索引(类似从sort()变成TreeList.)

  1. 增大 sort buffer 的大小 ,

  1. 不要用 * 作为查询列表,只返回需要的列, 尽可能减少参与sort的列, 以及之后使用索引的话, 尽可能使用索引覆盖.

7. order by 列, 这一列有索引就一定会用吗?

不会, 因为MySQL可能认为回表代价太大, 一般来说我们都是通过limit一个较小值, 这样回表代价较小, InnoDB就更可能走索引,

8. count(*) 在innodb 中有哪些优化.

建议自己使用变量计数, 因为innodb计数需要进行全表扫描, 不想myisam有一个变量记录, 主要原因就是innodb支持了事务, 而因为同一时刻可能有多条事务未提交或已提交, 所以InnoDB认为有必要重新计数.

解决方案也很简单, 就是自己在数据库里维护一个变量, 这样这个变量也会通过MVCC维护历史版本, 每次count(*)的时候,就会利用MVCC的机制来得到正确的count值.

当然InnoDB对count(*)还有一格优化, 就是尽可能使用普通索引树, 这是因为非主键索引的叶子节点更少, 能通过更少的磁盘IO得到结果.

此外, count(*)≈count(1)>count(主键) > count(普通索引) > count(字段), OceanBase 推荐使用count(*)进行计数

9. 建立索引的原则

  • 最左前缀匹配原则,MySQL会遇到范围查询停止匹配,所以会导致组合索引失效。

  • 索引列不进行函数运算。

  • 注意一个表建立索引的数量,不是索引建的越多越好,维护索引也会有很大的开销。

  • 尽量选择区分度高的字段作为索引。

  • where语句中,经常使用的字段应该考虑建立索引。

  • 分组和排序语句中,经常使用的字段应该考虑建立索引。

  • 两个表关联字段考虑建立索引。

  • like模糊查询中,只有右模糊查询才会使用索引。

  • 在varchar 字段上建立索引时,必须指定索引长度。

  • 禁止建立超过3个字段的联合索引。

  • 尽量采用覆盖索引,避免回表查询。

  • 索引优化的目标:至少要达到range级别,要求是ref级别,如果可以是consts最好。

索引失效的情况

  • 使用组合索引,没有满足最左匹配原则,导致失效。

  • or语句所有字段必须都有索引,否则失效。

  • like以%开头,索引失效。

  • 需要类型转换。

  • where中索引列有运算。

  • where中索引列使用了函数。

  • 如果mysql觉得全表扫描更快时(数据少)。

身份证建立索引的话, 如何存储读取最快呢?,

倒排取前六位即可

4. Mysql锁的问题

1、MySQL的锁级别都有哪些?

全表锁->备份用, 只读, 在主从时很危险.

表级锁->元数据锁, 表锁.

0行级锁->行锁, 间隙锁, nextKeyLock.

2. Mysql有那些锁? 作用场景是什么? 为什么?

意向锁在保证并发性的前提下,实现了行锁和表锁共存且满足事务隔离性的要求.

因为如果需要加表排他锁, 就需要保证本表中不存在任何行锁.

需要加表共享锁的话, 需要保证本表中只存在行共享锁. 我们不可能在加表锁前逐行判断, 所以有意向锁这个东西, 主要是为了保证加表锁之前能够快速判断是否有行锁存在.

3. next-key lock算法是怎么避免幻读问题的.

通过间隙锁, 锁住行之间的间隙,能够阻塞其他插入数据的事务, 从而规避掉多次读取产生的数据增加问题.

4. InnoDB什么时候是行锁?

有索引, 并且sql语句的筛选条件是索引, 那么会用到行锁,.

比如: WHERE id = 1;

5. 说说悲观锁和乐观锁

悲观锁是指在数据处理过程中,从一开始就使数据处于锁定状态,直到更改完成才释放。

MySQL中悲观锁使用以下方式:select...for update

例如:

select name from item where id = 200 for update;
insert into orders(id,item_id) values(null,100)
update item set count = count - 1 where id = 100;

我们使用select name from item where id = 200 for update;对id为200的数据进行了锁定,其他要对该条数据进行修改,必须等到该事务提交之后,否则无法修改。这样就保证了并发的安全性。

需要注意的是:select...for update语句必须在事务中使用。

悲观锁虽然能够解决并发安全的问题,但是,这种锁定会导致性能降低,加锁时间过长,并发性不好,影响系统的整体性能。因此,这种方式在实际的开发中用的很少。

乐观锁是相对悲观锁而言的,认为数据一般情况下不会出现冲突,所以在数据进行更新的时候,才会将数据锁定。

乐观锁的实现方式

  • 使用数据版本(version)机制实现

该方式是在每次更新数据的时候,都要对更新的数据进行version版本+1操作。

其具体原理是:读取数据时,将此版本一同读出,之后,更新数据时,对此版本+1,每次提交数据时,如果提交的数据版本大于或等于数据库表中的版本,则可以更新,说明是最新数据,否则,不予更新,说明数据已经过期。

  • 使用时间戳实现

该机制和version是类似的,也是需要再表中增加一个字段,类型使用时间类型即可。

原理:在更新数据时,检查数据库中当前的时间戳和更新前取到的时间戳,如果对比一致,就予以更新,否则不更新。

悲观锁可以在并发量不大的情况下使用,并发量大的情况下,使用乐观锁,大多数情况下都建议使用乐观锁。

6. InnoDB 行锁锁住了谁?

InnoDB的行锁,就是通过锁住索引来实现的 // TODO

5. MySQL 体系常见问题.

1. MySQL体系结构, 简述一下

  1. 连接器 : 对接JDBC. navicat等连接. 在这里登陆后就授权, 此次授权不可被踢下.

  1. 分析器 : 词法分析,语法分析生成sql语法树, 负责编译sql,

  1. 优化器 : 执行计划生成,选择索引. 优化器选择多种方案中较优的一种.

  1. 执行器 : 判断权限,调用存储引擎.

  1. 存储引擎: 提供读写接口 说白了就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。

2. 为啥缓存被弃用?

MySQL的缓存不适应多核环境, 因为在多核机器上,大量查询会导致大量的互斥锁争用.

3. 判断是否有查询权限, 在那一层判断的.

执行器上判断连接器获得的权限是否可以执行sql.

4. Buffer Pool中的Page有哪些状态? 有哪些链表?分别有什么作用?

5. Change Buffer的意义是什么?

ChangeBuffer有效的减少随机读的代价.

redoLog减少随机写的代价.

6. MVCC和ReadView介绍一下.

MVCC全称:Multi-Version Concurrency Control , 多版本并发控制. 当事务开启的时候, 会生成时间戳, 对于其读所需要访问的列, 主要起到逻辑全表备份的作用, 从而减少加锁带来的开销. 主要作用于RC级别和RR级别, 在RU和S级别用不到,因为RU不加锁, S级别对所有读到的数据都加锁.

ReadView是事务在快照读的时候生成的一致性快照. 当事务执行快照读的那一刻,会生成一份当前数据库的快照. 他由当前未提交的事务id数组和已创建的最大事务id组成, 查询的数据结果需要跟read view 做对比得到结果.

7. 存储过程少用? 为什么

用sql写逻辑业务, 对程序员要求较高; 一旦出现问题,调试起来比较困难;一旦需求变更/扩展, sql更改困难.

8. Mysql的 磁盘架构

9. 空洞是什么? 有哪些操作会造成空洞。

空洞即没有值的数据槽. 比如一行数据被删除后就会产生一条空洞; 删除数据, 新增和更新都可能产生页分裂, 页分裂也会产生空洞.

空洞对应用层最大的影响应该就是删除表数据,但idb文件大小不会缩减, 即使你删除表大部分数据, 也不会减小文件占用大小, 这种情况一般需要使用turncate或者重建表结构..

10. truncate和delete有什么区别?

truncate table:删除内容、不删除定义、释放空间

delete table:删除内容、不删除定义、不释放空间

drop table:删除内容、删除定义、释放空间

具体来说,有以下区别:

  • truncate table 只能删除表中全部数据,delete from 可以删除表中的全部数据也可以部分删除。

  • delete from记录是一条条删除的,删除的每一行记录都会进日志,而truncate一次性删除整个页,日志只会记录页的释放。

  • truncate删除后不能回滚,delete则可以。

  • truncate的删除速度比delete快。

  • delete删除后,删除的数据占用的存储空间还存在,可以恢复数据;truncate则空间不存在,同时不能恢复数据。

总的来说,其差别在于,truncate删除是不可恢复的,同时空间也不存在,不支持回滚,而delete删除正好相反。

分表之后想让一个id多个表是自增的,效率实现

使用单独的数据库或者使用Redis来生成, 前者有性能瓶颈, 后者引入了其他中间件. 还有一些常规的解决方案如Twitter的雪花算法和美团的叶子分布式算法.

  1. group by 如何禁止排序.

  1. Mysql怎么分表,以及分表后如果想按条件分页查询怎么办(如果不是按分表字段来查询的话,几乎效率低下,无解)

  1. MySql的主从实时备份同步的配置,以及原理(从库读主库的binlog),读写分离

"You have an error in your SQL syntax" 是在那一层报出的.

分析器, 语法编译时报错

6. 基础语法问题

1. EXISTS关键词的使用方法

EXISTS表示是否存在,使用EXISTS时,如果内存查询语句查询到符合条件的值,就返回一个true,否则,将返回false。

例如:

SELECT * FROM user 
    where EXISTS
    (SELECT name FROM employee WHERE id=100)

如果employee表中存在id为100的员工,内层查询就会返回一个true,外层查询接收到true后,开始查询user表中的数据,因为where没有设置其他查询条件,所以,将查询出user的全部数据。

2. 内连接(inner join)和外连接的区别?

  • 内连接:只会查询出两表连接符合条件的记录。

SELECT * FROM user1 u1 INNER JOIN user2 u2 ON u1.id = u2.id;

如上sql所示,只会查询到user1和user2关联符合条件的记录。

外连接分为左外连接、右外连接和全外连接。

  • 左外连接

它的原理是:以左表为基准,去右表匹配数据,找不到匹配的用NULL补齐。其显示左表的全部记录和右表符合连接条件的记录。

  • 右外连接

它的原理是:以右表为基准,去左表匹配数据,找不到匹配的用NULL补齐。其显示右表的全部记录和左表符合连接条件的记录。这正好与左外连接相反。

  • 全外连接

除了显示符合连接条件的记录之外,两个表的其他数据也会显示出来。

inner join 和 left join性能谁优谁劣?

外查询是在内查询的基础上,进而进行查询操作的。因此,我们从理论上可以得出,内连接的执行效率是更好一些的。

但是,外连接也是会进行优化操作的,在编译优化阶段,如果左连接的结果和内连接一样,左连接查询会转换成内连接查询,但这也表明编译优化器也认为内连接的效率是更高的。

虽然从查询的结果来看一般不会有太大的区别,但是,如果左右表之间的数据差别很大,内连接的效率是明显更高的,因为左连接以左表为基准,并且会进行回表操作。

最后,给出一个结论:在外连接和内连接都可以实现需求时,建议使用内连接进行操作。

3. 存储过程是什么,优势是什么,为什么不建议使用?

存储过程:为了完成特定功能的SQL语句集,存储在数据库中,一次编译后永久有效,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象。在数据量特别庞大的情况下利用存储过程能达到倍速的效率提升。

优势

  • 存储过程是预编译的,因此执行速度较快;

  • 存储过程在服务端执行,减少客户端的压力;

  • 减少网络流量,客户端只需要传递存储过程名称和参数即可进行调用,减少了传输的数据量;

  • 一次编写,任意次执行,复用的思想简单便捷;

  • 安全性较高,因为在服务端执行,管理员可以对存储过程进行权限限制,能够避免非法的访问,保证数据的安全性。

缺点

  • 调试麻烦,可移植性查。

这一个缺点也是存储过程在实际开发中用的不多的原因,现在开发的理念是简便

4. sql语句应该考虑哪些安全性

  • 防止sql注入,对sql语句尽量进行过滤同时使用预编译的sql语句绑定变量

  • 查询错误信息不要返回给用户,将错误记录到日志

  • 最小用户权限设置,最好不要使用root用户连接数据库

  • 定期做数据备份,避免数据丢失

27. 视图中允许存在函数或者分组吗?

不允许.

28.视图有哪些作用

1.使用简单,

2.数据安全,不被授权的不会被修改,

3,逻辑数据独立(屏蔽真实表结构变化)

mysql用的是TCP还是UDP

TCP和Socket(前者是跨机器, 后者是统一机器内交互)

其他问题

阿里一面:查询操作方法需要使用事务吗

在RR级别, 需要开事务, read-only的事务.

1. 两阶段锁协议是什么? 什么是两阶段提交呢? 这两者区别是啥?

两阶段锁是指所有的事务必须分两个阶段对数据项加锁和解锁;

两阶段提交的经典实例就是redoLog个binLog, 他也是保证数据强一制的算法.

2. WAL技术是啥?

WAL(Write Ahead Log)预写日志,是数据库系统中常见的一种手段,用于保证数据操作的原子性和持久性; 在使用 WAL 的系统中,所有的修改在提交之前都要先写入 log 文件中。

比如, 写数据表之前, 会先写入binLog, 然后binLog执行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/179289.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

流批一体计算引擎-5-[Flink]的Python Table API和SQL程序

参考Flink从入门到入土&#xff08;详细教程&#xff09; 参考flink的默认窗口触发机制 参考彻底搞清Flink中的Window 参考官方Python API文档 1 IDEA中运行Flink 从Flink 1.11版本开始, PyFlink 作业支持在 Windows 系统上运行&#xff0c;因此您也可以在 Windows 上开发和…

【数据结构】极致详解:树与二叉树(上)——结构与概念

目录 &#x1f6eb;前言&#x1f6eb;&#xff1a; &#x1f680;一、树&#x1f680;&#xff1a; 1.树的概念&#xff1a; 2.树的相关概念&#xff1a; 3.树的表示&#xff1a; 4.树的实际使用场景&#xff1a; &#x1f6f0;️二、二叉树&#x1f6f0;️&#xff1a;…

acwing-Diango项目 (后半)

acwing-Django项目 文章目录acwing-Django项目前言5. 创建账号系统5.1用户名密码登录写登录界面写注册界面写动作 实现三个函数 register login logout5.2 Web端acapp一键登录在django中集成redis(准备工作)首先 pip install django_redis配置一下缓存启动redis-serverredis在d…

特征工程——文本特征

文本特征 expansion编码 consolidation编码 文本长度特征 标点符号特征 词汇属性特征 特殊词汇特征 词频特征 TF-IDF特征 LDA特征 下面的文章主要是梯度提升树模型展开的&#xff0c;抽取的特征主要为帮助梯度提升树模型挖掘其挖掘不到的信息&#xff0c;本文介绍的所…

NodeJS Web 框架 Express 之中间件

NodeJS Web 框架 Express 之中间件参考描述中间件next()一个简单的中间件函数使用全局中间件局部中间件共享注意事项位置next()分类错误级中间件内置中间件express.urlencoded()express.json()第三方中间件参考 项目描述哔哩哔哩黑马程序员搜索引擎Bing 描述 项目描述Edge109…

从0-1开始 测试ZLMediaKit推拉流性能、延时性能

流媒体开发系列文章 文章目录流媒体开发系列文章前言一、环境准备&#xff1f;二、拉流测试过程三、推流测试过程三、延时测试总结前言 目前、比较有名的流媒体服务器有ZLMediaKit、srs、live555、eadydarwin等。因为srs是单线程服务、对于多核服务器的支持需要通过部署多个服…

pytorch深度学习基础(十一)——常用结构化CNN模型构建

结构化CNN模型构建与测试前言GoogLeNet结构Inception块模型构建resNet18模型结构残差块模型构建denseNet模型结构DenseBlocktransition_block模型构建结尾前言 在本专栏的上一篇博客中我们介绍了常用的线性模型&#xff0c;在本文中我们将介绍GoogleNet、resNet、denseNet这类…

APT之木马静态免杀

前言 这篇文章主要是记录手动编写代码进行木马免杀&#xff0c;使用工具也可以免杀&#xff0c;只不过太脚本小子了&#xff0c;而且工具的特征也容易被杀软抓到&#xff0c;指不定哪天就用不了了&#xff0c;所以要学一下手动去免杀木马&#xff0c;也方便以后开发一个只属于…

blender导入骨骼动画方法[psa动作]

先导入女性的psk文件 然后调整缩放大小和人物一样,包括角度朝向. ctrla应用所有改变 然后选择psk文件以及其他人物模型的全部 ,然后 在Layout-物体-父级 -附带空顶相点组 image.png之后会发现所有人物多了修改器,点击其中一个修改器 点添加修改器 -数据传递 勾选顶点数据-选择顶…

人员动作行为AI分析系统 yolov5

人员动作行为AI分析系统通过pythonyolo系列网络学习模型&#xff0c;对现场画面人员行为进行实时分析监测&#xff0c;自动识别出人的各种异常行为动作&#xff0c;立即抓拍存档预警同步回传给后台。 我们使用YOLO算法进行对象检测。YOLO是一个聪明的卷积神经网络(CNN)&#xf…

带滤波器的PID控制仿真-1

采用低通滤波器可有效地滤掉噪声信号&#xff0c;在控制系统的设计中是一种常用的方法。基于低通滤波器的信号处理实例设低通滤波器为&#xff1a;采样时间为1ms&#xff0c;输入信号为带有高频正弦噪声&#xff08; 100Hz&#xff09;的低频&#xff08;0.2Hz)正弦信号。采用低…

离散数学与组合数学-05树

文章目录离散数学与组合数学-05树5.1 认识树5.1.1 树的模型5.1.2 树的应用5.2 无向树5.2.1 定义5.2.2 树的性质5.2.3 性质应用5.3 生成树5.3.1 引入5.3.2 定义5.3.3 算法5.3.4 应用5.4 最小生成树5.4.1 引入5.4.2 定义5.4.3 算法5.5 根树5.5.1 根数定义5.5.2 倒置法5.5.3 树的家…

【编程入门】开源记事本(SwiftUI版)

背景 前面已输出多个系列&#xff1a; 《十余种编程语言做个计算器》 《十余种编程语言写2048小游戏》 《17种编程语言10种排序算法》 《十余种编程语言写博客系统》 《十余种编程语言写云笔记》 本系列对比云笔记&#xff0c;将更为简化&#xff0c;去掉了网络调用&#xff0…

C++模板进阶

这篇文章是对模板初阶的一些补充&#xff0c;让大家在进行深一层的理解。 文章目录1. 非类型模板参数2. 模板的特化2.1 概念2.2 函数模板特化2.3 类模板特化2.3.1 全特化2.3.2 偏特化2.4 类模板特化应用示例3 模板分离编译3.1 什么是分离编译3.2 模板的分离编译3.3 解决方法4.…

【各种**问题系列】什么是 LTS 长期支持

目录 &#x1f341; 什么是长期支持&#xff08;LTS&#xff09;版本&#xff1f; &#x1f342; LTS 版本的优点&#xff1a; &#x1f341; 什么是 Ubuntu LTS&#xff1f; &#x1f342; Ubuntu LTS 软件更新包括什么&#xff1f; 在 Linux 的世界里&#xff0c;特别是谈…

【Java开发】Spring Cloud 08 :链路追踪

任何一个架构难免会出现bug&#xff0c;微服务相比于单体架构日志查询更为困难&#xff0c;因此spring cloud推出了Sleuth等组件的链路追踪技术来实现报错信息的定位及查询。项目源码&#xff1a;尹煜 / coupon-yinyu GitCode1 调用链追踪我们可以想象这样一个场景&#xff0c…

单一数字评估指标、迁移学习、多任务学习、端到端的深度学习

目录1.单一数字评估指标(a single number evaluation metric)有时候要比较那个分类器更好&#xff0c;或者哪个模型更好&#xff0c;有很多指标&#xff0c;很难抉择&#xff0c;这个时候就需要设置一个单一数字评估指标。例1&#xff1a;比较A&#xff0c;B两个分类器的性能&a…

Android MVVM的实现

Android MVVM的实现 前言&#xff1a; 在我们写一些项目的时候&#xff0c;通常会对一些常用的一些常用功能进行抽象封装&#xff0c;简单例子&#xff1a;比如BaseActivity&#xff0c;BaseFragment等等…一般这些Base会去承载一些比如标题栏&#xff0c;主题之类的工作&…

提权漏洞和域渗透历史漏洞整理

Windows提权在线辅助工具 https://i.hacking8.com/tiquan/&#x1f334;Kernel privilege escalation vulnerability collection, with compilation environment, demo GIF map, vulnerability details, executable file (提权漏洞合集) https://github.com/Ascotbe/Kernelhu…

恶意代码分析实战 13 反调试技术

13.1 Lab16-01 首先&#xff0c;将可执行文件拖入IDA中。 我们可以看到有三处都调用了sub_401000函数&#xff0c;并且代码都在哪里停止执行。由于没有一条线从这些方框中引出&#xff0c;这就意味着函数可能终止了程序。 右侧每一个大框中都包含一个检查&#xff0c;这个检查…