1. 什么是数据库?
- 数据库(Database)是按照数据结构来组织、存储和管理数据的仓库
2. 什么是关系型数据库、主键,外键,索引分别是什么?
- 关系型数据库是由多张能互相联接的二维行列表格组成的数据库
主键(primary key)
是表中的一个或多个字段,它的值用于唯一地标识表中的某一条记录外键
表示了两个关系之间的相关联系。以另一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从表。外键又称作外关键字- 在关系数据库中,
索引
是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单
3. 表的链接查询方式有那些,有什么区别?
交叉连接
即笛卡儿乘积,是指两个关系中所有元组的任意组合- 使用
内连接
时,如果两个表的相关字段满足连接条件,就从这两个表中提取数据并组合成新的记录 自连接
是一种特殊的内连接,它是指相互连接的表在物理上为同一张表,但可以在逻辑上分为两张表外连接
是只限制一张表中的数据必须满足连接条件,而另一张表中的数据可以不满足连接条件的连接方式
4. SQL的select语句完成的执行顺序?
from
子句组装来自不同数据源的数据;where
子句基于指定的条件对记录行进行筛选;group by
子句将数据划分为多个分组;- 使用聚集函数进行计算;
- 使用
having
子句筛选分组; - 计算所有的表达式;
select
的字段;- 使用
order by
对结果集进行排序。
5. MySQL数据库存储的原理?
储存过程是一个可编程的函数,它在数据库中创建并保存。它可以有 SQL 语句和一些特殊的控制结构组成。当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的。数据库中的存储过程可以看做是对编程中面向对象方法的模拟。它允许控制数据的访问方式。存储过程通常有以下优点:
- 存储过程能实现较快的执行速度
- 存储过程允许标准组件是编程
- 存储过程可以用流程控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。
- 存储过程可被作为一种安全机制来充分利用。
- 存储过程能够减少网络流量
6. 事务的特性?
原子性(Atomicity)
:事务中的全部操作在数据库中是不可分割的,要么全部完成,要么均不执行。一致性(Consistency)
:几个并行执行的事务,其执行结果必须与按某一顺序串行执行的结果相一致。隔离性(Isolation)
:事务的执行不受其他事务的干扰,事务执行的中间结果对其他事务必须是透明的。持久性(Durability)
:对于任意已提交事务,系统必须保证该事务对数据库的改变不被丢失,即使数据库出现故障
7. 数据库索引?
数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用B_TREE
。B_TREE
索引加速了数据访问,因为存储引擎不会再去扫描整张表得到需要的数据;相反,它从根节点开始,根节点保存了子节点的指针,存储引擎会根据指针快速寻找数据。
8. 数据库怎么优化查询效率?
储存引擎选择:如果数据表需要事务处理,应该考虑使用 InnoDB
,因为它完全符合 ACID
特性。如果不需要事务处理,使用默认存储引擎 MyISAM
是比较明智的;
- 分表分库,主从
- 对查询进行优化,要尽量避免全表扫描,首先应考虑在
where
及order by
涉及的列上建立索引 - 应尽量避免在
where
子句中对字段进行null
值判断,否则将导致引擎放弃使用索引而进行全表扫描 - 应尽量避免在
where
子句中使用!=
或<>
操作符,否则将引擎放弃使用索引而进行全表扫描 - 应尽量避免在
where
子句中使用or
来连接条件,如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全表扫描 Update
语句,如果只更改 1、2 个字段,不要Update
全部字段,否则频繁调用会引起明显的性能消耗,同时带来大量日志- 对于多张大数据量(这里几百条就算大了)的表 JOIN,要先分页再 JOIN,否则逻辑读会很高,性能很差。
9. 你用的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%’
10. 如何对查询命令进行优化?
- a. 应尽量避免全表扫描,首先应考虑在
where
及order by
涉及的列上建立索引。 - b. 应尽量避免在
where
子句中对字段进行null
值判断,避免使用!=
或<>
操作符,避免使用or
连接条件,或在where
子句中使用参数、对字段进行表达式或函数操作,否则会导致权标扫描 - c. 不要在
where
子句中的“=”
左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。 - d. 使用索引字段作为条件时,如果该索引是
复合索引
,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用。 - e. 很多时候可考虑用
exists
代替in
。 - f. 尽量使用数字型字段。
- g. 尽可能的使用
varchar/nvarchar
代替char/nchar
。 - h. 任何地方都不要使用
select from t
,用具体的字段列表
代替 ,不要返回用不到的任何字段。 - i. 尽量使用表变量来代替临时表。
- j. 避免频繁创建和删除临时表,以减少系统表资源的消耗。
- k. 尽量避免使用游标,因为游标的效率较差。
- l. 在所有的存储过程和触发器的开始处设置
SET NOCOUNT ON
,在结束时设置SET NOCOUNT OFF
。 - m. 尽量避免大事务操作,提高系统并发能力。
- n. 尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理。
11. 数据库的优化?
优化索引、SQL 语句、分析慢查询;
- 设计表的时候严格根据数据库的
设计范式
来设计数据库; - 使用缓存,把经常访问到的数据而且不需要经常变化的数据放在缓存中,能节约磁盘 IO
- 优化硬件;采用 SSD,使用磁盘队列技术(RAID0,RAID1,RDID5)等
- 采用 MySQL 内部自带的
表分区技术
,把数据分层不同的文件,能够提高磁盘的读取效率; 垂直分表
;把一些不经常读的数据放在一张表里,节约磁盘 I/O;主从分离读写
;采用主从复制把数据库的读操作和写入操作分离开来;分库分表分机器
(数据量特别大),主要的的原理就是数据路由;- 选择合适的
表引擎
,参数上的优化 - 进行架构级别的缓存,静态化和分布式;
- 不采用全文索引;
- 采用更快的存储方式,例如 NoSQL 存储经常访问的数据。
12. Sql注入是如何产生的,如何防止?
程序开发过程中不注意规范书写sql 语句和对特殊字符进行过滤,导致客户端可以通过全局变量POST 和GET提交一些 SQL语句正常执行。产生 SQL 注入。下面是防止办法:
- a. 过滤掉一些常见的数据库操作关键字,或者通过系统函数来进行过滤。
- c. SQL 语句书写的时候尽量不要省略小引号(tab 键上面那个)和单引号
- d. 提高数据库命名技巧,对于一些重要的字段根据程序的特点命名,取不易被猜到的
- e. 对于常用的方法加以封装,避免直接暴漏 SQL 语句
- g. 打开 magic_quotes_gpc 来防止 SQL 注入
- h. 控制错误信息:关闭错误提示信息,将错误信息写到系统日志。
- i. 使用 mysqli 或 pdo 预处理。
13. 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 的。