MYSQL理论知识汇总

01. 列举常见的关系型数据库和非关系型都有那些?
        1.关系型数据库经过外键关联来创建表与表之间的关系,---------常见的有:SQLite、Oracle、mysql
        2.非关系型数据库一般指数据以对象的形式存储在数据库中,而对象之间的关系经过每一个对象自身的属性来决定  ---常见的有:MongoDb、redis
        
02. MySQL常见数据库引擎及比较?
        · MyISAM:默认的MySQL插件式存储引擎,它是在Web、数据仓储和其余应用环境下最常使用的存储引擎之一。

        · InnoDB:用于事务处理应用程序,具备众多特性,包括ACID事务支持。(提供行级锁)

        · BDB:可替代InnoDB的事务引擎,支持COMMIT、ROLLBACK和其余事务特性。

        · Memory:将全部数据保存在RAM中,在须要快速查找引用和其余相似数据的环境下,可提供极快的访问。

        · Merge:容许MySQL DBA或开发人员将一系列等同的MyISAM表以逻辑方式组合在一块儿,并做为1个对象引用它们。对于诸如数据仓储等VLDB环境十分适合。

        · Archive:为大量不多引用的历史、归档、或安全审计信息的存储和检索提供了完美的解决方案。

        · Federated:可以将多个分离的MySQL服务器连接起来,从多个物理服务器建立一个逻辑数据库。十分适合于分布式环境或数据集市环境。

        · Cluster/NDB:MySQL的簇式数据库引擎,尤为适合于具备高性能查找要求的应用程序,这类查找需求还要求具备最高的正常工做时间和可用性。

        · Other:其余存储引擎包括CSV(引用由逗号隔开的用做数据库表的文件),Blackhole(用于临时禁止对数据库的应用程序输入),以及Example引擎(可为快速建立定制的插件式存储引擎提供帮助)。

        通常来讲不使用事务的话,请使用MyISAM引擎,使用事务的话,通常使用InnoDB ------仙子啊学习如今咱们用的主要是InnoDB
        注意,经过更改STORAGE_ENGINE配置变量,可以方便地更改MySQL服务器的默认存储引擎。
        
03. 简述数据三大范式?
        什么是范式:简言之就是,数据库设计对数据的存储性能,还有开发人员对数据的操做都有莫大的关系。因此创建科学的,规范的的数据库是须要知足一些
        规范的来优化数据数据存储方式。在关系型数据库中这些规范就能够称为范式。
        什么是三大范式:
        第一范式:当关系模式R的全部属性都不能在分解为更基本的数据单位时,称R是知足第一范式的,简记为1NF。知足第一范式是关系模式规范化的最低要

                    求,不然,将有不少基本操做在这样的关系模式中实现不了。
        第二范式:若是关系模式R知足第一范式,而且R得全部非主属性都彻底依赖于R的每个候选关键属性,称R知足第二范式,简记为2NF。
        第三范式:设R是一个知足第一范式条件的关系模式,X是R的任意属性集,若是X非传递依赖于R的任意一个候选关键字,称R知足第三范式,简记为3NF.
        注:关系实质上是一张二维表,其中每一行是一个元组,每一列是一个属性
        
04. 什么是事务?MySQL如何支持事务?
        事务就是一段sql 语句的批处理,可是这个批处理是一个原子 ,不可分割,要么都执行,要么回滚(rollback)都不执行。
        事务具体四大特性,也就是常常说的ACID :1.原子性(全部操做要么所有成功,要么所有失败回滚)
                                               2.一致性(事务执行以前和执行以后都必须处于一致性状态。)
                                               3.隔离性(数据库为每个用户开启的事务,不能被其余事务的操做所干扰,多个并发事务之间要相互隔离)
                                               4.持久性(一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便遭遇故障依然可以经过日志恢复最后一次更新)
        在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务            
        MYSQL 事务处理主要有两种方法:
                1、用 BEGIN, ROLLBACK, COMMIT来实现
                        BEGIN 开始一个事务
                        ROLLBACK 事务回滚
                        COMMIT 事务确认
                2、直接用 SET 来改变 MySQL 的自动提交模式:
                        SET AUTOCOMMIT=0 禁止自动提交
                        SET AUTOCOMMIT=1 开启自动提交
                    
