MYSQL数据库的知识点

1. SQL的select语句完整的执行顺序

  1. from 子句组装来自不同数据源的数据
  2. where 子句基于指定的条件对记录进行筛选
  3. group by 子句基于指定的条件对记录进行筛选
  4. 使用聚集函数进行计算
  5. 使用having子句筛选分组
  6. 计算所有的表达式
  7. select 的字段
  8. 使用order by 对结果集进行排序

SQL语言不同于其他编程语言的最明显特征是处理代码的顺序。在大多数据库语言中,代码按编码顺序被处理。但在SQL语句中,第一个被处理的子句式FROM,而不是第一出线的SELECT。

2. 说一下MySQL数据库存储的原理?

存储过程是一个可编程的函数,它在数据库中创建并保存。它可以有SQL语句和一下特殊的控制结构组成。当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能是,存储过程是非常有用的。数据库中的存储过程可以看做是对编程中面向对象方法的模拟。他允许控制数据的访问方式。存储过程通常有一下优点:

  1. 存储过程能实现较快的执行速度。
  2. 存储过程允许标准组件是编程。
  3. 存储过程可以用来流程控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。
  4. 存储过程可被作为一种安全机制来充分利用。
  5. 存储过程能够减少网络流量。

3. 事物的特性

  1. 原子性:事务中的全部操作在数据库中是不可分割的,要么全部完成,要么均不执行。
  2. 一致性:几个并行执行的事务,其执行结果必须与按某一顺序串执行的结果相一致。
  3. 隔离性:事物的执行不受其它事务的干扰,事务执行的中间结果对其他事务必须是透明的。
  4. 持久性:对于任意已提交事务,系统必须保证该事物对数据库的改变不被丢失,即使数据库出现故障。

4. 数据库索引

数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询,更新数据库表中数据。索引的实现通常使用B_TREE。B_TREE索引加速了数据访问,因为存户引擎不会再去扫描整张表得到需要的数据;相反,他从根节点开始,根节点保存了子节点的指针,存储引擎会根据指针快速寻找数据。

5. 数据库怎么优化查询效率?

  1. 存储引擎选择:如果数据表需要事务处理,应该考虑使用InnoDB,因为它完全符合ACID特性。如果不需要事务处理,使用默认存储引擎MyISAM是比较明智的。
  2. 分表分库,主从。
  3. 对查询进行优化,要尽量避免全表扫描,首先考虑在where及order by涉及的列上建立索引。
  4. 应尽量避免在where子句中使用 != 或 <>操作符,否则将引擎放弃使用索引而进行全表扫描。
  5. 应尽量避免在where子句中使用or来连接条件,如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全表扫描。
  6. 应尽量避免在where子句中对字段进行null值判断,否则将导致引擎放弃使用索引而进行全表扫描。
  7. Update语句,如果只更改1,2个字段,不要Update全部字段,否则频繁调用会引起明显的性能消耗,同时带来大量日志。
  8. 对于多张大数据量的表JOIN,要先分页在JOIN,否则逻辑读会很高,性能很差。

6. 你用的MySQL是那个引擎,各引擎之间有什么区别?

主要MyISAM与InnoDB两个引擎,其主要区别如下:
InnoDB支持事务,MyISAM不支持,这一点是非常之重要。事务是一种高级的处理方式,如在一些列增删改中只要那个出错还可以回滚还原,而MyISAM就不可以了。
MyISAM 适合查询以及插入为主的应用,InnoDB适合频繁修改以及涉及到安全性较高的应用;
InnoDB 支持外键,MyISAM不支持。
MYISAM 是默认引擎,InnoDB需要指定;
InnoDB不支持FULLTEXT类型的索引;
InnoDB 中不保存表的行数,如select count() from table时,InnoDB需要扫描 一遍整个表来计算有多少行,但是MYISAM只要简单的读出保存好的行数即可。注意的是,当count()语句包含where 条件时MyISAM也需要扫描整个表;
对于自增长的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中可以和其他字段一起建立联合索引,清空整个表时,InnoDB是一行一行的删除。效率非常的慢。MyISAM则会重建表;
InnoDB 支持行锁

