mysql复习

MySQL理论系列html

  1. 列举常见的关系型数据库和非关系型都有那些?

关系型RDBMS:有表结构,存取数据前必先定义表结构,存数据必须按照字段的类型或者约束来mysql

典型表明:MySQLOracleDB2SQL server(银行业经常使用)ios

 

非关系型(爬虫类经常使用):存取数据都是采用key:value的形式redis

非关系型:Mongodbredismemcache(较不经常使用)sql

 

  1. MySQL常见数据库引擎及比较?

常见innodbmyisammemoryblackhole几种存储引擎,数据库

 

最经常使用的为innodb innodb:亦为默认存储引擎,支持事务,行锁设计,外键网络

t1.frm (frame) t1.ibd (innodb data); 存入硬盘数据结构

 

myisamt2.MYD (myisam data) t2.MYI (myisam index) t2.frm (frame); 存入硬盘数据库设计

 

blackhole: t3.frmide

 

memory: t4.frm; 存入内存,关闭服务端后,数据清空

 

  1. 简述数据三大范式?

第一范式(1NF):确保每一列的原子性(若是每一列都是不可再分的最小数据单元,则知足第一范式。)

第二范式:非键字段必须依赖于键字段(第二范式要求每一个表只描述一件事。)

第三范式:在1NF基础上,除了主键之外的其它列都不传递依赖于主键列,或者说: 任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)

 

  1. 什么是事务?MySQL如何支持事务?

什么是事务开启一个事务能够包含一些sql语句,这些sql语句要么同时成功;要么一个都别想成功,称之为事务的原子性

 

事务的做用:转帐等,屏蔽因网络传输部分失效而带来的影响

 

BEGIN START TRANSACTION:显式地开启一个事务

COMMIT:也可使用COMMIT WORK,不过两者是等价的。COMMIT会提交事务,并使已对数据库进行的全部修改为为永久性的

ROLLBACK:也可使用ROLLBACK WORK,不过两者是等价的。回滚会结束用户的事务,并撤销正在进行的全部未提交的修改

SAVEPOINT identifierSAVEPOINT容许在事务中建立一个保存点,一个事务中能够有多个SAVEPOINT

RELEASE SAVEPOINT identifier:删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常

ROLLBACK TO identifier:把事务回滚到标记点

SET TRANSACTION:用来设置事务的隔离级别。InnoDB存储引擎提供事务的隔离级别有READ UNCOMMITTEDREAD COMMITTEDREPEATABLE READSERIALIZABLE

 

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 ;

 

  1. 简述数据库设计中一对多和多对多的应用场景?

a      左表与右表之间是否有多对一的关系 (多个员工属于一个部门)

b      右表与左表之间是否有多对一的关系 (多个部门拥有一个员工)

 

ia True & b False  多对一

iia False & b True  多对一

iiia True & b True  多对多

iva False & b False  一对一

 

  1. 如何基于数据库实现商城商品计数器?

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(汇集索引):叶子节点存放的一整条数据,

 

uniqueindex key(辅助索引):叶子节点存放的是:{名字:名字所在那条记录的主键的值};覆盖索引,回表操做

 

09. 索引在什么状况下遵循最左前缀的规则?

mysql中对a or b or c。。的形式,会从左至右依次查询

 

10. 主键和外键的区别?

primary key就等同于not null unique(约束);加速查询;innodb 用主键(一种索引)字段为依据组织数据,造成一种树型结构,从而加速查询

 

key(索引)为mysql中一种特殊的数据结构

aunique 约束条件,加速查询

bprimary key 约束条件,加速查询,innodb组织数据结构的依据

cindex key 加速查询

dforeign 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)对于多列索引,不是使用的第一部分(第一个),则不会使用索引

3like查询是以%开头

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. 数据库优化方案?

https://mp.weixin.qq.com/s?__biz=MzIxMjg4NDU1NA==&mid=2247483684&idx=1&sn=f5abc60e696b2063e43cd9ccb40df101&chksm=97be0c01a0c98517029ff9aa280b398ab5c81fa1fcfe0e746222a3bfe75396d9eea1e249af38&mpshare=1&scene=1&srcid=0606XGHeBS4RBZloVv786wBY#rd

 

16. charvarchar的区别?

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越高,优先级越高,越容易执行。

 

selecttypesimpleprimarysubqueryderived(衍生)unionunionresult

 

simple表示查询中不包含子查询或者union

 

当查询中包含任何复杂的子部分,最外层的查询被标记成primary

 

selectwhere列表中包含了子查询,则子查询被标记成subquery

 

from的列表中包含的子查询被标记成derived

 

若第二个select出如今union后,则被标记成union,若unionfrom子句的子查询中,外层的select被标记成derived

 

union表获取结果的select被标记成union result

 

type叫访问类型,表示在表中找到所需行的方式,常见类型有

 

allindexrangerefeq_refconstsystemNULL 性能从左至右由差至好。

 

ALL,即full table scanmysql将遍历全表来找到所须要的行。

 

indexfull index scan,只遍历索引树。

 

range表示索引范围扫描 ,对索引的扫描开始于一点,返回匹配的值域的行,常见于between<>的查询。

 

ref为非惟一性索引扫描,返回匹配某个单独值的全部行,常见于非惟一索引即惟一索引的非惟一前缀进行的查找。

 

constsystem表示当对查询部分进行优化,并转化成一个常量时,使用这些类型访问。好比将主键置于where列表中,mysql就能把该查询置成一个常量。systemconst的一个特例,当查询表中只有一行的状况下使用的是system

 

NULL表示在执行语句中,不用查表或索引。

 

possiblekey表示能使用哪一个索引在表中找到行,查询涉及到的字段上若存在索引,则该索引被列出,但不必定被查询使用。

 

18. 在对name作了惟一索引前提下,简述如下区别:

       select * from tb where name = ‘Oldboy’ 

       select * from tb where name = ‘Oldboy’ limit 1

limit 1显示一条

相关文章
相关标签/搜索