文章目录

  • 1. 唯一索引比普通索引快吗, 为什么?
  • 2. MySQL由哪些部分组成, 分别用来做什么?
  • 3. Mysql查询缓存有什么弊端, 应该什么情况下使用, 8.0版本对查询缓存有什么变更?
  • 4. MyISAM和InnoDB的区别有哪些?
  • 5. Mysql怎么恢复半个月前的数据?
  • 6. Mysql事务的隔离级别, 分别有什么特点?
  • 7. 做过哪些Mysql索引相关优化?
  • 8. 简要说一下数据库三范式
  • 9. 一千万条数据的表, 如何分页查询
  • 10. 订单表数据量越来越大导致查询缓慢, 如何处理?
  • 11. 雪花算法
  • 12.一张表,里面有ID自增主键,当insert了17条记录之后,删除了第15,16,17条记录,再把Mysql重启,再insert一条记录,这条记录的ID是18还是15?
  • 13.Mysql 的技术特点是什么?
  • 14.Heap 表是什么?
  • 15.Mysql 服务器默认端口是什么?
  • 16.与Oracle相比,Mysql有什么优势?
  • 17.如何区分 FLOAT 和 DOUBLE?
  • 18.区分CHAR_LENGTH和LENGTH?
  • 19.请简洁描述Mysql中InnoDB支持的四种事务隔离级别名称,以及逐级之间的区别?
  • 20.在 Mysql 中 ENUM 的用法是什么?
  • 21.如何定义 REGEXP?
  • 22.CHAR 和 VARCHAR 的区别?
  • 23.列的字符串类型可以是什么?
  • 24.如何获取当前的 Mysql 版本?
  • 25.Mysql 中使用什么存储引擎?
  • 26.Mysql 驱动程序是什么?
  • 27.TIMESTAMP 在 UPDATE CURRENT_TIMESTAMP 数据类型上做什么?
  • 28.主键和候选键有什么区别?
  • 29.如何使用 Unix shell 登录 Mysql?
  • 30.myisamchk 是用来做什么的?
  • 31.Mysql数据库服务器性能分析的方法命令有哪些?
  • 32.如何控制 HEAP 表的最大尺寸?
  • 33.MyISAM Static 和 MyISAM Dynamic 有什么区别?
  • 34.federated 表是什么?
  • 35.如果一个表有一列定义为 TIMESTAMP,将发生什么?
  • 36.列设置为 AUTO INCREMENT 时,如果在表中达到最大 值,会发生什么情况?
  • 37.怎样才能找出最后一次插入时分配了哪个自动增量?
  • 38.怎么看到为表格定义的所有索引?
  • 39.LIKE 声明中的%和_是什么意思?
  • 40.如何在 Unix 和 Mysql 时间戳之间进行转换?
  • 41.列对比运算符是什么?
  • 42.我们如何得到受查询影响的行数?
  • 43.LIKE 和 REGEXP 操作有什么区别?
  • 44.BLOB 和 TEXT 有什么区别?
  • 45.如何显示前 50 行?
  • 46.可以使用多少列创建索引?
  • 47.NOW()和 CURRENT_DATE()有什么区别?
  • 48.什么样的对象可以使用 CREATE 语句创建?
  • 49.Mysql 表中允许有多少个 TRIGGERS?
  • 50.什么是非标准字符串类型?
  • 51.什么是通用 SQL 函数?
  • 52.Mysql支持事务吗?
  • 53.Mysql里记录货币用什么字段类型好?
  • 54.Mysql数据表在什么情况下容易损坏?
  • 55.Mysql 有关权限的表都有哪几个?
  • 56.Mysql 中有哪几种锁?
  • 57.数据库中的事务是什么?
  • 58.SQL 注入漏洞产生的原因?如何防止?
  • 59.外连接、内连接与自连接的区别?
  • 60.什么是事务回滚机制
  • 61.完整性约束包括哪些?

1. 唯一索引比普通索引快吗, 为什么?

唯一索引不一定比普通索引快, 可能还更慢。

  1. 查询时, 在未使用 limit的情况下, 在匹配到一条数据后, 唯一索引即返回, 普通索引则会继续匹配下一条数据, 发现不匹配后返回。如此看来唯一索引少了一次匹配, 但实际上这个消耗微乎其微。
  2. 更新时, 这个情况就比较复杂了。普通索引将记录放到change buffer 中语句就执行完毕了. 而对唯一索引而言, 它必须要校验唯一性, 因此, 必须将数据页读入内存确定没有冲突, 然后才能继续操作. 对于写多读少的情况, 普通索引利用 change buffer 有效减少了对磁盘的访问次数, 因此普通索引性能要高于唯一索引。

2. MySQL由哪些部分组成, 分别用来做什么?

  1. Server
    连接器: 管理连接, 权限验证
    分析器: 词法分析, 语法分析
    优化器: 执行计划生成, 索引的选择
    执行器: 操作存储引擎, 返回执行结果
  2. 存储引擎: 存储数据, 提供读写接口

