MySQL、NoSQL、Mongdb、Redis数据库整理20问

MySQL

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

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

4.数据库索引

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

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

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

6.Mysql 集群的优缺点

优点:
 99.999%的高可用性
 快速的自动失效切换
 灵活的分布式体系结构,没有单点故障
 高吞吐量和低延迟
 可扩展性强,支持在线扩容
缺点:
 存在很多限制,比如:不支持外键
 部署、管理、配置很复杂
 占用磁盘空间大、内存大
 备份和恢复不方便
 重启的时候,数据节点将数据 load 到内存需要很长的时间

7.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 支持行锁(某些情况下还是锁整表,如 update table set a=1 where user like '%lee%

8.Mysql 数据库如何分区分表

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

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

a. 应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索。
b. 应尽量避免在 where 子句中对字段进行 null 值判断,避免使用!=或<>操作符,避免使用 or
连接条件,或在 where 子句中使用参数、对字段进行表达式或函数操作,否则会导致权标扫描
c. 不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无
法正确使用索引。
d. 使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为
条件时才能保证系统使用该索引,否则该索引将不会被使用。
e. 很多时候可考虑用 exists 代替 in。
f. 尽量使用数字型字段。
g. 尽可能的使用 varchar/nvarchar 代替 char/nchar。

10.Sql 注入是如何产生的,如何防止

程序开发过程中不注意规范书写 sql 语句和对特殊字符进行过滤,导致客户端可以通过全局变量POST 和 GET 提交一些 sql 语句正常执行。产生 Sql 注入。下面是防止办法:
a. 过滤掉一些常见的数据库操作关键字,或者通过系统函数来进行过滤。
b. 在 PHP 配置文件中将 Register_globals=off;设置为关闭状态
c. SQL 语句书写的时候尽量不要省略小引号(tab 键上面那个)和单引号
d. 提高数据库命名技巧,对于一些重要的字段根据程序的特点命名,取不易被猜到的
e. 对于常用的方法加以封装,避免直接暴漏 SQL 语句
f. 开启 PHP 安全模式:Safe_mode=on;
g. 打开 magic_quotes_gpc 来防止 SQL 注入
h. 控制错误信息:关闭错误提示信息,将错误信息写到系统日志。
i. 使用 mysqli 或 pdo 预处理。

11.NoSQL 和关系数据库的区别

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

12.存储过程和函数的区别

相同点:存储过程和函数都是为了可重复的执行操作数据库的 sql 语句的集合。
1)存储过程和函数都是一次编译,就会被缓存起来,下次使用就直接命中已经编译好的 sql 语句,
不需要重复使用。减少网络交互,减少网络访问流量。
不同点:标识符不同,函数的标识符是 function,存储过程是 proceduce。
1)函数中有返回值,且必须有返回值,而过程没有返回值,但是可以通过设置参数类型(in,out)
来实现多个参数或者返回值。
2)存储函数使用 select 调用,存储过程需要使用 call 调用。
3)select 语句可以在存储过程中调用,但是除了 select..into 之外的 select 语句都不能在函数中使
用。
4)通过 in out 参数,过程相关函数更加灵活,可以返回多个结果

13.Mysql 日志

错误日志:记录启动,运行或者停止 mysql 时出现的问题;
通用日志:记录建立的客户端连接和执行的语句;
二进制日志:记录所有更改数据的语句;

Mongdb

1.Mongo 数据库的一些基本操作命令

a) create database name; 创建数据库
b) use databasename; 选择数据库
c) drop database name 直接删除数据库,不提醒
d) show tables; 显示表
e) describe tablename; 表的详细描述
f) select 中加上 distinct 去除重复字段
g) mysqladmin drop databasename 删除数据库前,有提示。
h) 显示当前 mysql 版本和当前日期
i) select version(),current_date;

2.MongoDB的定义和优缺点

