文章目录
- 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 中有哪几种锁?
1. 唯一索引比普通索引快吗, 为什么?
唯一索引不一定比普通索引快, 可能还更慢。
- 查询时, 在未使用
limit
的情况下, 在匹配到一条数据后, 唯一索引即返回, 普通索引则会继续匹配下一条数据, 发现不匹配后返回。如此看来唯一索引少了一次匹配, 但实际上这个消耗微乎其微。 - 更新时, 这个情况就比较复杂了。普通索引将记录放到
change buffer
中语句就执行完毕了. 而对唯一索引而言, 它必须要校验唯一性, 因此, 必须将数据页读入内存确定没有冲突, 然后才能继续操作. 对于写多读少的情况, 普通索引利用change buffer
有效减少了对磁盘的访问次数, 因此普通索引性能要高于唯一索引。
2. MySQL由哪些部分组成, 分别用来做什么?
- Server
连接器: 管理连接, 权限验证
分析器: 词法分析, 语法分析
优化器: 执行计划生成, 索引的选择
执行器: 操作存储引擎, 返回执行结果 - 存储引擎: 存储数据, 提供读写接口
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事务的隔离级别, 分别有什么特点?
- 读未提交(RU): 一个事务还没提交时, 它做的变更就能被别的事务看到
- 读提交(RC): 一个事务提交之后, 它做的变更才会被其他事务看到
- 可重复读(RR): 一个事务执行过程中看到的数据, 总是跟这个事务在启动时看到的数据是一致的. 当然在可重复读隔离级别下, 未提交变更对其他事务也是不可见的
- 串行化(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的一个高效的方案,大部分互联网公司都在使用雪花算法,当然还有公司自
己实现其他的方案。
二、雪花算法
2、缺点
三、代码实现
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位的ID
return ((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(可串行化)
这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。
对于不同的事务,采用不同的隔离界别分别有不同的结果,不同的隔离界别有不同的现象。主要有下面三种:
- 脏读(dirty read):一个事务可以读取另一个尚未提交事务的修改数据
- 非重复度(nonrepeatable read):在同一个事务中,同一个查询在T1时间读取某一行,在T2时间重新读取这一行时候,这一行的数据以及发生修改,可能被
更新(update)
了,也可能被删除(delete)
了 - 幻读(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数据库服务器性能分析的方法命令有哪些?
- 查询服务器状态和配置
列出Mysql服务器运行各种状态值:
mysql> show global status;
查询Mysql服务器配置信息语句:
mysql> show variables;
- 慢查询
mysql> show variables like '%slow%';
mysql> show global status like '%slow%';
- 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%';
- 临时表
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');
- 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';
- 进程使用情况
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';
- 查询缓存
mysql> show global status like 'qcache%';
- 排序使用情况
mysql> show global status like 'sort%';
- 表锁情况
mysql> show global status like 'table_locks%';
- 表扫描情况
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 中有哪几种锁?
- 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
- 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最
高。 - 页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并
发度一般。