1:什么是数据库事务
参考答案:
数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。
2:事务的特性及其含义
参考答案:
事务有四个特性,分别是原子性(Atomicity)、一致性(Correspondence)、隔离性(Isolation)、持久性(Durability),简称ACID。
原子性:事务必须是原子工作单元;对于数据修改,要么全都执行,要么全都不执行。
一致性:事务在完成时,必须使所有的数据都保持一致状态。
隔离性:由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。
持久性:事务完成之后,它对于系统的影响是永久性的。
3:关系型数据库和非关系型数据库的区别
参考答案:
关系型数据库采用了关系模型来组织数据,关系模型是一个二位表格,一般采用行存储,最大的特点就是事务的一致性;
非关系型数据库使用键值对存储数据,多用于分布式的数据存储,一般不支持ACID特性,严格上不是一种数据库,应该是一种数据结构化存储方法的集合。
4:什么是视图
参考答案:
视图(VIEW)也被称作虚表,即虚拟的表,是一组数据的逻辑表示,其本质是对应于一条SELECT语句,结果集被赋予一个名字,即视图名字。 视图本身并不包含任何数据,它只包含映射到基表的一个查询语句,当基表数据发生变化,视图数据也随之变化。
1、视图能够简化用户的操作;
2、视图使用户能以多钟角度看待同一数据;
3、视图对重构数据库提供了一定程度的逻辑独立性;
4、视图能够对机密数据提供安全保护;
5、适当的利用视图可以更清晰的表达查询。
5:什么是存储过程
参考答案:
存储过程是一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。
6:简述数据库三范式
参考答案:
第一范式:字段是最小的的单元不可再分;
第二范式:满足第一范式,表中的字段必须完全依赖于全部主键而非部分主键;
第三范式:满足第二范式,非主键外的所有字段必须互不依赖。
7:Mysql两种引擎MyISAM和InnoDB的特点
参考答案:
MyISAM引擎是MySQL 5.1及之前版本的默认引擎,它的特点是:
不支持行锁,读取时对需要读到的所有表加锁,写入时则对表加排它锁;
不支持事务;
不支持外键;
不支持崩溃后的安全恢复;
在表有读取查询的同时,支持往表中插入新纪录;
支持BLOB和TEXT的前500个字符索引,支持全文索引;
支持延迟更新索引,极大提升写入性能;
对于不会进行修改的表,支持压缩表,极大减少磁盘空间占用;
InnoDB在MySQL 5.5后成为默认索引,它的特点是:
支持行锁,采用MVCC来支持高并发;
支持事务;
支持外键;
支持崩溃后的安全恢复;
不支持全文索引;
总体来讲,MyISAM适合SELECT密集型的表,而InnoDB适合INSERT和UPDATE密集型的表。
8:什么是索引
参考答案:
索引是为了加速对表中数据行的检索而创建的一种分散的存储结构。索引是针对表而建立的,它是由数据页面以外的索引页面组成的,每个索引页面中的行都会含有逻辑指针,以便加速检索物理数据。
9:什么是主键和外键,主键与唯一键的区别
参考答案:
主键是能够唯一标识表中某一行的属性或属性组。一个表只能有一个主键。
外键是用于建立和加强两个表数据之间的链接的一列或多列。外键约束主要用来维护两个表之间数据的一致性。
主键不能重复,不能为空,唯一键不能重复,可以为空。
建立主键的目的是让外键来引用。
一个表最多只有一个主键,但可以有很多唯一键。
语法篇
1:SQL语言包括哪几部分,每部分都有哪些操作关键字
参考答案:
SQL语言包括数据定义(DDL)、数据操纵(DML),数据控制(DCL)和数据查询(DQL)四个部分。
数据定义:Create Table,Alter Table,Drop Table, Craete/Drop Index等
数据操纵:Select ,insert,update,delete,
数据控制:grant,revoke
数据查询:select
2:什么样的对象可以使用 CREATE 语句创建 ?
参考答案:
以下对象是使用 CREATE 语句创建的:
DATABASE、EVENT、FUNCTION、INDEX、PROCEDURE、TABLE、TRIGGER、USER、VIEW
3:Mysql中NULL是什么意思,它和空值有什么区别
参考答案:
NULL这个值表示UNKNOWN(未知),它不表示“”(空字符串)。对NULL这个值的任何比较都会生产一个NULL值。不能把任何值与一个 NULL值进行比较,并在逻辑上希望获得一个答案。需要使用IS NULL或者IS NOT NULL来进行NULL判断,SQL语句函数中可以使用ifnull ()函数来进行处理。
空值(”)是不占用空间的,判断空字符用 = ” 或者 <> ” 来进行处理。
无法比较 NULL 和 0;它们是不等价的。
无法使用比较运算符来测试 NULL 值,比如 =, <, 或者 <>。
NULL值可以使用 <=> 符号进行比较,该符号与等号作用相似,但对NULL有意义。
进行 count ()统计某列的记录数的时候,如果采用的 NULL 值,会别系统自动忽略掉,但是空值是统计到其中。
4:IFNULL函数如何使用
参考答案:
IFNULL(expr1,expr2)
如果expr1不是NULL,IFNULL()返回expr1,否则它返回expr2。IFNULL()返回一个数字或字符串值。
5:什么情况下设置了索引但无法使用
参考答案:
1、以“%”开头的LIKE语句,模糊匹配
2、OR语句前后没有同时使用索引
3、数据类型出现隐式转化(如varchar不加单引号的话可能会自动转换为int型)
6:如何列出某个数据库,以及一个数据库中的所有表
参考答案:
show databases;
show tables;
7:如何获取表内所有 Field 对象的名称和类型
参考答案:
在mysql中如果想要查看表的定义的话,有以下两种方式:
1、show create table table_name;
2、desc table_name;
8:UNION 和 UNION ALL 有什么区别
参考答案:
UNION用于合并两个或多个SELECT语句的结果集,并消去表中任何重复行。UNION 内部的 SELECT 语句必须拥有相同数量的列,列也必须拥有相似的数据类型。同时,每条SELECT语句中的列的顺序必须相同。
UNIONALL基本使用和UNION是一致的,但是UNION ALL不会消除表中的重复行。
9:连接的种类与区别
参考答案:
SQL 连接(JOIN)子句用于将数据库中两个或者两个以上表中的记录组合起来。连接通过共有值将不同表中的字段组合在一起。
SQL 中有多种不同的连接:
内连接(INNERJOIN):当两个表中都存在匹配时,才返回行。
左连接(LEFTJOIN):返回左表中的所有行,即使右表中没有匹配的行。
右连接(RIGHTJOIN):返回右表中的所有行,即使左表中没有匹配的行。
全连接(FULLJOIN):只要某一个表存在匹配,就返回行。
笛卡尔连接(CARTESIANJOIN):返回两个或者更多的表中记录集的笛卡尔积。
10:如何做模糊查询
参考答案:
语法:SELECT 字段 FROM 表 WHERE 某字段 LIKE 条件
其中条件的匹配模式有:
1、%:表示任意0个或多个字符。可匹配任意类型和长度的字符。
2、_:表示任意单个字符。匹配单个任意字符,它常用来限制表达式的字符长度语句。
3、[ ]:表示括号内所列字符中的一个(类似正则表达式)。指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。
4、[^ ]:表示不在括号所列之内的单个字符。其取值和[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。
11:如何定义 REGEXP,LIKE 和 REGEXP 操作有什么区别
REGEXP 是模式匹配,其中匹配模式在搜索值的任何位置。
语法:SELECT字段 FROM 表 WHERE 某字段 REGEXP 条件。
LIKE进行简单的模糊查询, REGEXP可以进行各种复杂匹配。
12:in与exists的区别
参考答案:
exists用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False。IN语句对于子查询的返回字段只能由一个。
外层查询表小于子查询表,则用exists,外层查询表大于子查询表,则用in,如果外层和子查询表差不多,则爱用哪个用哪个。
13:varchar与char的区别以及varchar(50)中的50代表的含义
参考答案:
char是一种固定长度的类型,varchar则是一种可变长度的类型,它们的区别是:
char(M)类型的数据列里,每个值都占用M个字节,如果某个长度小于M,MySQL就会在它的右边用空格字符补足。在varchar(M)类型的数据列里,每个值只占用刚好够用的字节再加上一个用来记录其长度的字节。
varchar(50)表示最多占用50个字符。
14:int(5)中5的含义
参考答案:
int(M) M表示的不是数据的最大长度,只是数据宽度,并不影响存储多少位长度的数据。
int类型数据的字节大小是固定的4个字节。int(5)和int(11)区别在于,显示的数据位数一个是5位一个是11位,在开启zerofill(填充零)情况下,若int(5)存储的数字长度是小于5的则会在不足位数的前面补充0,但是如果int(5)中存储的数字长度大于5位的话,则按照实际存储的显示(数据大小在int类型的4个字节范围内即可)。
15:BLOB 和 TEXT 有什么区别
参考答案:
TEXT与BLOB的主要差别就是BLOB保存二进制数据,TEXT保存字符数据。
BLOB有4种类型:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。它们只是可容纳值的最大长度不同。TEXT也有4种类型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。这些类型同BLOB类型一样,有相同的最大长度和存储需求。
BLOB列没有字符集,并且排序和比较基于列值字节的数值值。TEXT列有一个字符集,并且根据字符集的校对规则对值进行排序和比较。
BLOB和TEXT列不能有默认值。
16:drop,delete与truncate的区别
参考答案:
delete
1、delete是DML,执行delete操作时,每次从表中删除一行,并且同时将该行的的删除操作记录在redo和undo表空间中以便进行回滚(rollback)和重做操作,但要注意表空间要足够大,需要手动提交(commit)操作才能生效,可以通过rollback撤消操作。
2、delete可根据条件删除表中满足条件的数据,如果不指定where子句,那么删除表中所有记录。
3、delete语句不影响表所占用的extent,高水线(high watermark)保持原位置不变。
truncate
1、truncate是DDL,会隐式提交,所以,不能回滚,不会触发触发器。
2、truncate会删除表中所有记录,并且将重新设置高水线和所有的索引,缺省情况下将空间释放到minextents个extent,除非使用reusestorage,。不会记录日志,所以执行速度很快,但不能通过rollback撤消操作(如果一不小心把一个表truncate掉,也是可以恢复的,只是不能通过rollback来恢复)。
3、对于外键(foreignkey)约束引用的表,不能使用truncate table,而应使用不带where 子句的delete语句。
4、truncate table不能用于参与了索引视图的表。
drop
1、drop是DDL,会隐式提交,所以,不能回滚,不会触发触发器。
2、drop语句删除表结构及所有数据,并将表所占用的空间全部释放。
3、drop语句将删除表的结构所依赖的约束,触发器,索引,依赖于该表的存储过程/函数将保留,但是变为invalid状态。
安全与优化篇
1:MySQL 服务器默认端口是什么
参考答案:
MySQL 服务器的默认端口是 3306。
2:mysql怎样进行用户权限管理
参考答案:
可以通过如下方面进行用户权限管理:
1、限制用户访问哪些库、哪些表
2、限制用户对哪些表执行SELECT、CREATE、DELETE、DELETE、ALTER等操作
3、限制用户登录的IP或域名
4、限制用户自己的权限是否可以授权给别的用户
3:MySQL有哪些日志,分别是什么用处
参考答案:
mysql日志一般分为5种
1、错误日志:-log-err (记录启动,运行,停止mysql时出现的信息)
2、二进制日志:-log-bin (记录所有更改数据的语句,还用于复制,恢复数据库用)
3、查询日志:-log (记录建立的客户端连接和执行的语句)
4、慢查询日志:-log-slow-queries (记录所有执行超过long_query_time秒的所有查询)
5、更新日志: -log-update (二进制日志已经代替了老的更新日志,更新日志在MySQL5.1中不再使用)
4:sql注入的主要特点与危害
参考答案:
Sql注入变种极多,攻击简单,危害极大,主要有:
1、未经授权操作数据库的数据
2、恶意纂改网页
3、私自添加系统账号或者是数据库使用者账号
4、网页挂木马
5:如何提高insert性能
参考答案:
1、合并多条 insert 为一条,即: insert into t values(a,b,c), (d,e,f) ,
2、修改参数 bulk_insert_buffer_size, 调大批量插入的缓存;
3、设置 innodb_flush_log_at_trx_commit = 0 ,相对于innodb_flush_log_at_trx_commit = 1 可以十分明显的提升导入速度;
4、手动使用事务
因为mysql默认是autocommit的,这样每插入一条数据,都会进行一次commit;所以,为了减少创建事务的消耗,我们可用手工使用事务,即STARTTRANSACTION;insert 。。,insert。。commit;即执行多个insert后再一起提交;一般1000条insert 提交一次。
6、数据库优化的思路
参考答案:
可以从以下方面进行展开
1、SQL语句优化
2、索引优化
3、数据库结构优化
范式优化: 比如消除冗余
反范式优化:比如适当加冗余等(减少join)拆分表:垂直拆分和水平拆分
4、服务器硬件优化
7、列举一些sql语句优化方法
8:如何优化 DISTINCT
9:explain出来的各种item的意义
10:profile的意义以及使用场景
11:mysql如何实现高效分页
12:如何进行分库分表
13:新创建的数据库,需要调整哪些参数