面试4——数据库知识储备

1.基础入门:

1.常见命令:

  1. 查看当前所有的数据库 show databases;
  2. 打开指定的库 use 库名;
  3. 查看当前库的所有表 show tables;
  4. 查看当前其他库的所有表 show tables from 库名;
  5. 创建表 creat table 表名
    ( 列名 列类型,
    列名 列类型,
    。。。 );
  6. 查看表结构 desc 表名;
  7. 查看服务器版本 select version();

2.MySQL 语法规范:

1.不区分大小写,单建议关键字大写,表名,列名小写
2.每条命令最好分号结尾
3.每条命令根具需要进行缩进或换行。

2.如何提高查询速度?

在一个千百万级的数据表中,使用查询需要注意的是:首先是服务器硬件配置上的更新和优化。比如增加内存,使用多核处理器,硬盘升级等等措施。
1.数据库设计方面

  1. 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引
  2. 从系统层面增强mysql的性能:优化数据表结构、字段类型、字段索引、分表,分库、读写分离等等。

2.SQL语句方面

  1. 优化 SQL 语句,合理使用字段索引。
  2. 应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null; 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from t where num=0;
  3. 避免在 where 子句中对字段进行 < > =等符号判断,这会引发全盘扫描。

3.数据库操作上

  1. 从代码层面增强性能:使用缓存和NoSQL数据库方式存储,如MongoDB/Memcached/Redis来缓解高并发下数据库查询的压力。
  2. 减少数据库操作次数,尽量使用数据库访问驱动的批处理方法。
  3. 提升数据库服务器硬件配置,或者搭建数据库集群。

3.加了索引就快了?

Mysql索引主要有两种结构:B+Tree索引和Hash索引。我们平常所说的索引,如果没有特别指明,一般都是指B树结构组织的索引(B+Tree索引)。
面试4——数据库知识储备_第1张图片

  1. 最外层浅蓝色磁盘块1里有数据17、35(深蓝色)和指针P1、P2、P3(黄色)。P1指针表示小于17的磁盘块,P2是在17-35之间,P3指向大于35的磁盘块。真实数据存在于子叶节点也就是最底下的一层3、5、9、10、13……非叶子节点不存储真实的数据,只存储指引搜索方向的数据项,如17、35。
  2. 查找过程:例如搜索28数据项,首先加载磁盘块1到内存中,发生一次I/O,用二分查找确定在P2指针。接着发现28在26和30之间,通过P2指针的地址加载磁盘块3到内存,发生第二次I/O。用同样的方式找到磁盘块8,发生第三次I/O。
  3. 真实的情况是,上面3层的B+Tree可以表示上百万的数据,上百万的数据只发生了三次I/O而不是上百万次I/O,时间提升是巨大的。

是否需要创建索引?

索引虽然能非常高效的提高查询速度,同时却会降低更新表的速度。实际上索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录,所以索引列也是要占用空间的。

建立索引的代价:

1.索引需要占硬盘空间,这是空间方面的代价。
2.一旦插入新的数据,就需要重新建索引,这是时间上的代价。所以,索引不适合需要大量增删改得表

建立索引的策略:

  1. 并不是所有索引对查询都有效,SQL是根据表中数据来进行查询优化的,当索引列有大量数据重复时,查询可能不会去利用索引,如一表中有字段sex,male、female几乎各一半,那么即使在sex上建了索引也对查询效率起不了作用。
  2. 索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有必要。
  3. 应尽可能的避免更新索引数据列,因为索引数据列的顺序就是表记录的物理存储顺序,一旦该列值改变将导致整个表记录的顺序的调整,会耗费相当大的资源。若应用系统需要频繁更新索引数据列,那么需要考虑是否应将该索引建为索引。

4.数据库索引底层结构

索引本质上是搜索查询的数据结构,常见的查询结构有顺序查找、二分查找、二叉排序树(实则也为二分查找)、平衡多路搜索树(B-Tree),其中B-tree中的变种 B+Tree 是大多树索引的最优查询结构。
其中-树和B+树最重要的一个区别就是B+树只有叶节点存放数据,其余节点用来索引,而B-树是每个索引节点都会有Data域所以B+Tree 适合用作索引结构,存储外部数据于叶子节点上。
每次从磁盘中把数据拷贝到内存中 称为 一次 I/O 操作,相比与已经拷贝到内存中去进行搜索等操作,磁盘到内存之间的数据 I/O 所消耗的时间远多得多。所以尽可能减少I/O操作,是优化数据库的最大问题。
采用B+Tree存储结构,搜索时I/O次数一般不会超过3次,所以用B+Tree作为索引结构效率是非常高的。
面试4——数据库知识储备_第2张图片

5.mySQL与memcache的区别

6.mysql常见三种存储引擎

1. InnoDB存储引擎
InnoDB给MySQL的表提供了事务处理、回滚、崩溃修复能力和多版本并发控制的事务安全。

2.MyISAM存储引擎
MyISAM是MySQL中常见的存储引擎,曾经是MySQL的默认存储引擎。MyISAM是基于ISAM引擎发展起来的,增加了许多有用的扩展。

3.MEMORY存储引擎
Memory存储引擎是MySQL中的一类特殊的存储引擎。其使用存储在内存中的内容来创建表,而且所有数据也放在内存中。这些特性都与InnoDB,MyISAM存储引擎不同。

7.MySQL B+Tree索引和Hash索引的区别?

B+Tree索引,是一种严格平衡的多路搜索二叉树结构,在大范围搜索的情形之下拥有非常强大的搜索能力,一般最多经历3次I/O就可以找到所需要的数据。哈希索引即是利用不同的键值将其通过设定的哈希函数计算得到哈希地址,所以一般通过一次哈希算法即可立即定位到相应的位置,速度非常快。

但是:哈希索引不能检索范围查询,经过哈希函数计算得出的索引变成不连续了,就没有办法完成范围查询、顺序查询检索等,哈希还需要防止键值重复问题,哈希冲突等问题。但是在等值查询中,哈希的速度占据绝对优势。所以选择的时候还得看具体使用环境。

8.B+树索引和哈希索引的明显区别是:

如上:

9.非关系型数据库和关系型数据库区别,优势比较?

非关系型数据库:

  1. NOSQL 基于键值对,所以主键 + 值;查询速度极快。
  2. 基于键值对,数据之间没有耦合性,易于水平扩展,课扩展性强。
  3. 分布式,严格意义上不是数据库,而是一种结构化存储数据的一种集合。

关系型数据库:

  1. MySQL,可以用SQL语句在一个表或者多个表中做关联查询,所支持的可查询内容 较NOSQL 更加丰富。
  2. 安全性能高, 容易理解上手,二维化的表格便于人们操作理解。

10.MySQL常见查询优化方案

八大优化方案
1、选取最适合的字段属性
其中最重要的一点就是 因该尽量把字段设置为NOT NULL;这样在将来执行查询的时候数据库就不用去比较NULL字段了。
2、使用连接(JOIN)来代替子查询(Sub-Queries)

3、使用联合(UNION)来代替手动创建的临时表

4、使用索引
索引是提高数据库性能的常用方法,它可以令数据库服务器以比没有索引快得多的速度检索特定的行,尤其是在查询语句当中包含有MAX(),MIN()和ORDERBY这些命令的时候,性能提高更为明显。
5、优化的查询语句

6、事务
事物以BEGIN关键字开始,COMMIT关键字结束。在这之间的一条SQL操作失败,那么,ROLLBACK命令就可以把数据库恢复到BEGIN开始之前的状态。

你可能感兴趣的:(MySQL,数据结构相关,c/c++,面试)