3. Mysql查询缓存有什么弊端, 应该什么情况下使用, 8.0版本对查询缓存有什么变更?

  • 查询缓存可能会失效非常频繁, 对于一个表, 只要有更新, 该表的全部查询缓存都会被清空. 因此对
    于频繁更新的表来说, 查询缓存不一定能起到正面效果
  • 对于读远多于写的表可以考虑使用查询缓存
  • 8.0版本的查询缓存功能被移除

4. MyISAM和InnoDB的区别有哪些?

  • InnoDB支持事务, MyISAM不支持
  • InnoDB支持行级锁, MyISAM支持表级锁
  • InnoDB支持多版本并发控制(MVVC), MyISAM不支持
  • InnoDB支持外键, MyISAM不支持
  • MyISAM支持全文索引, InnoDB部分版本不支持(但可以使用Sphinx插件)

5. Mysql怎么恢复半个月前的数据?

通过整库备份+binlog进行恢复. 前提是要有定期整库备份且保存了binlog日志。

6. Mysql事务的隔离级别, 分别有什么特点?

  1. 读未提交(RU): 一个事务还没提交时, 它做的变更就能被别的事务看到
  2. 读提交(RC): 一个事务提交之后, 它做的变更才会被其他事务看到
  3. 可重复读(RR): 一个事务执行过程中看到的数据, 总是跟这个事务在启动时看到的数据是一致的. 当然在可重复读隔离级别下, 未提交变更对其他事务也是不可见的
  4. 串行化(S): 对于同一行记录, 读写都会加锁. 当出现读写锁冲突的时候, 后访问的事务必须等前一个事务执行完成才能继续执行

7. 做过哪些Mysql索引相关优化?

  • 尽量使用主键查询: 聚簇索引上存储了全部数据, 相比普通索引查询, 减少了回表的消耗
  • Mysql5.6之后引入了索引下推优化, 通过适当的使用联合索引, 减少回表判断的消耗
  • 若频繁查询某一列数据, 可以考虑利用覆盖索引避免回表
  • 联合索引将高频字段放在最左边

8. 简要说一下数据库三范式

  • 第一范式: 属性不可再分
  • 第二范式: 在一范式的基础上, 要求数据库表中的每个实例或行必须可以被唯一区分。通常需要为
    表加上一个列, 以存储各个实例的唯一标识。这个唯一属性列被称为主关键字或主键
  • 第三范式: 在二范式的基础上, 要求一个数据库表中不包含已在其它表中已包含的非主关键字信息
    所以第三范式具有如下特征:
    1). 每一列只有一个值. 2). 每一行都能区分. 3). 每一张表都不包含其他表已经包含的非主关键字信息

9. 一千万条数据的表, 如何分页查询

数据量过大的情况下, limit offset 分页会由于扫描数据太多而越往后查询越慢。可以配合当前页最后
一条ID进行查询, SELECT * FROM T WHERE id > #{ID} LIMIT #{LIMIT} . 当然, 这种情况下ID必须
是有序的, 这也是有序ID的好处之一。

10. 订单表数据量越来越大导致查询缓慢, 如何处理?

分库分表。由于历史订单使用率并不高, 高频的可能只是近期订单, 因此, 将订单表按照时间进行拆分, 根
据数据量的大小考虑按月分表或按年分表. 订单ID最好包含时间(如根据雪花算法生成), 此时既能根据订单ID直接获取到订单记录, 也能按照时间进行查询。

11. 雪花算法

雪花算法这一在分布式架构中很常见的,但一般也不需要怎么去深入了解,一方面一般个人项目用不到分布式之类的大型架构,另一方面,就算要用到,市面上很多ID生成器也帮我们完成了这项工作。

一、为何要用雪花算法

1、问题产生的背景现如今越来越多的公司都在用分布式、微服务,那么对应的就会针对不同的服务进行数据库拆分,然后当数据量上来的时候也会进行分表,那么随之而来的就是分表以后id的问题。例如之前单体项目中一个表中的数据主键id都是自增的,Mysql是利用autoincrement来实现自增,而oracle是利用序列来实现的,但是当单表数据量上来以后就要进行水平分表,阿里java开发建议是单表大于500w的时候就要分表,但是具体还是得看业务,如果索引用的号的话,单表千万的数据也是可以的。水平分表就是将一张表的数据分成多张表,那么问题就来了如果还是按照以前的自增来做主键id,那么就会出现id重复,这个时候就得考虑用什么方案来解决分布式id的问题了。2、解决方案2.1、数据库表可以在某个库中专门维护一张表,然后每次无论哪个表需要自增id的时候都去查这个表的记录,然后用for update锁表,然后取到的值加一,然后返回以后把再把值记录到表中,但是这个方法适合并发量比较小的项目,因此每次都得锁表。2.2、redis因为redis是单线程的,可以在redis中维护一个键值对,然后哪个表需要直接去redis中取值然后加一,但是这个跟上面一样由于单线程都是对高并发的支持不高,只适合并发量小的项目。2.3、uuid可以使用uuid作为不重复主键id,但是uuid有个问题就是其是无序的字符串,如果使用uuid当做主键,那么主键索引就会失效。2.4、雪花算法雪花算法是解决分布式id的一个高效的方案,大部分互联网公司都在使用雪花算法,当然还有公司自己实现其他的方案。