05. 简述数据库设计中一对多和多对多的应用场景?
        一对多:学生与班级---一个学生只能属于一个班级,一个班级能够有多个学生
        多对多:学生与课程---一个学生能够选择多个课程,一个课程也能够被多个学生选择
        
06. 如何基于数据库实现商城商品计数器?
        建立一个商城表---包含(id,商品名,每个商品对应数量)
        create table product(id primary key auto_increment,
                             pname varchar(64),
                             pcount int);
                             
07. 简述触发器、函数、视图、存储过程?
        触发器:触发器是一个特殊的存储过程,它是MySQL在insert、update、delete的时候自动执行的代码块。
                create trigger trigger_name
                after/before insert /update/delete on 表名
                for each row
                begin
                sql语句:(触发的语句一句或多句)
                end
        函数:MySQL中提供了许多内置函数,还能够自定义函数(实现程序员须要sql逻辑处理)
                自定义函数建立语法:
                        建立:CREATE FUNCTION 函数名称(参数列表)
                            RETURNS 返回值类型
                            函数体
                        修改: ALTER FUNCTION 函数名称 [characteristic ...]
                        删除:DROP FUNCTION [IF EXISTS] 函数名称
                        调用:SELECT 函数名称(参数列表)
                        
        视图:视图是由查询结果造成的一张虚拟表,是表经过某种运算获得的一个投影
                create view view_name as select 语句
        存储过程:把一段代码封装起来,当要执行这一段代码的时候,能够经过调用该存储过程来实现(通过第一次编译后再次调用不须要再次编译,比一个个执行sql语句效率高)
                create procedure 存储过程名(参数,参数,…)
                        begin
                            //代码
                        end
                        
08. MySQL索引种类
    索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),更通俗的说,数据库索引比如是一本书前面的目录,能加快数据库的查询速度
    MySQL索引的类型:
                1. 普通索引:这是最基本的索引,它没有任何限制
                2.惟一索引:索引列的值必须惟一,但容许有空值,若是是组合索引,则列值的组合必须惟一
                3.全文索引:全文索引仅可用于 MyISAM 表,能够从CHAR、VARCHAR或TEXT列中做为CREATE TABLE语句的一部分被建立,或是随后使用ALTER TABLE 或CREATE INDEX被添加
                        (切记对于大容量的数据表,生成全文索引是一个很是消耗时间很是消耗硬盘空间的作法)
                4. 单列索引、多列索引:多个单列索引与单个多列索引的查询效果不一样,由于执行查询时,MySQL只能使用一个索引,会从多个索引中选择一个限制最为严格的索引。
                5.组合索引(最左前缀):简单的理解就是只从最左面的开始组合(实在单列索引的基础上进一步压榨索引效率的一种方式)
                
09. 索引在什么状况下遵循最左前缀的规则?
    
10. 主键和外键的区别?
    1.主键是能肯定一条记录的惟一标识
    2.外键用于与另外一张表的关联,是能肯定另外一张表记录的字段,用于保持数据的一致性
    
11. MySQL常见的函数?
    聚合函数:  AVG(col)返回指定列的平均值
                COUNT(col)返回指定列中非NULL值的个数
                MIN(col)返回指定列的最小值
                MAX(col)返回指定列的最大值
                SUM(col)返回指定列的全部值之和
                GROUP_CONCAT(col) 返回由属于一组的列值链接组合而成的结果
    数学函数:  ABS(x)   返回x的绝对值
                BIN(x)   返回x的二进制(OCT返回八进制,HEX返回十六进制)
    
    
12. 列举 建立索引可是没法命中索引的8种状况。
    1.若是条件中有or,即便其中有条件带索引也不会使用(这也是为何尽可能少用or的缘由)
    2.对于多列索引,不是使用的第一部分,则不会使用索引
    3.like查询是以%开头
    4.若是列类型是字符串,那必定要在条件中将数据使用引号引用起来,不然不使用索引
    5.若是mysql估计使用全表扫描要比使用索引快,则不使用索引
    6 对小表查询 
    7 提示不使用索引
    8 统计数据不真实 
    9.单独引用复合索引里非第一位置的索引列. 

13. 如何开启慢日志查询?
    1 执行 SHOW VARIABLES LIKE “%slow%”,获知 mysql 是否开启慢查询
            slow_query_log 慢查询开启状态  OFF 未开启 ON 为开启
            slow_query_log_file 慢查询日志存放的位置(这个目录须要MySQL的运行账号的可写权限,通常设置为MySQL的数据存放目录)
    2 修改配置文件( 放在[mysqld]下),重启
            long_query_time 查询超过多少秒才记录
    3 测试是否成功
    4 慢查询日志文件的信息格式
    
