Mysql 数据库(七)
备份数据
备份库:
mysqldump:拷贝数据
--database:数据库
基本语法是:mysqldump -h服务器名 -u用户名 -p密码 --database 库名 > 备份路径.sql :后缀名
--all-database:备份所有的库
--databases:备份多个库
备份的数据名里面最好加上时间和日期。
锁住表的操作主要是为了为了一个一个的操作记录,不然记录就会乱。
恢复库:
mysqlload -u用户名 -p密码 <文件路径
备份表:
mysqldump -u用户名 -p密码 库名.表名 >备份到的路径
mysqldump -u用户名 -p密码 库名.表名 表名 表名。。。>备份到的路径 mysqldump -u用户名 -p密码 库名.表名 库名.表名。。。>备份到的路径 :多个表同时备份
恢复表:
mysqlload -u用户名 -p密码 恢复到哪个库 >数据的路径
1 语法: mysqldump -h 服务器 -u用户名 -p密码 数据库名 > 备份文件.sql 2 备份库 mysqldump -uroot -p --database day45 > C:\\day45_bak_2017_10_30.sql 恢复库 mysql -uroot -p < C:\\day45_bak_2017_10_30.sql 3 备份多个库 mysqldump -uroot -p --databases day43 day44 day45 > C:\\day43_day45_day44_bak_2017_10_30.sql 恢复库 mysql -uroot -p < C:\\day45_bak_2017_10_30.sql 4 备份多个表 mysqldump -uroot -p day45 employee t1 t2 > C:\\day45_t1_t2_employee_bak_2017_10_30.sql 恢复表 mysql -uroot -p day45 < C:\\day45_t1_t2_employee_bak_2017_10_30.sql 5 备份所有的库 mysqldump -uroot -p --all-databases > C:\\all.sql 恢复库 mysql -uroot -p < C:\\all.sql
二 表的导入导出
into:放到哪个文件
outfile:哪个文件
fields terminated by:字段的分割符
lines terminated by:行的分割符
optionally enclosed by '符号':定义用什么符号括起来
lines terminated by '\n' :定义换行符
varidbles:系统参数,用来初始化或者设定数据库对系统资源的占用。
详细信息:https://zhidao.baidu.com/question/985034511048325699.html
global secure_file_priv '路径':scure-file-priv参数是来限制LOAD DATA, SELECT ... OUTFILE, and LOAD_FILE()传入哪个指定目录的
详细信息:https://segmentfault.com/a/1190000009333563
opltonally enclosed by :自定义分割符
导出表 mysql> SELECT * FROM school.student1 INTO OUTFILE 'student1.txt' FIELDS TERMINATED BY ',' //定义字段分隔符 OPTIONALLY ENCLOSED BY '”' //定义字符串使用什么符号括起来 LINES TERMINATED BY '\n' ; //定义换行符 导入表 mysql> LOAD DATA INFILE '/tmp/student1.txt' INTO TABLE school.student1 FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '”' LINES TERMINATED BY '\n';
三 mysql的索引原理
使用索引优化了查看的的时间,索引就是使用目录定位记录的位置。操作步骤都是差不多,省略掉了无用的查约束,提高了查询的速度。
primary和unique都属于索引,在mysql中索引都叫做键,而有的键又约束的功能,没有这些约束功能的都是普通的索引。
索引的原理:不断的缩小查询的范围,筛选出最终的结果。同时将随机的事件变成有序的事件。而简单的分段没有办法优化查询速度。
索引的方式分为两种,分别是哈希(hash)和btree
机械硬盘的知识:机械硬盘就是有一个或者多个盘片和其他的机械组成。如下:
找到一个磁道的时间就叫做平均寻到时间,范围大约在5ms以下。
转一圈然后在除以2的结果就是平均延迟时间,大月约在:1/120/2 = 4.17ms左右。
找到数据的时间是在平均寻道时间加上平均延迟时间稍微的多一点。
什么叫做磁盘块:一次向内存读的数据量大小,也叫做block块。在linux系统中默认是4k。磁盘块不是一个物理单位,而是一个逻辑单位。
物理单位为512个字节。是寻到的大小的一半。
磁盘块包含的有数据项,除了数据项还有指针。
在一个磁盘块中,数据项是双双对应的左边的一个数对应着右边的一个数。
数据项的大小与数据项个数成反比的,数据项的越小,存放的个数就会越多。
索引存放的数据在硬盘中,而他们查找的次数就受限用于存放的层级。层级月到查找的次数就会越多。
正确的索引存放方法是把数据量小的并且还要唯一的字段选做数据项。
测试索引:
创建表:
#1. 准备表 create table s1( id int, name varchar(20), gender char(6), email varchar(50) ); #2. 创建存储过程,实现批量插入记录 delimiter $$ #声明存储过程的结束符号为$$ create procedure auto_insert1() BEGIN declare i int default 1; while(i<1232636)do insert into s1 values(i,'egon','male',concat('egon',i,'@oldboy')); set i=i+1; end while; END$$ #$$结束 delimiter ; #重新声明分号为结束符号 #3. 查看存储过程 show create procedure auto_insert1\G #4. 调用存储过程 call auto_insert1();
在表中为以存在的大量数据下,为某个字段建立索引,建立速度会很慢
create index a on 表名(字段名);
mysql> create index a on s1(id); Query OK, 0 rows affected (23.47 sec) Records: 0 Duplicates: 0 Warnings: 0
在索引建立好了以后,以该字段作为查询条件时,时间会很快
mysql> select * from s1 where id=1000000; +---------+------+--------+--------------------+ | id | name | gender | email | +---------+------+--------+--------------------+ | 1000000 | egon | male | egon1000000@oldboy | +---------+------+--------+--------------------+ 1 row in set (0.14 sec)
1 mysql先去表里面的b+数的搜索原理很快就会找到该索引字段的记录存不存在或着存放在哪个位置。以数据量小的作为索引的字段明显速度提升了很多。
2 如果使用数据量大的字段作为索引的字段,速度依然还是很慢。