MySQL理论系列html
- 列举常见的关系型数据库和非关系型都有那些?
关系型RDBMS:有表结构,存取数据前必先定义表结构,存数据必须按照字段的类型或者约束来mysql
典型表明:MySQL,Oracle,DB2,SQL server(银行业经常使用)ios
非关系型(爬虫类经常使用):存取数据都是采用key:value的形式redis
非关系型:Mongodb,redis,memcache(较不经常使用)sql
- MySQL常见数据库引擎及比较?
常见innodb,myisam,memory,blackhole几种存储引擎,数据库
最经常使用的为innodb innodb:亦为默认存储引擎,支持事务,行锁设计,外键网络
t1.frm (frame) t1.ibd (innodb data); 存入硬盘数据结构
myisam:t2.MYD (myisam data) t2.MYI (myisam index) t2.frm (frame); 存入硬盘数据库设计
blackhole: t3.frmide
memory: t4.frm; 存入内存,关闭服务端后,数据清空
- 简述数据三大范式?
第一范式(1NF):确保每一列的原子性(若是每一列都是不可再分的最小数据单元,则知足第一范式。)
第二范式:非键字段必须依赖于键字段(第二范式要求每一个表只描述一件事。)
第三范式:在1NF基础上,除了主键之外的其它列都不传递依赖于主键列,或者说: 任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)
- 什么是事务?MySQL如何支持事务?
什么是事务: 开启一个事务能够包含一些sql语句,这些sql语句要么同时成功;要么一个都别想成功,称之为事务的原子性
事务的做用:转帐等,屏蔽因网络传输部分失效而带来的影响
BEGIN 或START TRANSACTION:显式地开启一个事务
COMMIT:也可使用COMMIT WORK,不过两者是等价的。COMMIT会提交事务,并使已对数据库进行的全部修改为为永久性的
ROLLBACK:也可使用ROLLBACK WORK,不过两者是等价的。回滚会结束用户的事务,并撤销正在进行的全部未提交的修改
SAVEPOINT identifier:SAVEPOINT容许在事务中建立一个保存点,一个事务中能够有多个SAVEPOINT
RELEASE SAVEPOINT identifier:删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常
ROLLBACK TO identifier:把事务回滚到标记点
SET TRANSACTION:用来设置事务的隔离级别。InnoDB存储引擎提供事务的隔离级别有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLE
delimiter //
create PROCEDURE p5(
OUT p_return_code tinyint
)
BEGIN
DECLARE exit handler for sqlexception #若是出现错误,执行
BEGIN
-- ERROR
set p_return_code = 1;
rollback;
END;
DECLARE exit handler for sqlwarning #若是出现警告,执行
BEGIN
-- WARNING
set p_return_code = 2;
rollback;
END;
START TRANSACTION; #事务的应用
update user set balance=900 where id =1;
update user123 set balance=1010 where id = 2;
update user set balance=1090 where id =3;
COMMIT;
-- SUCCESS
set p_return_code = 0; #0表明执行成功
END //
delimiter ;
- 简述数据库设计中一对多和多对多的应用场景?
a、 左表与右表之间是否有多对一的关系 (多个员工属于一个部门)
b、 右表与左表之间是否有多对一的关系 (多个部门拥有一个员工)
i、a True & b False 多对一
ii、a False & b True 多对一
iii、a True & b True 多对多
iv、a False & b False 一对一
- 如何基于数据库实现商城商品计数器?
DROP TABLE access_counter;
CREATE TABLE access_counter(
solt INT NOT NULL PRIMARY KEY,
cnt INT NOT NULL
);
DELIMITER $
DROP PROCEDURE IF EXISTS `proc1`$
CREATE PROCEDURE `proc1`()
BEGIN
DECLARE i INT;
SET i=0;
WHILE i<100 DO
INSERT INTO access_counter VALUES(i,0);
SET i=i+1;
END WHILE;
END$
DELIMITER ;
CALL proc1();
SELECT * FROM access_counter;
07. 简述触发器、函数、视图、存储过程?
视图、触发器、事务、存储过程、函数、流程控制皆是在库下面创建
触发器:在知足对某张表数据的增、删、改的状况下,自动触发的功能称之为触发器
为什么要用触发器: 触发器专门针对咱们对某一张表数据增insert、删delete、改update的行为,这类行为一旦执行就会触发触发器的执行,即自动运行另一段sql代码
函数:mysql内置的函数只能在sql语句中使用,mysql> select date_format(sub_time,'%Y-%m'),count(id) from blog group by date_format(sub_time,'%Y-%m');
什么是视图:经过查询获得一张虚拟表,保存下来,下次可直接使用
为何要用视图: 若是要频繁使用一张虚拟表,能够不用重复查询
如何用视图:create view teacher2course as select * from teacher inner join course on teacher.tid = course.teacher_id;
删除视图:drop view teacher2course;
强调:在硬盘中,视图只有表结构文件(.frm),没有表数据文件(.idb); 其在后台对应的是一条sql语句;视图一般是用于查询,尽可能不要修改视图中的数据
#在mysql中函数是不能单独使用的,必须放在sql语句中使用;但存储过程是能够单独使用的
存储过程:存储过程包含了一系列可执行的sql语句,存储过程存放于MySQL中,经过调用它的名字能够执行其内部的一堆sql
08. MySQL索引种类
primary key(汇集索引):叶子节点存放的一整条数据,
unique,index key(辅助索引):叶子节点存放的是:{名字:名字所在那条记录的主键的值};覆盖索引,回表操做
09. 索引在什么状况下遵循最左前缀的规则?
mysql中对a or b or c。。的形式,会从左至右依次查询
10. 主键和外键的区别?
primary key就等同于not null unique(约束);加速查询;innodb 用主键(一种索引)字段为依据组织数据,造成一种树型结构,从而加速查询
key(索引)为mysql中一种特殊的数据结构
a、unique 约束条件,加速查询
b、primary key 约束条件,加速查询,innodb组织数据结构的依据
c、index key 加速查询
d、foreign key 没有加速查询功能
11. MySQL常见的函数?
聚合函数group function(通常与分组连用)
select post,max(salary) from emp group by post; #取不出组内的元素name, age..,只能取组名(分组依据)或用聚合函数
select post,min(salary) from emp group by post;
select post,avg(salary) from emp group by post;
select post,sum(salary) from emp group by post;
select post,count(id) from emp group by post;
#group_concat(分组以后用):把想要用的信息取出;字符串拼接操做
select post,group_concat(name) from emp group by post;
select post,group_concat(name,"_SB") from emp group by post;
select post,group_concat(name,": ",salary) from emp group by post;
select post,group_concat(salary) from emp group by post;
补充concat(不分组时用):字符串拼接操做
select concat("NAME: ",name) as 姓名,concat("SAL: ",salary) as 薪资from emp;
12. 列举 建立索引可是没法命中索引的8种状况。
1)若是条件中有or,即便其中有条件带索引也不会使用(这也是为何尽可能少用or的缘由)
2)对于多列索引,不是使用的第一部分(第一个),则不会使用索引
3)like查询是以%开头
4) 若是列类型是字符串,那必定要在条件中将数据使用引号引用起来,不然不使用索引
5) 若是mysql估计使用全表扫描要比使用索引快,则不使用索引
6) 没有查询条件,或者查询条件没有创建索引
7) 在查询条件上没有使用引导列
8) 查询的数量是大表的大部分,应该是30%以上。
9) 索引自己失效
10) 查询条件使用函数在索引列上,或者对索引列进行运算,运算包括(+,-,*,/,! 等) 错误的例子:select * from test where id-1=9; 正确的例子:select * from test where id=10;
11) 对小表查询
12) 提示不使用索引
13) 统计数据不真实
14) CBO计算走索引花费过大的状况。其实也包含了上面的状况,这里指的是表占有的block要比索引小。
15) 隐式转换致使索引失效.这一点应当引发重视.也是开发中常常会犯的错误. 因为表的字段tu_mdn定义为varchar2(20),但在查询时把该字段做为number类型以where条件传给Oracle,这样会致使索引失效. 错误的例子:select * from test where tu_mdn=13333333333; 正确的例子:select * from test where tu_mdn='13333333333';
16) 1,<> 2,单独的>,<,(有时会用到,有时不会)
17) like "%_" 百分号在前.
18) 表没分析.
19) 单独引用复合索引里非第一位置的索引列.
20) 字符型字段为数字时在where条件里不添加引号.
21) 对索引列进行运算.须要创建函数索引.
22) not in ,not exist.
23) 当变量采用的是times变量,而表的字段采用的是date变量时.或相反状况。
24) B-tree索引is null不会走,is not null会走,位图索引is null,is not null 都会走
25) 联合索引is not null 只要在创建的索引列(不分前后)都会走, in null时 必需要和创建索引第一列一块儿使用,当创建索引第一位置条件是is null 时,其余创建索引的列能够是is null(但必须在全部列 都知足is null的时候),或者=一个值; 当创建索引的第一位置是=一个值时,其余索引列能够是任何状况(包括is null =一个值),以上两种状况索引都会走。其余状况不会走。
13. 如何开启慢日志查询?
开启慢查询日志,可让MySQL记录下查询超过指定时间的语句,经过定位分析性能的瓶颈,才能更好的优化数据库系统的性能。
在/etc/my.cnf中修改
14. 数据库导入导出命令(结构+数据)?
http://www.cnblogs.com/zcw-ios/articles/3319480.html
15. 数据库优化方案?
16. char和varchar的区别?
char: 定长
varchar: 变长
#不推荐混用,若是混用需定长在前、变长在后。
create table t12(x char(4)); # 超出4个字符则报错,不够4个字符则用空格补全成4个字符
create table t13(y varchar(4)); #超出4个字符则报错不够4个字符那么字符有几个就存几个
name char(5)
# 缺点:浪费空间
# 优势:存取速度都快
egon alex lxx wxx yx
name varchar(5)
# 缺点:存取速度都慢
# 优势:节省空间(it depends); 须要一个头(1-2个字节)存长度# 2bytes可存65535个字符,mysql中全部字符串(char)中字符数皆不超过65535
(1bytes+egon)(1bytes+alex)(1bytes+lxx)
17. 简述MySQL的执行计划?
id是一组数字,表示查询中执行select子句或操做表的顺序。
若是id相同,则执行顺序从上至下。
若是是子查询,id的序号会递增,id越大则优先级越高,越先会被执行。
id若是相同,则能够认为是一组,从上往下顺序执行,全部组中,id越高,优先级越高,越容易执行。
selecttype有simple,primary,subquery,derived(衍生),union,unionresult。
simple表示查询中不包含子查询或者union。
当查询中包含任何复杂的子部分,最外层的查询被标记成primary。
在select或where列表中包含了子查询,则子查询被标记成subquery。
在from的列表中包含的子查询被标记成derived。
若第二个select出如今union后,则被标记成union,若union在from子句的子查询中,外层的select被标记成derived。
从union表获取结果的select被标记成union result。
type叫访问类型,表示在表中找到所需行的方式,常见类型有
all,index,range,ref,eq_ref,const,system,NULL 性能从左至右由差至好。
ALL,即full table scan,mysql将遍历全表来找到所须要的行。
index为full index scan,只遍历索引树。
range表示索引范围扫描 ,对索引的扫描开始于一点,返回匹配的值域的行,常见于between,<,>的查询。
ref为非惟一性索引扫描,返回匹配某个单独值的全部行,常见于非惟一索引即惟一索引的非惟一前缀进行的查找。
const,system表示当对查询部分进行优化,并转化成一个常量时,使用这些类型访问。好比将主键置于where列表中,mysql就能把该查询置成一个常量。system是const的一个特例,当查询表中只有一行的状况下使用的是system。
NULL表示在执行语句中,不用查表或索引。
possiblekey表示能使用哪一个索引在表中找到行,查询涉及到的字段上若存在索引,则该索引被列出,但不必定被查询使用。
18. 在对name作了惟一索引前提下,简述如下区别:
select * from tb where name = ‘Oldboy’
select * from tb where name = ‘Oldboy’ limit 1
limit 1显示一条