1. MySQL如何实现索引机制?
MySQL中索引分三类: B+树索引 Hash索引 全文索引
2. 请简述MySQL中innoDB支持的四种事务隔离级别名称,以及逐级之间的区别?
SQL标准定义的四个隔离级别为:
read uncommited: 读到未提交数据
在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应 用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)
read commited: 读取提交内容
这是大多数数据库系统的默认隔离级(但不是 MySQL 默认的)。它满足了隔离的简单定义:一 个事务只能看见已经提交事务所做的改变。这种隔离级别也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select 可能返回不同结果。
repeatable read: 可重读
这是 MySQL 的默认事务隔离级 别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据 行。不过理论上,这会导致另一个棘手的问题:幻读(PhantomRead)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事 务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现 有新的“幻影” 行。InnoDB 和 Falcon 存储引擎通过多版本并发控制 (MVCC,Multiversion Concurrency Control 间隙锁)机制解决了 该问题。注:其实多版本只是解决不可重复读问题,而加上间隙锁(也就是它这里所谓的并发控制)才解决了幻读问题
serializable: 可串行化
这是最高的隔离级别, 它通过加强事务排序, 使之不可能相互冲突, 从而解决幻读的问题. 它是在每个读的数据上加上共享锁. 这个级别可能会导致大量的超时现象和锁竞争
3 .CHAR 和 VARCHAR区别
CHAR和VARCHAR类型在存储和检索方面有所不同
CHAR列长度固定位创建时声明的长度, 长度值范围是1到255
当CHAR值被存储时, 它们被用空格填充到特定长度, 检索CHAR值时需删除尾随
4. 列的字符串类型可以是什么
SET BLOB ENUM CHAR TEXT VARCHAR
5. MySQL中使用什么存储引擎
存储引擎称为表类型, 数据使用各种技术存储在文件中
技术涉及:
Storage mechanism
Locking levels
Indexing
Capabilities and func tions
7. TIMESTAMP 在 UPDATE CURRENT_TIMESTAMP 数据类型上做什么
创建表是 TIMESTAMP列用 Zero 更新. 只要表中的其他字段发生更改, UPDATE CURRENT_TIMESTAMP 修饰符就将时间戳字段更新为当前时间
8. 主键和候选键有什么区别
表格的每一行都有主键唯一标识, 一个表只有一个主键
主键也是候选键. 按照惯例, 候选键可以被指定为主键, 并且可以用于任何外键引用
9. MySQL 数据库服务器性能分析的方法命令有哪些
Show status 一些值得监控的变量值:
Bytesreceived 和 Bytessent 和服务器之间来往的流量.
Com服务器正在执行命令.
Created 在查询执行期间创建的临时表和文件
Handler 存储引擎操作
Select 在不同类型的联接执行计划
Sort_* 几种排序信息
10. LIKE 和 REGEXP操作有什么区别
LIKE 和 REGEXP 运算符用 ^ 和 %表示任意多个字符
SELECT * FROM <tablename> WHERE * REGEXP "^b";
SELECT * FROM <tablename> WHERE * LIKE "%b";
11. BLOB 和 TEXT 有什么区别
BLOB 是一个二进制对象, 可以容纳可变数量的数据. 有四种类型的 BLOB
TINYBLOB
BLOB
MEDIUMLOB
LONGBLOB
他们只能在所能容纳价值的最大长度上有所不同
TEXT 是一个不区分大小写得到 BLOB . 四种 TEXT 类型
TINYTEXT
TEXT
MEDIUMTEXT
LONGTEXT
他们对于四种 BLOB 类型, 并具有相同的最大长度和存储要求
BLOB 和 TEXT 类型之间唯一区别在于对 BLOB 值进行排序和比较时区分大小写, 对 TEXT 值不区分大小写
12. 数据库的三范式
第一范式: 数据库表的每一个字段都是不可分割的
第二范式: 数据库表中的非主属性只依赖于主键
第三范式: 非主键字段不能依赖于其他非主键字段
13. MySQL 表中允许有多少个 TRIGGERS
在 MySQL 表中允许有六个触发器:
BEFORE INSERT
AFTER INSERT
BEFORE UPDATE
AFTER UPDATE
BEFORE DELETE
AFTER DELETE
14. 什么是通用 SQL函数
数学函数
Abs(num) 求绝对值
floor(num)向下取整
ceil(num)向上取整
字符串函数
insert(s1, index, length, s2) 替换函数
s1表示被替换的字符串
s2表示将要替换的字符串
index表示被替换的位置(从1开始)
Length表示被替换的长度
upper(str), ucase(str) 将字母改成大写
lower(str), lcase(str)将字母改成小写
left(str, length) 返回 str 字符串的前 length 个字节
right(str, length) 返回 str 字符串的后 length 个个字节
substring(str, index, length) 返回 str 字符串从 index 开始, 长度为length 的字符串(index从1开始)
reverse(str) 将 str字符串倒序输出
日期函数
curdate(), current_date 获取当前日期
curtime(), current_time() 获取当日期
now() 获取当前时间
datediff(d1, d2) d1 和 d2 之间的天数差
adddate(date, num) 返回date日期开始, 之后num天的日期
subdate(date, num) 返回date日期开始, 之前num天的日期
聚合函数
count(字段) 根据某个字段统计总记录数(当前数据库保存到多少条数据)
sum(字段) 计算某个字段的数值总和
avg(字段) 计算某个字段的数值平均值
max(字段), min(字段) 求某个字段的最大或最小值
15. MySQL中有哪几种锁
MylSAM 支持表锁, InnoDB 支持表锁和行锁, 默认为行锁
表级锁: 开销小, 加锁块, 不会出现死锁, 锁定粒度大, 发送锁冲突概率最高, 并发量最低
行级锁: 开销大, 加锁慢, 会出现死锁, 锁力度小, 发生锁冲突概率小, 并发度最高
16, MySQL 数据优化
优化数据类型:
避免使用 NULL, NULL 需要特殊处理, 大多数时候应该使用 NOT NULL, 或者一个特殊的值, 如0, -1作为默认值
小心字符集转换:
客户端或应用程序使用的字符集可能和表本身的字符集不一样, 这需要 MySQL 在运行过程中隐含的进行转换, 此外要确定字符集如 UTF-8 是否支持多字节字符, 因此他们需要更多的储存空间
优化子查询:
遇到子查询时, MySQL 查询优化引擎并不是总是最有效的, 这就是为什么经常将子查询转换为连接查询的原因了, 优化器已经能够正确处理连接查询了, 当然要注意的一点是, 确保连接表(第二个表)的连接列是有索引的, 在第一个表上 MySQL 通常会相对于第二个表的查询子集进行一次全表扫描, 这是嵌套循环算法的一部分
优化INION
在跨多个不同的数据库使用 UNION 是一个有趣的优化方法
UNION 从两个互不关联的表中返回数据, 这就意味着不会出现重复的行, 同时也必须对数据进行排序, 我们知道排序是非常消耗资源的, 特别是对大表的排序
UNION ALL 可以大大加快速度, 如果你已经知道你的数据不会包括重复行, 或者你不在乎是否会出现重复行, 在这两种情况下使用 INION ALL 更适合. 此外, 还可以在应用程序逻辑中采用某些方法避免出现重复的行, 这样 UNION ALL 和 UNION 返回的结果都是一样的, 但 UNION ALL 不会进行排序.
17. 存储引擎
存储引擎就是如何存储数据,如何为存储的数据建立索引和如何更新,查询数据等技术的实现方法
MylSAM: 这种引擎是 MySQL 最早提供的, 可以分为静态MylSAM, 动态MylSAM 和压缩MylSAM 三种:
静态MylSAM: 如果数据报中的各数据列的长度都是预先固定好的, 服务器将自动选择这种表类型. 因为数据报中每一条记录所占用的空间都是一样的, 所以这种表存取和更新的效率非常高. 当数据受损时, 恢复工作也比较容易做.
动态MylSAM: 如果数据表中出现 varchar, text 或 BLOB 字段是, 服务器将自动选择这种表类型. 相对于静态MylSAM, 这种表存储空间比较小, 但由于每条记录的长度不一, 所以多次修改数据后, 数据表中的数据就肯离散的存储在内存中, 进而导致执行效率下贱. 同是, 内存中也可能出现很多碎片. 因此这种类型的表要进场用 optimize table 命令或优化工具进行碎片整理.
压缩MylSAM: 以上说到的两种类型的表都可以用 myisamchk 工具压缩. 这种类型的表进一步减少了占用的存储, 但是这种表压缩之后不能再被修改. 另外, 因为是压缩数据, 所以这种表在读取的时候要先进行解压缩.
但是,不管是何种 MylSAM 表, 目前都不支持事务, 行级锁和外键约束的功能
MylSAM Merge 引擎, 这种类型是 MylSAM 类型的一种变种. 合并表是将几个相同的 MylSAM 表合并为一个虚表. 常应用于日志和数据仓库.
InnoDB: InnoDB 表类型可以看做是对 MylSAM 的进一步更新产品, 它提供了事务,行级锁机制和外键约束功能.
memory(heap): 这种类型的数据报只存在于内存中. 它使用散列索引, 所以数据的存取速度非常快. 因为是存在于内存中, 所以这种类型常应用于临时表中.
archive: 这种类型只支持 select 和 insert 语句, 而且不支持索引.
Desc[ribe] tablename: 查看数据表的结构.
show engines: 命令可以显示当前数据库支持的存储引擎情况.