二、雪花算法

1、原理
雪花算法就是使用64位long类型的数据存储id,最高位一位存储0或者1,0代表整数,1代表负数,一般都是0,所以最高位不变,41位存储毫秒级时间戳,10位存储机器码(包括5位datacenterId和5位workerId),12存储序列号。这样最大2的10次方的机器,也就是1024台机器,最多每毫秒每台机器产生2的12次方也就是4096个id。(下面有代码实现)
但是一般我们没有那么多台机器,所以我们也可以使用53位来存储id。为什么要用53位?
因为我们几乎都是跟web页面打交道,就需要跟js打交道,js支持最大的整型范围为53位,超过这个范围就会丢失精度,53之内可以直接由js读取,超过53位就需要转换成字符串才能保证js处理正确。53存储的话,32位存储秒级时间戳,5位存储机器码,16位存储序列化,这样每台机器每秒可以生产65536个不重复的id。

2、缺点

由于雪花算法严重依赖时间,所以当发生服务器时钟回拨的问题是会导致可能产生重复的id。当然几乎没有公司会修改服务器时间,修改以后会导致各种问题,公司宁愿新加一台服务器也不愿意修改服务器时间,但是不排除特殊情况。
如何解决时钟回拨的问题?
可以对序列化的初始值设置步长,每次触发时钟回拨事件,则其初始步长就加1w,可以在下面代码的第84行来实现,将sequence的初始值设置为10000。

三、代码实现

64位的代码实现:

/*** Twitter_Snowflake<br>* SnowFlake的结构如下(每部分用-分开):<br>* 0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000000000 <br>* 1位标识,由于long基本类型在Java中是带符号的,最高位是符号位,正数是0,负数是1,所以id一般是正数,最高位是0<br>* 41位时间截(毫秒级),注意,41位时间截不是存储当前时间的时间截,而是存储时间截的差值(当前时间截 - 开始时间截)* 得到的值),这里的的开始时间截,一般是我们的id生成器开始使用的时间,由我们程序来指定的(如下下面程序IdWorker类的startTime属性)。41位的时间截,可以使用69年,年T = (1L << 41) / (1000L * 60 * 60 * 24 * 365) = 69<br>* 10位的数据机器位,可以部署在1024个节点,包括5位datacenterId和5位workerId<br>* 12位序列,毫秒内的计数,12位的计数顺序号支持每个节点每毫秒(同一机器,同一时间截)产生4096个ID序号<br>* 加起来刚好64位,为一个Long型。<br>* SnowFlake的优点是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由数据中心ID和机器ID作区分),并且效率较高,经测试,SnowFlake每秒能够产生26万ID左右。*/
public class SnowflakeIdWorker {// ==============================Fields===========================================/** 开始时间截 (2020-01-01) */private final long twepoch = 1577808000000L;/** 机器id所占的位数 */private final long workerIdBits = 5L;/** 数据标识id所占的位数 */private final long datacenterIdBits = 5L;/** 支持的最大机器id,结果是31 (这个移位算法可以很快的计算出几位二进制数所能表示的最大十进制数) */private final long maxWorkerId = -1L ^ (-1L << workerIdBits);/** 支持的最大数据标识id,结果是31 */private final long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);/** 序列在id中占的位数 */private final long sequenceBits = 12L;/** 机器ID向左移12位 */private final long workerIdShift = sequenceBits;/** 数据标识id向左移17位(12+5) */private final long datacenterIdShift = sequenceBits + workerIdBits;/** 时间截向左移22位(5+5+12) */private final long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;/** 生成序列的掩码,这里为4095 (0b111111111111=0xfff=4095) */private final long sequenceMask = -1L ^ (-1L << sequenceBits);/** 工作机器ID(0~31) */private long workerId;/** 数据中心ID(0~31) */private long datacenterId;/** 毫秒内序列(0~4095) */private long sequence = 0L;/** 上次生成ID的时间截 */private long lastTimestamp = -1L;//==============================Constructors=====================================/*** 构造函数* @param workerId 工作ID (0~31)* @param datacenterId 数据中心ID (0~31)*/public  SnowflakeIdWorker(long workerId, long datacenterId) {if (workerId > maxWorkerId || workerId < 0) {throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId));}if (datacenterId > maxDatacenterId || datacenterId < 0) {throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId));}this.workerId = workerId;this.datacenterId = datacenterId;}// ==============================Methods==========================================/*** 获得下一个ID (该方法是线程安全的)* @return SnowflakeId*/public synchronized long nextId() {long timestamp = timeGen();//如果当前时间小于上一次ID生成的时间戳,说明系统时钟回退过这个时候应当抛出异常if (timestamp < lastTimestamp) {throw new RuntimeException(String.format("Clock moved backwards.  Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));}//如果是同一时间生成的,则进行毫秒内序列if (lastTimestamp == timestamp) {sequence = (sequence + 1) & sequenceMask;//毫秒内序列溢出if (sequence == 0) {//阻塞到下一个毫秒,获得新的时间戳timestamp = tilNextMillis(lastTimestamp);}}//时间戳改变,毫秒内序列重置else {sequence = 0L;}//上次生成ID的时间截lastTimestamp = timestamp;//移位并通过或运算拼到一起组成64位的IDreturn ((timestamp - twepoch) << timestampLeftShift) //| (datacenterId << datacenterIdShift) //| (workerId << workerIdShift) //| sequence;}/*** 阻塞到下一个毫秒,直到获得新的时间戳* @param lastTimestamp 上次生成ID的时间截* @return 当前时间戳*/protected long tilNextMillis(long lastTimestamp) {long timestamp = timeGen();while (timestamp <= lastTimestamp) {timestamp = timeGen();}return timestamp;}/*** 返回以毫秒为单位的当前时间* @return 当前时间(毫秒)*/protected long timeGen() {return System.currentTimeMillis();}//==============================Test=============================================/** 测试 */public static void main(String[] args) {SnowflakeIdWorker idWorker = new SnowflakeIdWorker(0, 0);for (int i = 0; i < 100; i++) {long id = idWorker.nextId();System.out.println(id);}}
}

