赞
踩
数据库的约束与范式?
七大约束:
三大范式:
MySQL 默认端口?
Mysql 的默认端口是3306。
MySQL 和 PostgreSQL 的区别?
PostgreSQL相对于MySQL的优势:
MySQL 相对于 PG 的优势:
MySQL 与 Oracle 的区别?
MySQL 和 Oracle 都是关系型数据库。
获取当前 Mysql 版本?
SELECT VERSION(); 用于获取当前 Mysql 的版本。
主键和候选键区别?
表格的每一行都由主键唯一标识,一个表只有一个主键。
主键也是候选键,按照惯例,候选键可以被指定为主键,并且可以用于任何外键引用。
设置为 AUTOINCREMENT 的列达到最大值会发生什么?
它会停止递增,任何进一步的插入都将产生错误,因为密钥已被使用。
怎样找出最后一次插入时分配了哪个自动增量?
LAST_INSERT_ID 将返回由 Auto_increment 分配的最后一个值,并且不需要指定表名称。
Mysql 中的存储引擎?
存储引擎 | 描述 |
ARCHIVE | 用于数据存档的引擎,数据被插入后就不能在修改了,且不支持索引。 |
CSV | 在存储数据时,会以逗号作为数据项之间的分隔符。 |
BLACKHOLE | 会丢弃写操作,该操作会返回空内容。 |
FEDERATED | 将数据存储在远程数据库中,用来访问远程表的存储引擎。 |
InnoDB | 具备外键支持功能的事务处理引擎 |
MEMORY | 置于内存的表 |
MERGE | 用来管理由多个 MyISAM 表构成的表集合,简称为索引顺序访问方法。它是由 IBM 开发的,用于在磁带等辅助存储系统上存储和检索数据。 |
MyISAM | 主要的非事务处理存储引擎 |
NDB | MySQL 集群专用存储引擎 |
MySQL 的默认存储引擎是 InnoDB。
InnoDB 和 MyISAM 区别?
InnoDB | MyISAM | |
事务 | 支持 | 不支持 |
主键 | 一定要有 | 不一定要有 |
外键 | 支持 | 不支持 |
聚簇索引 | 是 | 不是 |
全文索引 | 不支持(5.7后开始支持) | 支持 |
行数 | 不存储 | 存储 |
行锁 | 支持 | 不支持 |
表锁 | 支持 | 支持 |
存储文件 | frm:表定义文件 ibd:数据文件 | frm:表定义文件 myd:数据文件 myi:索引文件 |
MVCC(多版本并发控制) | 支持 | 不支持 |
MySQL 驱动程序?
以下是 Mysql 中可用的驱动程序:
MySQL 数据类型?
数值类型:
类型 | 大小 | 范围(有符号) | 范围(无符号) | 用途 |
TINYINT | 1 Bytes | (-128,127) | (0,255) | 小整数值 |
SMALLINT | 2 Bytes | (-32 768,32 767) | (0,65 535) | 大整数值 |
MEDIUMINT | 3 Bytes | (-8 388 608,8 388 607) | (0,16 777 215) | 大整数值 |
INT/INTEGER | 4 Bytes | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 大整数值 |
BIGINT | 8 Bytes | (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | 极大整数值 |
FLOAT | 4 Bytes | (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) | 0,(1.175 494 351 E-38,3.402 823 466 E+38) | 单精度 浮点数值 |
DOUBLE | 8 Bytes | (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 双精度 浮点数值 |
DECIMAL | 依赖于M和D的值,对 DECIMAL(M,D) 如果 M>D,为 M+2,否则为 D+2 | 依赖于M和D的值 | 小数值 |
FLOAT 和 DOUBLE 的区别:
日期和时间类型:
类型 | 大小 | 范围 | 格式 | 用途 |
DATE | 3 bytes | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |
TIME | 3 bytes | '-838:59:59'/'838:59:59' | HH:MM:SS | 时间值或持续时间 |
YEAR | 1 bytes | 1901/2155 | YYYY | 年份值 |
DATETIME | 8 bytes | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值 |
TIMESTAMP | 4 bytes | 1970-01-01 00:00:00/2038 结束时间是第 2147483647 秒 北京时间 2038-1-19 11:14:07 格林尼治时间 2038-1-19 03:14:07 | YYYYMMDD HHMMSS | 混合日期和时间值,时间戳。每当行被更改时,时间戳字段将获取当前时间戳。 |
NOW() 和 CURRENT_DATE() 区别:
NOW() 命令用于显示当前年份,月份,日期,小时,分钟和秒。
CURRENT_DATE() 仅显示当前年份,月份和日期。
字符串类型:
类型 | 大小 | 用途 |
CHAR | 0-255 bytes | 定长字符串 |
VARCHAR | 0-65535 bytes | 变长字符串 |
TINYBLOB | 0-255 bytes | 不超过 255 个字符的二进制字符串 |
TINYTEXT | 0-255 bytes | 短文本字符串 |
BLOB | 0-65 535 bytes | 二进制形式的长文本数据 |
TEXT | 0-65 535 bytes | 长文本数据 |
MEDIUMBLOB | 0-16 777 215 bytes | 二进制形式的中等长度文本数据 |
MEDIUMTEXT | 0-16 777 215 bytes | 中等长度文本数据 |
LONGBLOB | 0-4 294 967 295 bytes | 二进制形式的极大文本数据 |
LONGTEXT | 0-4 294 967 295 bytes | 极大文本数据 |
CHAR 和 VARCHAR 区别:
CHAR_LENGTH 和 LENGTH 区别:
BLOB 和 TEXT 区别:
BLOB 是一个二进制对象,可以容纳可变数量的数据。有四种类型的 BLOB:
它们只能在所能容纳价值的最大长度上有所不同。
TEXT 是一个不区分大小写的 BLOB。四种 TEXT 类型
它们对应于四种 BLOB 类型,并具有相同的最大长度和存储要求。
BLOB 和 TEXT 类型之间的唯一区别在于对 BLOB 值进行排序和比较时区分大小写,对 TEXT
值不区分大小写。
什么是非标准字符串类型?
以下是非标准字符串类型:
• TINYTEXT
• TEXT
• MEDIUMTEXT
• LONGTEXT
若一张表中只有一个字段 VARCHAR(N)类型,utf8 编码,则 N 最大值为多少?
由于 utf8 的每个字符最多占用 3 个字节。而 MySQL 定义行的长度不能超过65535,因此 N 的最大值计算方法为:(65535-1-2)/3。减去 1 的原因是实际存储从第二个字节开始,减去 2 的原因是因为要在列表长度存储实际的字符长度,除以 3 是因为 utf8 限制:每个字符最多占用 3 个字节。
Mysql 里记录货币用什么类型?
NUMERIC和DECIMAL类型被Mysql实现为同样的类型,这在SQL92标准允许。他们被用于保存值,该值的准确精度是极其重要的值,例如与金钱有关的数据。当声明一个类是这些类型之一时,精度和规模的能被(并且通常是)指定。
例如:salaryDECIMAL(9,2)
在这个例子中,9(precision) 代表将被用于存储值的总的小数位数,而 2(scale) 代表将被用于存储小数点后的位数。因此,在这种情况下,能被存储在salary列中的值的范围是从 -9999999.99 到 9999999.99。在 ANSI/ISOSQL92 中,句法 DECIMAL(p) 等价于 DECIMAL(p,0)。同样,句法 DECIMAL 等价于 DECIMAL(p,0),这里实现被允许决定值p。Mysql当前不支持 DECIMAL/NUMERIC 数据类型的这些变种形式的任一种。
这一般说来不是一个严重的问题,因为这些类型的主要益处得自于明显地控制精度和规模的能力。DECIMAL 和 NUMERIC 值作为字符串存储,而不是作为二进制浮点数,以便保存那些值的小数精度。一个字符用于值的每一位、小数点(如果 scale>0)和 “-” 符号(对于负值)。如果 scale 是0,DECIMAL 和 NUMERIC 值不包含小数点或小数部分。
DECIMAL 和 NUMERIC 值得最大的范围与 DOUBLE 一样,但是对于一个给定的 DECIMAL 或 NUMERIC 列,实际的范围可由制由给定列的 precision 或 scale 限制。
当这样的列赋给了小数点后面的位超过指定 scale 所允许的位的值,该值根据 scale 四舍五入。
当一个 DECIMAL 或 NUMERIC 列被赋给了其大小超过指定(或缺省的)precision 和 scale 隐含的范围的值,Mysql 存储表示那个范围的相应的端点值。
MySQL 中 ENUM 的用法?
ENUM 是一个字符串对象,用于指定一组预定义的值,并可在创建表时使用。
Create table size(nameENUM('Smail,'Medium','Large');
什么是索引?
索引也是一种排好序的数据结构,用于快速查询和检索数据,它记录了原数据的单个列或多个列,通过索引查询,程序不需要查所有记录,只需要先按照索引查到具体的数据,然后在根据索引记录的指针位置,找到对应的原始数据记录。
索引的作用就相当于目录的作用,其本身是一种特殊的文件,它们包含着对数据表里所有记录的引用指针,会占据一定的物理空间。
常见的索引结构有:B 树, B+ 树和 Hash。
索引的优缺点:
索引的基本原理?
把无序的数据变成有序的查询
索引创建原则?
哪些情况下需要创建索引:
哪些情况下不建议创建索引:
索引的类型?
索引类型 | 索引描述 |
---|---|
普通索引 (Index) | 用来快速查询数据,一张表允许创建多个普通索引,并允许数据重复和 NULL。 |
唯一索引 (Unique Key) | 可以保证数据记录的唯一性,允许数据为 NULL,一张表允许创建多个唯一索引。 建立唯一索引的目的大部分时候都是为了该属性列的数据的唯一性,而不是为了查询效率。 |
主键索引 (Primary Key) | 数据表的主键列使用的就是主键索引。是一种特殊的唯一索引,一张数据表有只能有一个主键,并且主键不能为 null,不能重复。 |
前缀索引 (Prefix) | 前缀索引也叫局部索引,前缀索引只适用于字符串类型的数据。前缀索引是对文本的前几个字符创建索引,相比普通索引建立的数据更小, 因为只取前几个字符。(前缀的标识度高。比如密码就适合建立前缀索引,因为密码几乎各不相同) |
全文索引 (Full Text) | 全文索引主要是为了检索大文本数据中的关键字的信息,通过建立倒排索引,可以极大提升索引效率,解决判断字段是否包含问题,是目前搜索引擎使用的关键技术。 |
组合索引 | 多列值组成一个索引,专门用于组合搜索。 |
MySQL 索引的数据结构?
(1)二叉树
正常二叉树:
极端二叉树:查找时间复杂度为 O(n)
(2)平衡二叉树
虽然能做到平衡了,避免了O(n),但是每次都进行频繁的左旋或右旋。
(3)红黑树
(4)Hash
(5)B-Tree
(6)B+Tree
唯一索引比普通索引快吗?
对于写多读少的情况, 普通索引利用 change buffer 有效减少了对磁盘的访问次数,而唯一索引需要校验唯一性,此时普通索引性能要高于唯一索引。
聚集索引与非聚集索引?
两者都是B+树的数据结构,依赖于有序的数据。
聚集索引:聚集索引即索引结构和数据一起存放,并按一定的顺序进行排序的索引,找到了索引就找到了数据。主键索引属于聚集索引。
非聚集索引:非聚集索引即索引结构和数据分开存放的索引。非聚集索引的叶子节点并不存放数据,存储的数据行地址,根据数据行地址再回表查数据。
MyISAM:采用非聚集索引, 索引文件的数据域存储指向数据文件的指针。辅索引与主索引基本一致, 但是辅索引不用保证唯一性。
InnoDB:主键索引采用聚集索引( 索引的数据域存储数据文件本身), 辅助索引的数据域存储主键的值; 因此从辅助索引查找数据, 需要先通过辅助索引找到主键值, 再访问辅助索引; 最好使用自增主键, 防止插入数据时, 为维持 B+树结构, 文件的大调整。
最左前缀匹配原则?
最左前缀匹配原则:最左优先,在创建多列索引时,要根据业务需求,where 子句中使用最频繁的一列放在最左边。
mysql 会一直从左向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如 a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。= 和 in 可以乱序,比如 a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,mysql 的查询优化器会帮你优化成索引可以识别的形式。
索引失效的情况?
通过 explain 显示出 MySQL 执行的字段内容:
(1)like 以 % 开头,索引无效;当 like 前缀没有 %,后缀有 % 时,索引有效。
(2)or 语句前后没有同时使用索引。
当 or 左右查询字段只有一个是索引,该索引失效,只有当 or 左右查询字段均为索引时,才会生效。
(3)组合索引,不是使用第一列索引,索引失效。
(4)数据类型出现隐式转化。
如 varchar 不加单引号的话可能会自动转换为 int 型,使索引无效,产生全表扫描。
(5)在索引字段上使用 not,<>,!=。
不等于操作符是永远不会用到索引的,因此对它的处理只会产生全表扫描。 优化方法: key <> 0 改为 key > 0 or key < 0。
(6)对索引字段进行计算操作、字段上使用函数。
(7)其他
可以使用多少列创建索引?
任何标准表最多可以创建16个索引列。
事务的特性?
ACID:原子性(Atomicity)、一致性(Correspondence)、隔离性(Isolation)、持久性(Durability)。
事务的分类?
事务可以分为很多中类型,一般分为:扁平事务、带有保存点的扁平事务、链事务、嵌套事务、分布式事务。
(1)扁平事务:
扁平事务是最简单的一种,在实际开发中也是使用的最多的一种事务。在这种事务中,所有操作都处于同一层次,最常见的方式如下:
BEGIN WORK
Operation 1
Operation 2
Operation 3
...
Operation N
COMMIT WORK
// 示例
begin work;
select * from user;
update user set name = 'sihai' where id = 1;
commit work;
扁平事务的主要缺点是不能提交或回滚事务的某一部分,或者分几个独立的步骤去提交。
(2)带有保存点的扁平事务
这种事务除了支持扁平事务支持的操作外,这种事务跟扁平事务最大的区别就是允许在事务执行过程中回滚到同一事务中较早的一个状态,这是因为可能某些事务在执行过程中出现的错误并不会对所有的操作都无效,放弃整个事务不合乎要求,开销也太大。保存点用来通知系统应该记住事务当前的状态,以便以后发生错误时,事务能回到该状态。
示例:
begin work;
select * from user;
savepoint t1;
update user set name = 'sihai' where id = 1;
savepoint t2;
commit work;
通过上面的方式我们就建立了两个保存点 t1、t2,通过ROLLBACK TO SAVEPOINT t1
,就可以返回到保存点 t1。
(2)链事务
链事务:在提交一个事务时,释放不需要的数据对象,将必要的处理上下文隐式的传给下一个要开始的事务。需要注意,提交事务操作和下一个事务操作将合并为一个原子操作,就是下一个事务可以看到上一个事务的结果。
链事务,就是指回滚时,只能恢复到最近一个保存点;而带有保存点的扁平事务则可以回滚到任意正确的保存点。
示例:
- begin work;
-
- select * from user;
-
- savepoint t1;
-
- update user set name = 'sihai' where id = 1;
-
- savepoint t2;
-
- commit work;
还是这个例子,但是对于链事务来说,是不能直接rollback到保存点t1的,最能恢复到最近的一个保存点t2;另外我们需要注意,链事务在执行 commit 后就会释放当前事务所持有的所有锁,而带有保存点的扁平事务不会影响所持有的锁。
(3)嵌套事务
在事务中再嵌套事务,这种结构有点像一颗横着的树的结构,位于根节点的事务称为顶层事务。事务的前驱称为父事务,其它事务称为子事务。事务的前驱称为父事务,事务的下一层称为子事务。
子事务既可以提交也可以回滚,但是它的提交操作并不马上生效,除非由其父事务提交。因此就可以确定,任何子事务都在顶层事务提交后才真正的被提交了。同理,任意一个事务的回滚都会引起它的所有子事务一同回滚。
BEGIN WORK
SubTransaction1:
BEGIN WORK
SubOperationX
COMMIT WORK
SubTransaction2:
BEGIN WORK
SubOperationY
COMMIT WORK
...
SubTransactionN:
BEGIN WORK
SubOperationN
COMMIT WORK
COMMIT WORK
(4)分布式事务
分布式事务通常是指在一个分布式环境下运行的扁平事务,因此需要根据数据所在位置访问网络中的不同节点。
在不同的物理地址,通过网络访问,执行不同的事务,这就是分布式事务。
事务隔离级别?
数据库事务的隔离级别有4个,由低到高依次为
这四个级别可以逐个解决脏读 、不可重复读 、幻读这几类问题。
脏读 | 不可重复读 | 幻读 | |
Read uncommitted | √ | √ | √ |
Read committed | × | √ | √ |
Repeatable read | × | × | √ |
Serializable | × | × | × |
脏读 、不可重复读 、幻读?
(1)脏读
脏读发生在一个事务A读取了被另一个事务B修改,但是还未提交的数据。假如B回退,则事务A读取的是无效的数据。这跟不可重复读类似,但是第二个事务不需要执行提交。
(2)不可重复读
在基于锁的并行控制方法中,如果在执行 select 时不添加读锁,就会发生不可重复读问题。
在多版本并行控制机制中,当一个遇到提交冲突的事务需要回退但却被释放时,会发生不可重复读问题。
在上面这个例子中,事务2提交成功,它所做的修改已经可见。然而,事务1已经读取了一个其它的值。在序列化和可重复读的隔离级别中,数据库管理系统会返回旧值,即在被事务2修改之前的值。在提交读和未提交读隔离级别下,可能会返回被更新的值,这就是“不可重复读”。
有两个策略可以防止这个问题的发生:
(3)幻读
幻读发生在当两个完全相同的查询执行时,第二次查询所返回的结果集跟第一个查询不相同。
发生的情况:没有范围锁。
原子性、一致性和持久性实现原理?
原子性、稳定性和持久性是通过 redo 和 undo 日志文件实现的,不管是 redo 还是 undo 文件都会有一个缓存我们称之为 redo_buf 和 undo_buf。同样,数据库文件也会有缓存称之为 data_buf。
undo 记录了数据在事务开始之前的值,当事务执行失败或者 ROLLBACK 时可以通过 undo 记录的值来恢复数据。
redo 日志记录数据修改后的值,可以避免数据在事务提交之前必须写入到磁盘的需求,减少 I/O。
MySQL 中有那些锁?
(1)MySQL 锁
锁(Lock)是数据库在并发访问时保证数据一致性和完整性的主要机制。
MySQL 数据库的并发操作:
Lock 与 Latch
Lock 与 Latch 比较:
Lock | Latch | |
对象 | 事务 | 线程 |
保护 | 数据库内容 | 内存数据结构 |
持续时间 | 整个事务过程 | 临界资源 |
模式 | 行锁、表锁锁、意向锁 | 读写锁、互斥锁 |
死锁 | 通过 waits-for graph、time out 等机制进行死锁检测与处理 | 无死锁检测机制。仅通过应用程序加锁的顺序保证无死锁发生 |
存在于 | Lock Manager 的哈希表中 | 每个数据结构的对象中 |
MySQL 中按照锁的粒度可以分为表级锁、页级锁和行级锁:
表级锁:
页级锁:
行级锁:
(2)行级锁
lnnoDB 实现了以下两种类型的行锁:
共享锁和排他锁的兼容性:
行锁类型 | 共享锁 | 排他锁 |
共享锁 | 兼容 | 冲突 |
排他锁 | v | 冲突 |
其他行锁:
(3)表级锁
lnnoDB 实现了以下两种类型的表锁:一种是 LOCK TABLES 语句手动指定的锁,另一种是由InnoDB自动添加的意向锁。
意向锁:
表级锁的兼容性:
表锁类型 | 共享锁 S | 排他锁 X | 意向共享锁 IS | 意向排他锁 IX |
共享锁 S | 兼容 | 冲突 | 兼容 | 冲突 |
排他锁 X | 冲突 | 冲突 | 冲突 | 冲突 |
意向共享锁 IS | 兼容 | 冲突 | 兼容 | 兼容 |
意向排他锁 IX | 冲突 | 冲突 | 兼容 | 兼容 |
(4)悲观锁和乐观锁
MySQL 基于加锁的机制,可以分为悲观锁和乐观锁:
悲观锁:
乐观锁:
MySQL 死锁的原因及解决?
MySQL 解决死锁的方法:
- # 关闭死锁检测
- set global innodb_deadlock_detect=0;
-
- # 开启死锁检测
- set global innodb_deadlock_detect=1;
死锁预防:
死锁的排查:
MySQL 的 MVCC 机制?
(1)MVCC 机制
MVCC(Multi Version Concurrency Control)被称为多版本并发控制,是指在数据库中为了实现高并发的数据访问,对数据进行多版本处理,并通过事务的可见性来保证事务能看到自己应该看到的数据版本。
MVCC 最大的好处是读不加锁,读写不冲突。在读多写少的系统应用中,读写不冲突是非常重要的,极大的提升系统的并发性能,这也是为什么现阶段几乎所有的关系型数据库都支持 MVCC 的原因,不过目前 MVCC 只在 Read Commited 和 Repeatable Read 两种隔离级别下工作。
(2)行记录的三个隐藏字段
(3)Undo log 多版本链:
每一条数据都有多个版本,版本之间通过 undo_log 链条进行连接。
(4)Read View:
Read View 是 InnoDB 在实现 MVCC 时用到的一致性读视图(consistent read view) ,用于支持 RC(ReadCommitted,读提交)和 RR(Repeatable Read,可重复读)隔离级别的实现。
Read View 简单理解就是对数据在每个时刻的状态拍成照片记录下来,那么之后获取某时刻的数据时就还是原来的照片上的数据,是不会变的。
Read View 中比较重要的字段有4个:
通过 Read View 判断记录的某个版本是否可见:
何时生成 ReadView 快照
(5)快照读与当前读
在 MVCC 并发控制中,读操作可以分为两类:快照读(Snapshot Read)与当前读(current Read)。
一致性锁定读/非锁定读?
(1)一致性锁定读(Locking Reads)
在一个事务中查询数据时,普通的 SELECT 语句不会对查询的数据进行加锁,其他事务仍可以对查询的数据执行更新和删除操作。因此,InnoDB 提供了两种类型的锁定读来保证额外的安全性:
一致性锁定读必须在一个事物中,当事务提交了,锁就释放了,因此使用这两种方式加锁的语句,必须加上 begin、start transaction 或者 set autocommit = 0。
(2)一致性非锁定读(consistent nonlocking read)
一致性非锁定读是指 InnoDB 存储引擎通过多版本控制(MVVC)读取当前数据库中行数据的方式。如果读取的行正在执行 DELETE 或 UPDATE 操作,这时读取操作不会因此去等待行上锁的释放。相反地,InnoDB 会去读取行的一个快照。所以,非锁定读机制大大提高了数据库的并发性。
一致性非锁定读是 InnoDB 默认的读取方式,即读取不会占用和等待行上的锁。在事务隔离级别 READ COMMITTED 和 REPEATABLE READ 下,InnoDB 使用一致性非锁定读。
然而,对于快照数据的定义却不同。在 READ COMMITTED 事务隔离级别下,一致性非锁定读总是读取被锁定行的最新一份快照数据。而在 REPEATABLE READ 事务隔离级别下,则读取事务开始时的行数据版本。
行锁的算法?
InnoDB 存储引擎有3种行锁的算法,其分别是:
举个例子10,20,30,那么该索引可能被 Next-Key Locking 的区间为:
除了 Next-Key Locking,还有 Previous-Key Locking 技术,这种技术跟 Next-Key Lock正好相反,锁定的区间是区间范围和前一个值(左闭右开)。同样上述的值,使用 Previous-Key Locking 技术,那么可锁定的区间为:
不是所有索引都会加上 Next-key Lock 的,这里有一种特殊的情况,在查询的列是唯一索引(包含主键索引)的情况下,Next-key Lock 会降级为 Record Lock。
用户可以通过以下两种方式来显示的关闭 Gap Lock:
Gap Lock 的作用:是为了阻止多个事务将记录插入到同一个范围内,设计它的目的是用来解决 Phontom Problem(幻读问题)。在 MySQ L默认的隔离级别(Repeatable Read)下,InnoDB 就是使用它来解决幻读问题。
锁的优化策略?
数据库设计方面
SQL 方面
*
,不要返回用不到的任何字段。Java 方面
B 树和 B+ 树的区别?
B 树的优点?
B+ 树的优点?
数据库为什么使用 B+ 树而不是 B 树?
在 MySQL 中,MyISAM 引擎和 InnoDB 引擎都是使用 B+Tree 作为索引结构,但是,两者的实现方式不太一样。
Hash 索引与 B+ 树?
在大多数情况下,直接选择B+树索引可以获得稳定且较好的查询速度,而不需要使用hash索引。
MySQL 中控制内存分配的全局参数?
Mysql 表中允许的触发器?
在 Mysql 表中允许有六个触发器(TRIGGERS),如下:
在 Mysql 中运行批处理模式?
以下命令用于在批处理模式下运行:
mysql;
mysqlmysql.out
Mysql 有关权限的表?
Mysql 服务器通过权限表来控制用户对数据库的访问,权限表存放在 mysql 数据库里,由 mysql_install_db 脚本初始化。这些权限表分别为 user,db,table_priv,columns_priv 和 host。
MyISAM 表格将存储在哪里?
每个 MyISAM 表格以三种格式存储在磁盘上:
• .frm
文件存储表定义
• 数据文件具有.MYD
(MYData)扩展名
• 索引文件具有.MYI
(MYIndex)扩展名
MyISAM Static 和 Dynamic 区别?
MyISAM Static 上的所有字段有固定宽度。
动态 MyISAM 表将具有像 TEXT,BLOB 等字段,以适应不同长度的数据类型。
MyISAM Static 在受损情况下更容易恢复。
myisamchk 是用来做什么的?
它用来压缩 MyISAM 表,这减少了磁盘或内存使用。
什么是访问控制列表?
ACL(访问控制列表)是与对象关联的权限列表,这个列表是Mysql服务器安全模型的基础,它有助于排除用户无法连接的问题。
Mysql将ACL(也称为授权表)缓存在内存中,当用户尝试认证或运行命令时,Mysql会按照预定的顺序检查ACL的认证信息和权限。
使用 Unix shell 登录 Mysql?
通过以下命令登录:
#[mysqldir]/bin/mysql-hhostname-u<UserName>-p<password>
Unix 和 Mysql 之间时间戳的转换?
UNIX_TIMESTAMP 是从 Mysql 时间戳转换为 Unix 时间戳的命令
FROM UNIXTIME 是从 Unix 时间戳转换为 Mysql 时间戳的命令
federated 表是什么?
federated 表,允许访问位于其他服务器数据库上的表。
Mysql中有哪些不同的表格?
共有5种类型的表格:
MyISAM 是 Mysql 的默认存储引擎。
Heap 表是什么?
HEAP 表存在于内存中,用于临时高速存储。
如何控制 HEAP 表的最大尺寸?
Heal 表的大小可通过称为 max_heap_table_size 的 Mysql 配置变量来控制。
MySQL binlog?
binlog 是 mysql 用来记录数据库表结构变更以及表数据修改的的二进制日志,它只会记录表的变更操作,但不会记录 select 和 show 这种查询操作。
binlog 比较常用的场景有以下3种:
binlog 文件包含两种类型:
.index
)用于记录哪些日志文件正在被使用.00000*
)记录数据库所有的DDL和DML(除了数据查询语句)语句事件。binlog 提供了3种记录模式:
记录模式 | 优点 | 缺点 |
ROW | 能清楚记录每一个行数据的修改细节 | 批量操作,会产生大量的日志,尤其是 alter table 会让日志文件大小暴涨 |
STATEMENT | 日志量小,减少磁盘IO,提升存储和恢复速度 | 在某些情况下会导致主从数据不一致,比如 Sql 语句中有 last_insert_id()、now() 等函数。 |
MIXED | 准确性强,文件大小适中 | 当 binlog format 设置为 mixed 时,普通复制不会有问题,但是级联复制在特殊情况下会 binlog 丢失。 |
Binlog文件结构:
MySQL的binlog文件中记录的是对数据库的各种修改操作,用来记录修改操作的数据结构是Log event。不同的修改操作对应的不同的log event。比较常用的log event有:Query event、Row event、Xid event等。binlog文件的内容就是各种Log event的集合。
Binlog文件中Log event结构如下图所示:
event字段名 | 描述 |
timestamp | 4字节 事件开始执行时间 |
event_type | 1字节 指定该事件的类型 |
event size | 4字节 该事件的长度 |
server_id | 1字节 服务器的serverId |
next log pos | 4字节 下一个事件开始的位置 |
flag | 2字节 event flags |
binlog 的写入机制:
根据设置的记录模式和操作生成相应的log event
事务执行过程中产生log event会先写入缓冲区,每个事务线程都有一个缓冲区,Log Event保存在一个binlog_cache_mngr数据结构中,在该结构中有两个缓冲区,一个是stmt_cache,用于存放不支持事务的信息;另一个是trx_cache用于存放支持事务的信息。
事务在提交阶段会将产生的log event写入到外部binlog文件中。不同事务以串行方式将log event写入binlog文件中,所以一个事务包含的log event信息在binlog文件中是连续的,中间不会插入其他事务的log event。
一张表有ID自增主键,当 insert 17条记录后删除第15,16,17条记录,重启Mysql,再 insert 一条记录,这条记录的ID是18还是15?
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。