MySQL
-
数据库面试题 MySQL数据库面试题(2020最新版)
-
mysql为什么要用自增id作为主键 为什么要使用自增ID作为主键
直接原因是其存储机制。MySQL采用数据页进行数据存储。如果采用自增主键,在原先数据页写满的情况下,MySQL对于新数据,直接开辟新页进行写操作。如果不采用自增主键,为保障索引有序,新数据需插入到合适位置上,由此针对页数据满的情况下,MySQL需要申请新页,并将一部分之前的页数据挪到新页上,保证按索引有序存储,相对自增主键IO开销更大。 -
select count 1 和 select count 字段 有什么区别 ? Select count(*)、Count(1)、Count(0)的区别和执行效率比较
1)结果区别
a、count(1) 会统计表中的所有的记录数,包含字段为null 的记录。
b、count(字段) 会统计该字段在表中出现的次数,忽略字段为null 的情况。即不统计字段为null 的记录。
2)效率区别
a、列名为主键,count(列名)会比count(1)快
b、列名不为主键,count(1)会比count(列名)快 -
最好的前几个查询 第二高的薪水、SQL查询语句中的 limit 与 offset 的区别
-
SQL分页查询语句?MySql实现分页查询的SQL,mysql实现分页查询的sql语句
select * from table limit (start-1)*limit,limit; 其中start是页码,limit是每页显示的条数 -
Mysql limit过大如何优化 mysql limit分页(偏移量)过大时优化问题
-
大数据量的分页查询怎么优化 MySQL大数据量分页查询方法及其优化
-
跨表分页查询怎么做 “跨库分页”的四种方案
-
SQL通配符匹配查询?MySQL模糊查询?Mysql| 使用通配符进行模糊查询(like,%,_)
1)%百分号通配符: 表示任何字符出现任意次数 (可以是0次).
2)_下划线通配符:表示只能匹配单个字符,不能多也不能少,就是一个字符.
3)LIKE作用:指示mysql后面的搜索模式是利用通配符而不是直接相等匹配进行比较.
4)通配符的使用
a、匹配以"yves"开头的记录:(包括记录"yves")
SELECT * FROM products WHERE products.prod_name like ‘yves%’;
b、匹配包含"yves"的记录(包括记录"yves")
SELECT * FROM products WHERE products.prod_name like ‘%yves%’;
c、匹配以"yves"结尾的记录(包括记录"yves",不包括记录"yves ")
SELECT * FROM products WHERE products.prod_name like ‘%yves’; -
一条sql语句是怎么执行的? 一条SQL语句在MySQL中执行过程全解析
-
数据库架构面试问题 拼多多面试问了数据库基础知识,今天分享出来
-
MySQL数据更新过程? mysql 一次数据更新过程(undo redo binlog 内存缓冲池扮演了什么角色)
-
MySQL存储引擎有哪些?Innodb和MyISAM的区别? Mysql 存储引擎的区别和比较
-
MySQL事务和隔离级别 深入理解 MySQL 事务:隔离级别、ACID 特性及其实现原理
1)事务定义:事务(Transaction)是数据库中各种数据项的一个程序执行单元
2)事务特性:
a、原子性(Atomicity)
定义:原子性,是指一个事务是一个不可分割的工作单位,其中的操作要么都做,要么都不做
实现:undo log属于逻辑日志,它记录的是 SQL 执行的相关信息。当发生回滚时,InnoDB 会根据undo log的内容做与之前相反的工作。
b、一致性(Consistency)
定义:数据库前后状态保证一致
实现:通过其他三个特性保证
c、隔离性(Isolation)
定义:隔离性,是指事务内部的操作与其他事务是隔离的,并发执行的各个事务之间不能互相干扰
实现:数据库并发场景如下
(一个事务)读操作对(另一个事务)读操作的影响:不存在任何问题,也不需要并发控制
(一个事务)写操作对(另一个事务)写操作的影响:锁机制保证隔离性
(一个事务)写操作对(另一个事务)读操作的影响:MVCC 保证隔离性
d、持久性(Durability)
定义:持久性,是指事务一旦提交,它对数据库的改变就应该是永久性的。
实现:redo log。如果 MySQL 宕机,重启时可以读取redo log中的数据,对数据库进行恢复
3)写操作对读操作的影响
a、脏读:当前事务(A)中可以读到其他事务(B)未提交的数据(脏数据),这种现象是脏读。
b、不可重复读:在事务A中先后两次读取同一个数据,两次读取的结果不一样,这种现象称为不可重复读。脏读与不可重复读的区别在于:前者读到的是其他事务未提交的数据,后者读到的是其他事务已提交的数据。
c、幻读:在事务A中按照某个条件先后两次查询数据库,两次查询结果的条数不同,这种现象称为幻读。不可重复读与幻读的区别可以通俗的理解为:前者是数据变了,后者是数据的行数变了。
4)事务隔离级别
a、读未提交(Read Uncommited)存在脏读、不可重复读、幻读
b、读已提交(Read Commited)存在不可重复读、幻读(Oracle)
c、可重复读(Repeatable Read)存在幻读(MySQL)
d、可串行化(Serializable) -
MVCC机制?当前读和快照读? 【MySQL笔记】正确的理解MySQL的MVCC及实现原理
1)MVCC定义:MVCC(Multi-Version Concurrency Control)多版本并发控制
MVCC就是为了实现读-写冲突不加锁,而这个读指的是快照读, 而非当前读,当前读实际是一种加锁的操作。
MVCC模型在MySQL中的具体实现则是由 3个隐式字段,undo日志 ,Read View 等去完成的。
2)当前读和快照读
a、当前读
就是它读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁
b、快照读
不加锁的select操作就是快照读,即不加锁的非阻塞读;快照读的前提是隔离级别不是串行级别,串行级别下的快照读会退化成当前读;之所以出现快照读的情况,是基于提高并发性能的考虑。
3)实现机制
a、隐式字段
定义:每行记录除了我们自定义的字段外,还有数据库隐式定义的DB_TRX_ID,DB_ROLL_PTR,DB_ROW_ID等字段
①、DB_TRX_ID:
6byte,最近修改(修改/插入)事务ID:记录创建这条记录/最后一次修改该记录的事务ID
②、DB_ROLL_PTR:
7byte,回滚指针,指向这条记录的上一个版本(存储于rollback segment里)
③、DB_ROW_ID:
6byte,隐含的自增ID(隐藏主键),如果数据表没有主键,InnoDB会自动以DB_ROW_ID产生一个聚簇索引
b、undo日志
定义:不同事务或者相同事务的对同一记录的修改,会导致该记录的undo log成为一条记录版本链表
①、insert undo log
代表事务在insert新记录时产生的undo log, 只在事务回滚时需要,并且在事务提交后可以被立即丢弃
②、update undo log
事务在进行update或delete时产生的undo log; 不仅在事务回滚时需要,在快照读时也需要;所以不能随便删除,只有在快速读或事务回滚不涉及该日志时,对应的日志才会被purge线程统一清除
c、Read View(读视图)
定义:事务执行的快照读的那一刻,会生成数据库系统当前的一个快照,记录并维护系统当前活跃事务的ID
4)RC和RR下的区别
MVCC只作用在RC和RR两个级别。
在RC隔离级别下,是每个快照读都会生成并获取最新的Read View,所以可能读到数据不一样
而在RR隔离级别下,则是同一个事务中的第一个快照读才会创建Read View, 之后的快照读获取的都是同一个Read View,所以读到的数据都一样,解决了不可重复读。
4)MVCC优点
a、可以做到在读操作时不用阻塞写操作,写操作也不用阻塞读操作,提高了数据库并发读写的性能
b、同时还可以解决脏读,幻读,不可重复读等事务隔离问题,但不能解决更新丢失问题 -
MVCC能解决幻读吗?【MySQL】面试题之:MVCC能否解决幻读?
幻读分当前读和快照读两种情况:
1)当前读下的幻读
通过next key lock解决,所谓的next key lock就是一个行锁(record lock)+范围锁ÿ