12.一张表,里面有ID自增主键,当insert了17条记录之后,删除了第15,16,17条记录,再把Mysql重启,再insert一条记录,这条记录的ID是18还是15?

答:
( 1 )如果表的类型是MyISAM ,那么是18。
因为MyISAM表会把自增主键的最大ID记录到数据文件里,重启MySQL自增主键的最大ID也不会丢失。
(2)如果表的类型是InnoDB ,那么是15。
InnoDB表只是把自增主键的最大ID记录到内存中,所以重启数据库或者是对表进行OPTIMIZE操作,都
会导致最大ID丢失。

13.Mysql 的技术特点是什么?

Mysql 数据库软件是一个客户端或服务器系统,其中包括:支持各种客户端程序和库的多 线程 SQL 服务器、不同的后端、广泛的应用程序编程接口和管理工具。

14.Heap 表是什么?

  • HEAP 表存在于内存中,用于临时高速存储
  • BLOB 或 TEXT 字段是不允许的
  • 只能使用比较运算符=,<,>,=>,= <
  • HEAP 表不支持 AUTO_INCREMENT
  • 索引不可为 NULL

15.Mysql 服务器默认端口是什么?

3306

16.与Oracle相比,Mysql有什么优势?

  • Mysql 是开源软件,随时可用,无需付费
  • Mysql 是便携式的
  • 带有命令提示符的 GUI
  • 使用 Mysql 查询浏览器支持管理

17.如何区分 FLOAT 和 DOUBLE?

  • 以下是 FLOAT 和 DOUBLE 的区别:
  • 浮点数以 8 位精度存储在 FLOAT 中,并且有四个字节
  • 浮点数存储在 DOUBLE 中,精度为 18 位,有八个字节

18.区分CHAR_LENGTH和LENGTH?

CHAR_LENGTH 是字符数,而 LENGTH 是字节数。Latin 字符的这两个数据是相同的, 但是对于 Unicode 和其他编码,它们是不同的。

19.请简洁描述Mysql中InnoDB支持的四种事务隔离级别名称,以及逐级之间的区别?

SQL 标准定义的四个隔离级别为:

  • read uncommited :读到未提交数据

  • read committed:脏读,不可重复读

  • repeatable read:可重读

  • serializable :串行事物

  • Read Uncommitted(读取未提交内容)

在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。

影响:读取其他事务未提交的数据,也被称之为脏读(Dirty Read)。

  • Read Committed(读取提交内容)

