(一)爬虫海量数据存储在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 '密码'
数据库常见面试题
最新推荐文章于 2025-02-22 16:02:09 发布