7. 数据库的优化?

  1. 优化索引,SQL语句,分析慢查询;
  2. 设计表的时候严格根据数据库的设计范式来设计数据库;
  3. 使用换粗,把京城访问到的数据而且不需要经常变化的数据放在缓存中,能节约磁盘IO
  4. 优化硬件;采用SSD,使用磁盘队列技术等。
  5. 采用MySQL内部自带的表分区技术,把数据分层不同的文件,能够提高磁盘的读取效率。
  6. 垂直分表,把一些不经常读的数据放在一张表中,节约磁盘IO
  7. 主从分离读写,采用主从辅助把数据库的读操作和写入操作分离开来
  8. 分库分表分机器(数据量特别大),主要的原理就是数据路由
  9. 选择合适的表引擎,参数上的优化。
  10. 架构级别的缓存,静态化和分布式。
  11. 不采用全文索引。
  12. 采用更快的存储方式。

8. MySQL数据库如何分区分表?

分表可以通过三种方式:MySQL集群,自定义规则和merge存储引擎。
分区有四类:
RANGE分区:基于属于一个给定连续区间的列值,把多行分配给分区。
LIST分区:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。
HASH分区:基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列只进行计算。这个函数可以包含MySQL中有效的,产生非负整数值的任何表达式。
KEY分区:类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,切MySQL服务器提供其自身的哈希函数。必须有一列或多列包含整数值。

9. 如何对查询命令进行优化?

  1. 应尽量避免全表扫描,首先考虑在where及order by涉及的列上建立索引。
  2. 应尽量避免在where子句中对字段进行null值判断,避免使用!=或<>操作符,避免使用or连接条件,或在where子句中使用参数,对字段进行表达式或函数操作,否则会导致全表扫描。
  3. 不要在where子句中的"="左边进行函数,算术运算或其他表达式运算,否则系统将可能无法正确使用索引。
  4. 使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用。
  5. 很多时候可考虑exists代替in。
  6. 尽量使用数字型字段。
  7. 尽可能的使用 varchar/nvarchar代替char/nchar
  8. 任何地方都不要使用select from t,用具体的字段列表代替" ",不要返回用不到的任何字段。
  9. 尽量使用表变量来代替临时表。
  10. 避免频繁创建和删除临时表,以减少系统表资源的消耗。
  11. 尽量避免使用游标,因为游标的效率较差。
  12. 尽量避免向客户端返回大数据量,若数据量过大,应考虑相应需求是否合理。

10.NoSQL和关系数据库的区别?

  1. SQL数据存在特定的结构的表中;而NoSQL则更加灵活和可扩展,存储方式可以省是JSON文档,哈希表或者其他方式。
  2. 在SQL中,必须定义好表和字段结构后才能添加数据,表结构可以在被定义之后更新,但是如果有比较大的结构变更的话就会变得比较复杂。在NoSQL中,数据可以在任何时候任何地方添加,不需要先定义表。
  3. SQl中如果需要增加外部关联数据的话,规范化做法实在原表中增加一个外键,关联外部数据表。而在NoSQL中除了这种规范化的外部数据表做法以外,我们还能用如下的非规范化方式把外部数据直接放到原数据集中,以提高查询效率。缺点也比较明显,更新审核人数据的时候将会比较麻烦。
  4. SQL中可以使用JOIN表链接方式将多个关系数据表中的数据用一条简单的查询语句查询出来。NoSQL暂未提供似JOIN的查询方式对多个数据集中的数据做查询。索引大部分NoSQL使用非规范化的数据存储范式存储数据。
  5. SQL中不允许删除已经被使用的外部数据,而NoSQL中则没有这种强耦合的概念,可以随时删除任何数据。
  6. SQL中如果多张数据需要同批次被更新,即如果其中一张表更新失败的话其他表也不能更新成功。这种场景可以通过事务来控制,可以在所有命令完成后在同一提交事务。而NoSQL中没有食物这个概念,每一个数据集的操作都是原子级的。
  7. 在相同水平的系统设计的前提下,因为NoSQL中省略了JOIN查询的消耗,故理论上性能上是优于SQL的。