这是大多数数据库系统的默认隔离级别(但不是Mysql默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别 也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。

影响:在某个事务中,可能会得到不同结果,比如A事务读取数据时,在B事务提交前和提交后分别读了一次,那么这两次的结果是不一样的。

  • Repeatable Read(可重读)

这是Mysql的默认事务隔离级别,它确保同一事务的多次并发读取数据时,会看到同样的数据行。

影响:这会导致另一个棘手的问题:幻读 (Phantom Read)。比如A事务中先做一次查询操作,发现没有id为3的用户,就在这时,B事务插入了一条id为3的用户,然后A事务再一次查看确认仍然没有id为3的用户,于是A事务插入一条id为3的用户,此时数据库就会报id=3已存在的错误。不过InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。

  • Serializable(可串行化)

这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。


对于不同的事务,采用不同的隔离界别分别有不同的结果,不同的隔离界别有不同的现象。主要有下面三种:

  1. 脏读(dirty read):一个事务可以读取另一个尚未提交事务的修改数据
  2. 非重复度(nonrepeatable read):在同一个事务中,同一个查询在T1时间读取某一行,在T2时间重新读取这一行时候,这一行的数据以及发生修改,可能被更新(update)了,也可能被删除(delete)
  3. 幻读(phantom read):同一事物中,同一查询多次进行适合,由于其它插入操作(insert)的事务提交,导致每次返回不同的结果集。把不同的隔离界别有不同的现象,有不同的锁定/并发机制,隔离级别越高,数据库的并发性就越差,4种事务隔离级别分别表现的现象如下表:
隔离级别 脏读 非重复读 幻读
read uncommitted 允许 允许 允许
read committed 允许 允许
repeatable read 允许
senalizable

20.在 Mysql 中 ENUM 的用法是什么?

ENUM 是一个字符串对象,用于指定一组预定义的值,并可在创建表时使用。
Create table size(name ENUM('Smail,‘Medium’,‘Large’);

21.如何定义 REGEXP?

REGEXP 是模式匹配,其中匹配模式在搜索值的任何位置。

22.CHAR 和 VARCHAR 的区别?

  • CHAR 和 VARCHAR 类型在存储和检索方面有所不同
  • CHAR 列长度固定为创建表时声明的长度,长度值范围是 1 到 255
  • 当 CHAR 值被存储时,它们被用空格填充到特定长度,检索 CHAR 值时需删除尾随空格。

23.列的字符串类型可以是什么?

  • SET
  • BLOB
  • ENUM
  • CHAR
  • TEXT
  • VARCHAR

24.如何获取当前的 Mysql 版本?

SELECT VERSION();用于获取当前 Mysql 的版本。

25.Mysql 中使用什么存储引擎?

存储引擎称为表类型,数据使用各种技术存储在文件中。 技术涉及: 

  • Storage mechanism
  • Locking levels
  • Indexing
  • Capabilities and functions

26.Mysql 驱动程序是什么?

  • PHP 驱动程序
  • JDBC 驱动程序
  • ODBC 驱动程序
  • CWRAPPER
  • PYTHON 驱动程序
  • PERL 驱动程序
  • RUBY 驱动程序
  • CAP11PHP 驱动程序
  • Ado.net5.mxj

27.TIMESTAMP 在 UPDATE CURRENT_TIMESTAMP 数据类型上做什么?

创建表时 TIMESTAMP 列用 Zero 更新。只要表中的其他字段发生更改,UPDATE CURRENT_TIMESTAMP 修饰符就将时间戳字段更新为当前时间。

28.主键和候选键有什么区别?

  • 表格的每一行都由主键唯一标识,一个表只有一个主键。
  • 主键也是候选键。按照惯例,候选键可以被指定为主键,并且可以用于任何外键引用。

29.如何使用 Unix shell 登录 Mysql?

以通过以下命令登录:

# [mysql dir]/bin/mysql -h hostname -u <UserName> -p <password>

30.myisamchk 是用来做什么的?

用来压缩 MyISAM 表,这减少了磁盘或内存使用。

31.Mysql数据库服务器性能分析的方法命令有哪些?

  1. 查询服务器状态和配置
    列出Mysql服务器运行各种状态值:
mysql> show global status;

查询Mysql服务器配置信息语句:

mysql> show variables;
  1. 慢查询
mysql> show variables like '%slow%';
mysql> show global status like '%slow%';
  1. Key_buffer_size
    key_buffer_size是对MyISAM表性能影响最大的一个参数,下面一台以MyISAM为主要存储引擎
mysql> show variables like ‘key_buffer_size’;

分配了512MB内存给key_buffer_size,我们再看一下key_buffer_size的使用情况:

mysql> show global status like 'key_read%';
  1. 临时表
mysql> show global status like 'created_tmp%';

每次创建临时表,Created_tmp_tables增加,如果是在磁盘上创建临时表,Created_tmp_disk_tables也增加,Created_tmp_files表示Mysql服务创建的临时文件文件数,比较理想的配置是:
Created_tmp_disk_tables / Created_tmp_tables * 100% <= 25%
  比如上面的服务器Created_tmp_disk_tables / Created_tmp_tables * 100% = 1.20%,应该相当好了。我们再看一下Mysql服务器对临时表的配置:

mysql> show variables where Variable_name in ('tmp_table_size','max_heap_table_size');
  1. Open Table情况
mysql> show global status like 'open%tables%';

Open_tables表示打开表的数量,Opened_tables表示打开过的表数量,如果Opened_tables数量过大,说明配置中table_cache(5.1.3之后这个值叫做table_open_cache)值可能太小,我们查询一下服务器table_cache值:

mysql> show variables like 'table_cache';
  1. 进程使用情况
mysql> show global status like ‘Thread%’;

如果我们在Mysql服务器配置文件中设置了thread_cache_size,当客户端断开之后,服务器处理此客户的线程将会缓存起来以响应下一个客户而不是销毁(前提是缓存数未达上限)。Threads_created表示创建过的线程数,如果发现Threads_created值过大的话,表明Mysql服务器一直在创建线程,这也是比较耗资源,可以适当增加配置文件中thread_cache_size值,查询服务器thread_cache_size配置:

mysql> show variables like 'thread_cache_size';
  1. 查询缓存
mysql> show global status like 'qcache%';
  1. 排序使用情况
mysql> show global status like 'sort%';
  1. 表锁情况
mysql> show global status like 'table_locks%';
  1. 表扫描情况
mysql> show global status like 'handler_read%';

引自:https://blog.csdn.net/qq_41455420/article/details/82802090

32.如何控制 HEAP 表的最大尺寸?

Heal 表的大小可通过称为 max_heap_table_size 的 Mysql 配置变量来控制。

33.MyISAM Static 和 MyISAM Dynamic 有什么区别?

在 MyISAM Static 上的所有字段有固定宽度。动态 MyISAM 表将具有像 TEXT,BLOB 等字段,以适应不同长度的数据类型。点击这里有一套最全阿里面试题总结。 MyISAM Static 在受损情况下更容易恢复。

34.federated 表是什么?

federated 表,允许访问位于其他服务器数据库上的表。

35.如果一个表有一列定义为 TIMESTAMP,将发生什么?

每当行被更改时,时间戳字段将获取当前时间戳。

36.列设置为 AUTO INCREMENT 时,如果在表中达到最大 值,会发生什么情况?

会停止递增,任何进一步的插入都将产生错误,因为密钥已被使用。

37.怎样才能找出最后一次插入时分配了哪个自动增量?

LAST_INSERT_ID 将返回由 Auto_increment 分配的最后一个值,并且不需要指定表名称。

38.怎么看到为表格定义的所有索引?

索引是通过以下方式为表格定义的:

SHOW INDEX FROM <tablename>;

39.LIKE 声明中的%和_是什么意思?

%对应于 0 个或更多字符,_只是 LIKE 语句中的一个字符。

40.如何在 Unix 和 Mysql 时间戳之间进行转换?

  • UNIX_TIMESTAMP 是从 Mysql 时间戳转换为 Unix时间戳的命令
  • FROM_UNIXTIME 是从 Unix 时间戳转换为 Mysql 时间戳的命令

41.列对比运算符是什么?

在 SELECT 语句的列比较中使用=,<>,<=,<,> =,>,<<,>>,<=>,AND,OR 或 LIKE 运算符。

42.我们如何得到受查询影响的行数?

行数可以通过以下代码获得: SELECT COUNT(user_id)FROM users;

43.LIKE 和 REGEXP 操作有什么区别?

LIKE 和 REGEXP 运算符用于表示%和^

SELECT * FROM employee WHERE emp_name REGEXP "^b";
SELECT * FROM employee WHERE emp_name LIKE "%b";

44.BLOB 和 TEXT 有什么区别?

BLOB 是一个二进制对象,可以容纳可变数量的数据。有四种类型的 BLOB - 

  • TINYBLOB
  • BLOB
  • MEDIUMBLOB
  • LONGBLOB
    它们只能在所能容纳价值的最大长度上有所不同。 TEXT 是一个不区分大小写的 BLOB。四种 TEXT 类型  - - TINYTEXT
  • TEXT
  • MEDIUMTEXT
  • LONGTEXT
    它们对应于四种 BLOB 类型,并具有相同的最大长度和存储要求。 BLOB 和 TEXT 类型之间的唯一区别在于对 BLOB 值进行排序和比较时区分大小写,对 TEXT 值不区分大小写。

45.如何显示前 50 行?

SELECT*FROM LIMIT 0,50;

46.可以使用多少列创建索引?

任何标准表最多可以创建 16 个索引列。

47.NOW()和 CURRENT_DATE()有什么区别?

  • NOW()命令用于显示当前年份,月份,日期,小时,分钟和秒
  • CURRENT_DATE()仅显示当前年份,月份和日期

48.什么样的对象可以使用 CREATE 语句创建?

以下对象是使用 CREATE 语句创建的: 

  • DATABASE
  • EVENT
  • FUNCTION
  • INDEX
  • PROCEDURE
  • TABLE
  • TRIGGER
  • USER
  • VIEW

49.Mysql 表中允许有多少个 TRIGGERS?

在 Mysql 表中允许有六个触发器,如下:

  • BEFORE INSERT
  • AFTER INSERT
  • BEFORE UPDATE
  • AFTER UPDATE
  • BEFORE DELETE
  • AFTER DELETE

50.什么是非标准字符串类型?

以下是非标准字符串类型: 

  • TINYTEXT 
  • TEXT 
  • MEDIUMTEXT
  • LONGTEXT

51.什么是通用 SQL 函数?

  • CONCAT(A, B) - 连接两个字符串值以创建单个字符串输出。通常用于将两个或多个 字段合并为一个字段
  • FORMAT(X, D)- 格式化数字 X 到 D 有效数字
  • CURRDATE(), CURRTIME()- 返回当前日期或时间
  • NOW() - 将当前日期和时间作为一个值返回
  • MONTH(),DAY(),YEAR(),WEEK(),WEEKDAY() - 从日期值中 提取给定数据
  • HOUR(),MINUTE(),SECOND() - 从时间值中提取给定数据
  • DATEDIFF(A,B) - 确定两个日期之间的差异,通常用于计算年龄 
  • SUBTIMES(A,B) - 确定两次之间的差异
  • FROMDAYS(INT) - 将整数天数转换为日期值

52.Mysql支持事务吗?

  • 在缺省模式下,Mysql是autocommit模式的,所有的数据库更新操作都会即时提交,所以在缺省情况下,mysql是不支持事务的。
  • 但是如果你的Mysql表类型是使用InnoDBTables或BDBtables的话,你的Mysql就可以使用事务处理,使SETAUTOCOMMIT=0就可以使Mysql允许在非autocommit模式,在非autocommit模式下,你必须使用COMMI来提交你的更改,或者用ROLLBACK来回滚你的更改。
    示例如下:
START TRANSACTION; SELECT @A:=SUM(salary) FROM table1 WHERE type=1;
UPDATE table2 SET summmary=@A WHERE type=1;
COMMIT;

53.Mysql里记录货币用什么字段类型好?

decimal、numric类型(字符串存储,而不是做为二进制浮点数,以便保存那些值的小数精度)

54.Mysql数据表在什么情况下容易损坏?

  • 服务器突然断电导致数据文件损坏。
  • 强制关机,没有先关闭 Mysql 服务等。

55.Mysql 有关权限的表都有哪几个?

Mysql 服务器通过权限表来控制用户对数据库的访问,权限表存放在 Mysql 数据库里,由mysql_install_db脚本初始化。这些权限表分别 user,db,table_priv,columns_priv 和 host。

56.Mysql 中有哪几种锁?

  1. 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
  2. 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最
    高。
  3. 页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并
    发度一般。

57.数据库中的事务是什么?

  1. 原子性: 即不可分割性, 事务要么全部被执行, 要么就全部不被执行。
  2. 一致性或可串性。事务的执行使得数据库从一种正确状态转换成另一种正确状 态 3、隔离性。在事务正确提交之前,不允许把该事务对数据的任何改变提供给任何 其他事务,
  3. 持久性。事务正确提交后, 其结果将永久保存在数据库中, 即使在事务提交后有了其他故障, 事
    务的处理结果也会得到保存。

58.SQL 注入漏洞产生的原因?如何防止?

  • SQL注入产生的原因: 程序开发过程中不注意规范书写 sql 语句和对特殊字符进行过滤,导致客户端可以通过全局变量 POST 和 GET 提交一些 sql 语句正常执行。防止 SQL 注入的方式:
    开启配置文件中的 magic_quotes_gpc 和 magic_quotes_runtime 设置
  • 执行 sql 语句时使用 addslashes 进行 sql 语句转换Sql 语句书写尽量不要省略双引号和单引号。
    过滤掉 sql 语句中的一些关键词: update、insert、delete、select、 *
  • 提高数据库表和字段的命名技巧, 对一些重要的字段根据程序的特点命名, 取不易被猜到的。

59.外连接、内连接与自连接的区别?

先说什么是交叉连接: 交叉连接又叫笛卡尔积,它是指不使用任何条件,直接将一个表的所有记录和另
一个表中的所有记录一一匹配。内连接 则是只有条件的交叉连接,根据某个条件筛选出符合条件的记
录,不符合条件的记录不会出现在结果集中, 即内连接只连接匹配的行。
外连接 其结果集中不仅包含符合连接条件的行,而且还会包括左表、右表或两个表中
的所有数据行, 这三种情况依次称之为左外连接, 右外连接, 和全外连接。左外连接, 也称左连接,
左表为主表, 左表中的所有记录都会出现在结果集中, 对于那些在右表中并没有匹配的记录, 仍然要
显示, 右边对应的那些字段值以NULL 来填充。右外连接,也称右连接,右表为主表,右表中的所有记
录都会出现在结果集中。左连接和右连接可以互换, MySQL 目前还不支持全外连接。

60.什么是事务回滚机制

事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单
位,事务回滚是指将该事务已经完成的对数据库的更新操作撤销。要同时修改数据库中两个不同表
时,如果它们不是一个事务的话,当第一个表修改完,可能第二个表修改过程中出现了异常而没能修
改,此时就只有第二个表依旧是未修改之前的状态,而第一个表已经被修改完毕。而当你把它们设定
为一个事务的时候,当第一个表修改完,第二表修改出现异常而没能修改,第一个表和第二个表都要
回到未修改的状态,这就是所谓的事务回滚。

61.完整性约束包括哪些?

数据完整性(Data Integrity)是指数据的精确(Accuracy)和可靠性(Reliability)。
分为以下四类:

  1. 实体完整性: 规定表的每一行在表中是惟一的实体。
  2. 域完整性:是指表中的列必须满足某种特定的数据类型约束,其中约束又包括 取值范围、精度等规定。
  3. 参照完整性: 是指两个表的主关键字和外关键字的数据应一致,保证了表之间的数据的一致性,防止了数据丢失或无意义的数据在数据库中扩散。
  4. 用户定义的完整性:不同的关系数据库系统根据其应用环境的不同,往往还需 要一些特殊的约束条件。用户定义的完整性即是针对某个特定关系数据库的约束条件, 它反映某一具体应用必须满足的语义要求。
    与表有关的约束:包括列约束(NOT NULL( 非空约束))和表约束(PRIMARY KEY、foreign key、check、UNIQUE) 。

面试题——Mysql数据库管理系统篇相关推荐

  1. Mysql数据库管理系统原理及基本操作

    文章目录 Mysql数据库管理系统原理 一.引子: 二.数据库种类: 三.数据库解决的问题: 四.数据库的作用: 五.SQL结构语句: 六.关系型数据库结构: 七.存储引擎: 八.数据库存储和查询: ...

  2. MySQL数据库提升篇-----触发器

    day06 MySQL数据库提升篇-----触发器 一.触发器概述: 触发器是什么?能有什么作用?能给我们带来什么样的操作数据库的方法这都在这里学一一的告诉大家.触发器原理类似于扳机的原理,当你一点击 ...

  3. MySQL数据库管理系统原理

    一.介绍: mysql数据库管理系统是我国常见的关系型数据库管理系统,mysql严格来说不能算是数据库,它只是一个数据库管理系统.mysql相对于企业来说就相当于百度云盘相对于个人用户,都是用来更加方 ...

  4. 等保测评 安全计算坏境之mysql数据库管理系统

    安全计算坏境之mysql数据库管理系统 1. 身份鉴别 a)应对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换 "1)尝试登录数据库,执行mysql ...

  5. 1、MySQL——MySQL数据库管理系统、数据库基本概念

    目录 一.MySQL数据库管理系统 二.数据库基本概念 1.数据库(Database,DB) 2.数据库管理系统(Database  Management  System, DBMS) 3.数据库系统 ...

  6. 数据库-面试题-MySQL数据库的优化方法

    数据库-面试题-MySQL数据库的优化方法 2017年08月22日 17:56:57 小笛子的专栏 阅读数 13236 1.选取最适用的字段属性 MySQL可以很好的支持大数据量的存取,但是一般说来, ...

  7. 第25课:MySQL 数据库管理系统

    25.1 项目概述 本课将结合多种技术实现一款支持以太防网络的 MySQL 数据库管理系统,可以管理本机或远程的 MySQL 数据库. 本系统涉及到的技术(包括两类技术)如下所示. (1)JavaSc ...

  8. 4. MySQL数据库管理系统(MySQL的下载安装、配置、补丁 一站式)

    文章目录 MySQL数据库管理系统 1. MySQL下载 2. MySQL安装 3. 创建配置文件 4. 初始化 5. 启动MySQL 6. 使用MySQL 7. MySQL测试 MySQL数据库管理 ...

  9. MySQL数据库高级篇教程 B站康师傅笔记(持续更新)

    第二部分 MySQL高级特性篇 第01章 Linux下MySQL的安装与使用 1. 安装前说明 1.1 查看是否安装过MySQL 如果你是用rpm安装, 检查一下RPM PACKAGE: rpm -q ...

最新文章

  1. android edittext html 图片,Android EditText加载HTML内容(内容包含网络图片) -电脑资料...
  2. ZOC7 for Mac连接CentOS7无法输入中文问题
  3. [原]排错实战——通过对比分析sysinternals事件修复程序功能异常
  4. AD:使用C#批量创建帐号
  5. 洛谷P1067 多项式输出
  6. packetbeat mysql_简单使用packetbeat
  7. android 自定义progressbar demo,Android 自定义进度条ColorfulProgressbar,原理简单、效果还行...
  8. 栈溢出笔记1.7 地址问题(2)
  9. 你不懂js系列学习笔记-类型与文法- 02
  10. Spring AOP切入点
  11. 解锁新招:冷冻手机窃密数据
  12. 苹果电风扇软件Macs Fan Control Pro安装教程
  13. java语言的一些小语法
  14. 矩阵键盘行列扫描c语言,单片机矩阵键盘按钮行列逐级扫描法
  15. Learning the Model Update for Siamese Trackers 论文学习
  16. 如何写一份前端开发简历
  17. 基于Labview的串口通信助手,附带免费的exe程序和vi文件(有意见或学习讨论欢迎交流)
  18. 第一章: 准备面试要知己知彼
  19. ps4看直播 HTML,ps4直播教学 怎么样才能直播
  20. ACM模板 | 学习笔记 树相关

热门文章

  1. Callable接口详解
  2. Y460 安装ubuntu 12.04系统黑屏,登录界面黑屏
  3. C语言基础--宏函数
  4. c语言sprintf函数 long,基于C语言sprintf函数的深入理解
  5. wxcharts使用说明,转官方文档!
  6. socket阻塞和非阻塞模式
  7. 分析wpa_supplicant起始函数main源码
  8. Unity寻路报错“SetDestination“ can only be called on an active agent that has been placed on a NavMesh.
  9. Android进阶——网络通信之ip rule,ip route等策略路由小结
  10. int8 int16 int32 int64 float16 float32