14. 数据库导入导出命令(结构+数据)?
    1.导出整个数据库 
  mysqldump -u用户名 -p密码  数据库名 > 导出的文件名 
   例如:C:\Users\jack> mysqldump -uroot -pmysql sva_rec  > e:\sva_rec.sql 
  2.导出一个表,包括表结构和数据 
  mysqldump -u用户名 -p 密码  数据库名 表名> 导出的文件名 
  例如:C:\Users\jack> mysqldump -uroot -pmysql sva_rec date_rec_drv> e:\date_rec_drv.sql 
  3.导出一个数据库结构 
  例如:C:\Users\jack> mysqldump -uroot -pmysql -d sva_rec > e:\sva_rec.sql 
     4.导出一个表,只有表结构 
  mysqldump -u用户名 -p 密码 -d数据库名  表名> 导出的文件名 
  例如:C:\Users\jack> mysqldump -uroot -pmysql -d sva_rec date_rec_drv> e:\date_rec_drv.sql 
  5.导入数据库 
  经常使用source 命令 
  进入mysql数据库控制台, 
  如mysql -u root -p 
  mysql>use 数据库 
  而后使用source命令,后面参数为脚本文件(如这里用到的.sql) 
  mysql>source d:wcnc_db.sql
    
15. 数据库优化方案?
    整体思路从如下几个方面:1、选取最适用的字段属性
                            二、使用链接(JOIN)来代替子查询(Sub-Queries)
                            3、使用联合(UNION)来代替手动建立的临时表
                            4、事务(当多个用户同时使用相同的数据源时,它能够利用锁定数据库的方法来为用户提供一种安全的访问方式,这样能够保证用户的操做不被其它的用户所干扰)
                            5.锁定表(有些状况下咱们能够经过锁定表的方法来得到更好的性能)
                            6、使用外键(锁定表的方法能够维护数据的完整性,可是它却不能保证数据的关联性。这个时候咱们就可使用外键)
                            7、使用索引
                            8、优化的查询语句(绝大多数状况下,使用索引能够提升查询的速度,但若是SQL语句使用不恰当的话,索引将没法发挥它应有的做用)
16. char和varchar的区别?
    char:定长,char的存取数度相对快
    varchar:不定长,存取速度相对慢
    到底如何取舍能够根据一下几个方面考虑:
               1、对于MyISAM表,尽可能使用Char,对于那些常常须要修改而容易造成碎片的myisam和isam数据表就更是如此,它的缺点就是占用磁盘空间;
               2、对于InnoDB表,由于它的数据行内部存储格式对固定长度的数据行和可变长度的数据行不加区分(全部数据行共用一个表头部分,这个标头部分存放着指向各有关数据列的指针),
                  因此使用char类型不见得会比使用varchar类型好。事实上,由于char类型一般要比varchar类型占用更多的空间,因此从减小空间占用量和减小磁盘i/o的角度,使用varchar类型反而更有利;
               三、存储很短的信息,好比门牌号码101,201……这样很短的信息应该用char,由于varchar还要占个byte用于存储信息长度,原本打算节约存储的如今得不偿失。
               4、固定长度的。好比使用uuid做为主键,那用char应该更合适。由于他固定长度,varchar动态根据长度的特性就消失了,并且还要占个长度信息。
               5、十分频繁改变的column。由于varchar每次存储都要有额外的计算,获得长度等工做,若是一个很是频繁改变的,那就要有不少的精力用于计算,而这些对于char来讲是不须要的。

17. 简述MySQL的执行计划?
    执行计划explain命令是查看查询优化器如何决定执行查询的主要方法。
    这个功能有局限性,并不总会说出真相,但它的输出是能够获取的最好信息,经过输出结果反推执行过程
18. 在对name作了惟一索引前提下,简述如下区别:
        select * from tb where name = ‘Oldboy’  -------------查找到tb表中全部name = ‘Oldboy’的数据
        select * from tb where name = ‘Oldboy’ limit 1------查找到tb表中全部name = ‘Oldboy’的数据只取其中的第一条
相关文章
相关标签/搜索