11. SQL语句怎么看效率

  1. 新建一个查询
  2. 输入select * from Person.Contact执行
  3. Ctrl+L

12. 数据库负载均衡

负载均衡集群是一组相互独立的计算机系统构成,通过常规网络或专用网络进行连接,有路由器衔接在一起,各节点相互协作,共同负载,均衡压力,对客户端来说,整个群集可以视为一台具有超高性能的独立服务器。
1. 实现原理
实现数据库的负载均衡技术,首先要有一个可以控制连接数据库控制端。在这里,他截断了数据库和程序的直接连接,有所有的程序来访问这个中间层,然后再由中间层来访问数据。这样,我们就可以具体控制访问某个数据库了,然后还可以根据数据库的当前负载采取有效的均衡策略,来调整每次连接到那个数据库。
2. 实现多个数据库数据同步
对于负载均衡,最重要的就是所有服务器的数据都是实时同步的。这是一个集群所必需的,因为如果数据不实时同步,那么用户从一台服务器读出的数据,就有别人从另一台服务器读出的数据,这是不能允许的。所以必须实现数据的数据同步。这样,在查询的时候就可以有多个资源,实现均衡。
3. 优缺点
优点:

  1. 扩展性强:当系统要更高数据库处理速度是,只要简单的增加数据库服务器就可以得到扩展。
  2. 可维护性:当某个节点发生故障时,系统会自动检测故障并转移故障节点的应用,保证数据库的持续工作。
  3. 安全性:因为数据会同步到多台服务器上,可以实现数据集的冗余,通过多份数据来保证安全性。另外他成功的将数据库放到了内网之中,更好地保护了数据库的安全性。
  4. 易用性:对应用来说完全透明,集群暴露出来的就是一个IP。

缺点:

  1. 不能够按照Web服务器的处理能力分配负载。
  2. 负载均衡器(控制端)故障,会导致整个数据库系统瘫痪。

13. 数据库的设计

第一范式:数据库表的每一列都是不可分割的原子数据项,即列不可拆分。/ 每个列都不可以在拆分
第二范式:建立在第一范式的基础上,要求数据库表中的每个实例或记录必须是可以唯一被区分的,即唯一标识。/ 非主键列完全依赖于主键,而不能依赖于主键的一部分
第三范式:建立在第二范式的基础上, 任何非主属性不依赖其他非主属性,即引用主键。/ 非主键只能依赖于主键,不依赖于其他主键

14. 存储过程和函数的区别?

相同点:存储过程和函数都是为了可重复的执行操作数据库的SQL语句的集合。

  1. 存储过程和函数都是一次编译,就会被缓存起来,下次使用就直接命中已经编译好的SQL语句,不需要重复使用。减少网络交互,减少网络访问流量。

不同点:标识符不同,函数的标识符是function,存储过程是proceduce.

  1. 函数中有返回值,切必须有返回值,而过程没有返回值,但是可以通过设置参数类型(in,out)来实现多个参数或者返回值。
  2. 存储函数使用select 调用,存储过程需要使用call调用。
  3. select 语句可以在存储过程中调用,但是除了select…into之外的select语句都不能在函数中使用。
  4. 通过in out 参数,过程相关函数更加灵活,可以返回过个结果。

15.MySQL日志

错误日志:记录启动,运行或者停止mysql时出现的问题;
通用入职:记录建立的客户端连接和执行的语句;
二进制:记录所有更改数据的语句;
慢查询:记录所有执行时间超过long_query_time秒的查询或者不使用索引的查询,通过使用–slow_query_log[={0|1}]选项来启用慢查询日志,所有执行时间超过long_query_time的语句都会被记录。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值