MongoDB 是一个面向文档的数据库系统。使用 C++编写,不支持 SQL,但有自己功能强大
的查询语法。
MongoDB 使用 BSON 作为数据存储和传输的格式。BSON 是一种类似 JSON 的二进制序列
化文档,支持嵌套对象和数组。
MongoDB 很像 MySQL,document 对应 MySQL 的 row,collection 对应 MySQL 的 table
应用场景:
a) 网站数据:mongo 非常适合实时的插入,更新与查询,并具备网站实时数据存储所需
的复制及高度伸缩性。
b) 缓存:由于性能很高,mongo 也适合作为信息基础设施的缓存层。在系统重启之后,
由 mongo 搭建的持久化缓存可以避免下层的数据源过载。
c) 大尺寸、低价值的数据:使用传统的关系数据库存储一些数据时可能会比较贵,在此
之前,很多程序员往往会选择传统的文件进行存储。
d) 高伸缩性的场景:mongo 非常适合由数十或者数百台服务器组成的数据库。
e) 用于对象及 JSON 数据的存储:mongo 的 BSON 数据格式非常适合文档格式化的存
储及查询。
f) 重要数据:mysql,一般数据:mongodb,临时数据:memcache
g) 对于关系数据表而言,mongodb 是提供了一个更快速的视图 view;而对于 PHP 程
序而言,mongodb 可以作为一个持久化的数组来使用,并且这个持久化的数组还可
以支持排序、条件、限制等功能
h) 将 mongodb 代替 mysql 的部分功能,主要一个思考点就是:把 mongodb 当作 mysql
的一个 view(视图),view 是将表数据整合成业务数据的关键。比如说对原始数据进
行报表,那么就要先把原始数据统计后生成 view,在对 view 进行查询和报表。
不适合的场景:
a) 高度事物性的系统:例如银行或会计系统。传统的关系型数据库目前还是更适用于需
要大量原子性复杂事务的应用程序。
b) 传统的商业智能应用:针对特定问题的 BI 数据库会对产生高度优化的查询方式。对于
此类应用,数据仓库可能是更合适的选择。
c) 需要 SQL 的问题
d) 重要数据,关系数据
优点: 1)弱一致性(最终一致),更能保证用户的访问速度
2)文档结构的存储方式,能够更便捷的获取数
3)内置 GridFS,高效存储二进制大对象 (比如照片和视频)
4)支持复制集、主备、互为主备、自动分片等特性
5)动态查询
6)全索引支持,扩展到内部对象和内嵌数组
缺点: 1)不支持事务
2)MongoDB 占用空间过大,维护工具不够成熟

3.MongoDB 成为优秀的 NoSQL 数据库的原因是什么

1)面向文件的
2)高性能
3)高可用性
4)易扩展性
5)丰富的查询语言

4.分析器在 MongoDB 中的作用是什么

MongoDB 中包括了一个可以显示数据库中每个操作性能特点的数据库分析器。通过这个分析器
你可以找到比预期慢的查询(或写操作);利用这一信息,比如,可以确定是否需要添加索引

5.MySQL 与 MongoDB 本质之间最基本的差别是什么

差别在多方面,例如:数据的表示、查询、关系、事务、模式的设计和定义、速度和性能

Redis

1.怎样解决数据库高并发的问题

解决数据库问题的常见方案:
1.分表分库
2.数据库索引
3.Redis缓存数据库
4.读写分离
5.构建负载均衡集群:将大量的并发请求分担到多个处理节点,由于单个处理节点的故障不影响整个服务,负载均衡集群同时也实现了高可用性

2.Redis集群的实现

https://blog.csdn.net/yfkiss/article/details/38944179

3.Redis数据库的用哪几种数据结构存放数据

