• mysql复习


    MySQL理论系列

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

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

    典型代表:MySQLOracleDB2SQL server(银行业常用)

     

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

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

     

    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.frm

     

    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显示一条

  • 相关阅读:
    [.net 面向对象程序设计深入](2)UML——在Visual Studio 2013/2015中设计UML用例图
    [.net 面向对象程序设计深入](1)UML——在Visual Studio 2013/2015中设计UML类图
    [.net 面向对象程序设计进阶] (28) 结束语——告别2015
    [.net 面向对象程序设计进阶] (27) 团队开发利器(六)分布式版本控制系统Git——在Visual Studio 2015中使用Git
    [.net 面向对象程序设计进阶] (26) 团队开发利器(五)分布式版本控制系统Git——图形化Git客户端工具TortoiseGit
    [.net 面向对象程序设计进阶] (25) 团队开发利器(四)分布式版本控制系统Git——使用GitStack+TortoiseGit 图形界面搭建Git环境
    [.net 面向对象程序设计进阶] (24) 团队开发利器(三)使用SVN多分支并行开发(下)
    [.net 面向对象程序设计进阶] (23) 团队开发利器(二)优秀的版本控制工具SVN(上)
    [.net 面向对象程序设计进阶] (22) 团队开发利器(一)简单易用的代码管理工具VSS
    [.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦
  • 原文地址:https://www.cnblogs.com/yangli0504/p/9164121.html
Copyright © 2020-2023  润新知