分表可以通过三种方式:Mysql 集群、自定义规则和 merge 存储引擎。
分区有四类:
RANGE 分区:基于属于一个给定连续区间的列值,把多行分配给分区。
LIST 分区:类似于按 RANGE 分区,区别在于 LIST 分区是基于列值匹配一个离散值集合中的某个值来进行选择。
HASH 分区:基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含 MySQL 中有效的、产生非负整数值的任何表达式。
KEY 分区:类似于按 HASH 分区,区别在于 KEY 分区只支持计算一列或多列,且 MySQL 服务器提供其自身的哈希函数。必须有一列或多列包含整数值。
8.如何对查询命令进行优化
a. 应尽量避免全表扫描,首先应考虑在 where 及 orderby 涉及的列上建立索。
b. 应尽量避免在 where 子句中对字段进行 null 值判断,避免使用!=或<>操作符,避免使用 or
连接条件,或在 where 子句中使用参数、对字段进行表达式或函数操作,否则会导致权标扫描
c. 不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无
法正确使用索引。
d. 使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为
条件时才能保证系统使用该索引,否则该索引将不会被使用。
e. 很多时候可考虑用 exists 代替 in。
f. 尽量使用数字型字段。
g. 尽可能的使用 varchar/nvarchar 代替 char/nchar。
9.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 预处理。
10.NoSQL 和关系数据库的区别
a. SQL 数据存在特定结构的表中;而 NoSQL 则更加灵活和可扩展,存储方式可以省是 JSON 文档、
哈希表或者其他方式。
b. 在 SQL 中,必须定义好表和字段结构后才能添加数据,例如定义表的主键(primary key),索引
(index),触发器(trigger),存储过程(storedprocedure)等。表结构可以在被定义之后更新,但是如果有
比较大的结构变更的话就会变得比较复杂。在 NoSQL 中,数据可以在任何时候任何地方添加,不需要
先定义表。
c. SQL 中如果需要增加外部关联数据的话,规范化做法是在原表中增加一个外键,关联外部数据表。
而在 NoSQL 中除了这种规范化的外部数据表做法以外,我们还能用如下的非规范化方式把外部数据直
接放到原数据集中,以提高查询效率。缺点也比较明显,更新审核人数据的时候将会比较麻烦。
d. SQL 中可以使用 JOIN 表链接方式将多个关系数据表中的数据用一条简单的查询语句查询出来。
NoSQL 暂未提供类似 JOIN 的查询方式对多个数据集中的数据做查询。所以大部分 NoSQL 使用非规范
化的数据存储方式存储数据。
e. SQL 中不允许删除已经被使用的外部数据,而 NoSQL 中则没有这种强耦合的概念,可以随时删
除任何数据。
f. SQL 中如果多张表数据需要同批次被更新,即如果其中一张表更新失败的话其他表也不能更新成
功。这种场景可以通过事务来控制,可以在所有命令完成后再统一提交事务。而 NoSQL 中没有事务这
个概念,每一个数据集的操作都是原子级的。
g. 在相同水平的系统设计的前提下,因为 NoSQL 中省略了 JOIN 查询的消耗,故理论上性能上是
优于 SQL 的。
错误日志:记录启动,运行或者停止 mysql 时出现的问题;
通用日志:记录建立的客户端连接和执行的语句;
二进制日志:记录所有更改数据的语句;
Mongdb
1.Mongo 数据库的一些基本操作命令
a) createdatabase name; 创建数据库
b) use databasename; 选择数据库
c) dropdatabase 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 占用空间过大,维护工具不够成熟