String(字符串),Hash(哈希),List(列表),Set(集合)及 zset(sortedset:有序集合。

4.Redis 的并发竞争问题怎么解决

方案一:可以使用独占锁的方式,类似操作系统的 mutex 机制,不过实现相对复杂,成本较高
https://blog.csdn.net/black_ox/article/details/48972085
方案二:使用乐观锁的方式进行解决(成本较低,非阻塞,性能较高)
如何用乐观锁方式进行解决?本质上是假设不会进行冲突,使用 redis 的命令 watch 进行构造条件

5.Redis 和MongoDB 优缺点

MongoDB 和 Redis 都是 NoSQL,采用结构型数据存储。二者在使用场景中,存在一定的区别,
这也主要由于二者在内存映射的处理过程,持久化的处理方法不同。MongoDB 建议集群部署,更多
的考虑到集群方案,Redis 更偏重于进程顺序写入,虽然支持集群,也仅限于主-从模式。
Redis 优点:
a) 读写性能优异
b) 支持数据持久化,支持 AOF 和 RDB 两种持久化方式
c)支持主从复制,主机会自动将数据同步到从机,可以进行读写分离。
d) 数据结构丰富:除了支持 string 类型的 value 外还支持 string、hash、set、sortedset、
list 等数据结构。
缺点:
e) Redis 不具备自动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败,需要
等待机器重启或者手动切换前端的 IP 才能恢复。
f) 主机宕机,宕机前有部分数据未能及时同步到从机,切换 IP 后还会引入数据不一致的问题,
降低了系统的可用性。
g) Redis 的主从复制采用全量复制,复制过程中主机会 fork 出一个子进程对内存做一份快照,
并将子进程的内存快照保存为文件发送给从机,这一过程需要确保主机有足够多的空余内
存。若快照文件较大,对集群的服务能力会产生较大的影响,而且复制过程是在从机新加入
集群或者从机和主机网络断开重连时都会进行,也就是网络波动都会造成主机和从机间的一
次全量的数据复制,这对实际的系统运营造成了不小的麻烦。
h) Redis 较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。为避免这一问题,
运维人员在系统上线时必须确保有足够的空间,这对资源造成了很大的浪费。
MongoDB 优点:
1)弱一致性(最终一致),更能保证用户的访问速度
2)文档结构的存储方式,能够更便捷的获取数
3)内置 GridFS,高效存储二进制大对象 (比如照片和视频)
4)支持复制集、主备、互为主备、自动分片等特性
5)动态查询
6)全索引支持,扩展到内部对象和内嵌数组
缺点:
1)不支持事务
2)MongoDB 占用空间过大
3)维护工具不够成熟

6.Redis 的事务

一、 Redis 事务允许一组命令在单一步骤中执行。事务有两个属性, 说明如下:
a) 事务是一个单独的隔离操作:事务中的所有命令都会序列化、按 顺序地执行。事务在执行
的过程中,不会被其他客户端发送来的命令 请求所打断。
b) Redis 事务是原子的。原子意味着要么所有的命令都执行,要么 都不执行;
二、 一个事务从开始到执行会经历以下三个阶段:
a)开始事务
b)命令入队
c)执行事务

7.Redis 的使用场景有哪些

1.取最新 N 个数据的操作
2.排行榜应用,取 TOP N 操作
3.需要精准设定过期时间的应用
4.计数器应用
5.uniq 操作,获取某段时间所有数据排重值
6.Pub/Sub 构建实时消息系统
7.构建队列系统
8.缓存

8.Redis 默认端口,默认过期时间,Value 最多可以容纳的数据长度

1.默认端口:6379
2.默认过期时间:可以说永不过期,一般情况下,当配置中开启了超出最大内存限制就写磁盘的话,
那么没有设置过期时间的 key 可能会被写到磁盘上。假如没设置,那么 REDIS 将使用 LRU
机制,将内存中的老数据删除,并写入新数据。
3.Value 最多可以容纳的数据长度是:512M

部分来自:软盟商城

发布了129 篇原创文章 · 获赞 128 · 访问量 24万+

猜你喜欢

转载自blog.csdn.net/yw8886484/article/details/91348724