数据库常见面试题

(一)爬虫海量数据存储在mongo上的好处:
   (1)如果你要经常读取,那么我建议你的MongoDB来做存储。原因在于MongoDB是内存映射模式,
       可以充分利用系统的内存资源,内存越大MongoDB的查询速度越快。
   (2)MongoDB在启动后会将数据库中的数据以文件映射的方式加载到内存中。如果内存资源相当丰富的话,
       这将极大地提高数据库的查询速度,毕竟内存的I/O效率比磁盘高多了。
   (3)如果数据结构是不一致的,即不会有些行缺失某些字段,有些行又多出一些字段,那么我建议使用MongoDB
       做存储处理。因为Mongo没有schema的严格定义,是json格式存取。如果爬虫的字段会经常变化,字段定义
       可能会变更,Mongo对这方面很宽松,很容易兼容。但如果你对事务有要求,最好还是选择MySQL。
       总而言之,我个人是比较建议使用MongoDB做海量爬虫数据库存储。无论从数据结构的不规整以及数据存读取
       的速度要求,Mongo都可以胜任,同时MongoDB可以很轻松的横向扩展,分片,复制集群分分钟的事。

(二)mysql数据库的优化:
    (1)选取最适用的字段属性(应该尽量把字段属性设置为not null);
    (2)使用连接(join)来代替子查询;
    (3)使用联合(union)来代替手动创建的临时表;
    (4)事务;(事务的另一个重要作用是当多个用户同时使用相同的数据源时,它可以利用锁定数据库的方法来为用户提供
                一种安全的访问方式,这样可以保证用户的操作不被其它的用户所干扰。)
    (5)锁定表
    (6)使用外键  (锁定表的方法可以维护数据的完整性,但是它却不能保证数据的关联性。这个时候我们就可以使用外键。)
    (7)使用索引 (索引应建立在那些将用于JOIN,WHERE判断和ORDERBY排序的字段上。尽量不要对数据库中某个
                含有大量重复的值的字段建立索引)
    (8)优化查询语句(建有索引的字段上尽量不要使用函数进行操作;)

(三)mysql数据库怎么优化查询效率?
(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,否则逻辑读会很高,性能很差。

(四)数据库设计三范式:
    第一范式:要求有主键,并且要求每一个字段原子性不可再分
    第二范式:要求所有非主键字段完全依赖主键,不能产生部分依赖
    第三范式:所有非主键字段和主键字段之间不能产生传递依赖
(五)mysql数据库事务隔离级别:
    Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
   Repeatable read (可重复读):可避免脏读、不可重复读的发生。
   Read committed (读已提交):可避免脏读的发生。
   Read uncommitted (读未提交):最低级别,任何情况都无法保证。

    Serializable 串行化,一个事务一个事务的执行
    Repeatable read 可重复读,无论其他事务是否修改并提交了数据,在这个事务中看到的数据值始终不受其他事务影响
    Read committed 读取已提交,其他事务提交了对数据的修改后,本事务就能读取到修改后的数据值
    Read uncommitted 读取为提交,其他事务只要修改了数据,即使未提交,本事务也能看到修改后的数据值。

(六)mysql的基本操作:
    登录:mysql -u root -p 密码
    退出:ctrl+c,打叉,exit
    启动mysql服务器: net start mysql  关闭mysql服务器: net stop mysql

    DDL(数据库定义语言)(对库和表的操作)
    create(创建) alter(修改) drop(删除)
    对库操作:
       创建库:create database 库名。
       查询当前软件有多少个数据库:show databases。
       查询库的编码集:show create database 库名。
       修改库:alter database 库名 character set utf8。
       删除库:drop database 库名。
       使用库:use 库名。
   对表的操作:
       创建表:create table 表名(id int,username varchar(32)); 查看当前库有多少表:show tables
       查看当前表在哪个库中:select database()
       查看表的结构:desc 表名
       修改表:
       修改表名:alter table 表名 rename 新的表名
       增加字段:alter table 表名 add 字段名 字段类型 (after在哪个字段之后)
       修改字段:alter table 表名 change 旧字段 新字段 字段类型
       修改数据类型:alter table 表名 modify 字段名 新数据类型
       删除字段:alter table 表名 drop 字段名
       删除表:drop table 表名

   DML(数据库操作语言)(对表中的数据进行增删改 insert delete update)
      插入数据:insert into 表名(字段名) values (对应的字段数据),(对应的字段数据)
      修改数据:update 表名 set 字段名=值 where 条件
      删除数据:delete from 表名 where 条件

   DQL(数据库查询语言)(对表中的数据进行查询操作 select)
      查询数据:select * from 表名 where 条件
              select 字段名 from 表名
   DCL(数据库控制语言)(权限管理)

   数据库的备份
      导出数据库:mysql -uroot -p密码  被导出的库>e:/qq.sql
      导入数据库:mysql -uroot -p密码  准备导入文件的库<e:/qq.sql
   主键约束
      primary key : 唯一,非空
      自增 auto_increment:主键必须存在,必须是数值类型
   唯一约束
      unique :约束的字段不能重复(null不算)
   非空约束
      not null : 约束的字段不能为空
   默认约束
      default
   设置暂时的编码集
      set names 'gbk'
      \s :查看字符集
   关系结构模型数据库管理系统:
      mysql,oracle,sqlserver     按照二维表格的形式存储数据
   非关系结构模型数据库管理系统:
      redis(相对来说不安全),

   为用户授权
   grant 权限 on 数据库.* to 用户名@登陆主机 identified by '密码'
   创建用户
   create user '用户名'@'localhost' identified by '密码'
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值