一、数据备份
1、物理备份:直接复制数据库文件,适用于大型数据库环境,但不能恢复到导构系统中如Windows
2、逻辑备份:备份的是建表、建库、插入等操作所执行的sql语句,适用于中小型数据库,效率相对较低
》》》》》》》全部在cmd默认目录下,不用加分号
》》备份一个库:
mysqldump -h 服务器地址 -u用户名 -p密码 --database 库名 > 备份文件.sql (就写备份文件的路径)
服务器地址不写的话默认是本地
《《恢复一个库:cmd默认目录下
mysql -u用户名 -p密码 < 备份文件.sql (就是备份文件的路径)
》》备份多个库:
mysqldump -h 服务器地址 -u用户名 -p密码 --databases 库1 库2 库3 > 备份文件.sql (就写备份文件的路径)
库和库之间用空格隔开
《《恢复一个库:cmd默认目录下
mysql -u用户名 -p密码 < 备份文件.sql (就是备份文件的路径) 和恢复一个库没有区别,只不过直接恢复多个库
》》备份所有库:
mysqldump -h 服务器地址 -u用户名 -p密码 --all-databases > 备份文件.sql (就写备份文件的路径)
《《恢复所有库:
mysql -u用户名 -p密码 < 备份文件.sql (就是备份文件的路径)
》》备份一个表:
mysqldump -u用户名 -p密码 库名 表名 > 备份文件.sql (就写备份文件的路径)
库和表之间用空格隔开
《《恢复一个表:cmd默认目录下
mysql -u用户名 -p密码 库名 < 备份文件.sql (就是备份文件的路径)
要指定库名,不然会报错
》》备份多个表:
mysqldump -u用户名 -p密码 库名 表1 表2 表3 > 备份文件.sql (就写备份文件的路径)
多个表之间用空格隔开
《《恢复多个表:cmd默认目录下
mysql -u用户名 -p密码 库名 < 备份文件.sql (就是备份文件的路径)
要指定库名,不然会报错
补充:恢复的另一种方法:
mysql> use db1; 切换到库目录下
mysql> SET SQL_LOG_BIN=0;
mysql> source /root/db1.sql source后跟备份文件的路径
3、表的导入和导出
》》》》在mysql目录下
》》导出:导出文本文件
mysql > select * from 库名.表名
into outfile '导出文件的路径'
fields terminated by ',' #定义字段分割符
optionally enclosed by '" ' #定义字符串使用什么符号括起来
lines terminated by '\n'; #定义换行符,Windows系统
》》导入:导入文本文件
mysql > load data infile '导出的文件路径'
into table 库名.表名
fields terminated by ',' #定义字段分割符
optionally enclosed by '" ' #定义字符串使用什么符号括起来
lines terminated by '\n'; #定义换行符,Windows系统
》》设置导出文件路径参数
上述的导入导出是有风险的,一旦数据库权限泄露就会被轻易的导出数据,所以mysql对此做限制,要求必须
导出到指定的文件路径,这就是secure_file_priv参数,意思就是导出的文件路径必须在这个参数设置的路径下
不在的话是会报错的
——>在配置文件中设置(即是后缀为ini的文件):
[mysqld]
secure_file_priv = '路径' 比如'C:\\'就代表着只能导出到C盘里或C盘里的某个文件
4、数据库的迁移
》》前提是两个数据库版本要相同
》》mysqldump -h 源ip -u用户名 -p密码 --databases 库名 | mysql -h 目标ip -u用户名 -p密码
这样就把在源IP的数据库迁移到了目的IP的数据库上
二、索引原理
》》数据库的索引可以理解为字典或者书籍的目录,通过不断的缩小范围来提高查询效率
》》索引的数据结构:Btree 和 Hash
1、产生背景:
在生产环境中,对数据库的读操作要比写操作使用频率更高,所以提高查询效率就显得尤为重要,加速查询就要用到索引
2、概念:
在mysql中也被称作键,是存储引擎用于快速找到记录的一种数据结构
3、本质:
本质都是:通过不断地缩小想要获取数据的范围来筛选出最终想要的结果,同时把随机的事件变成顺序的事件,也就是说,有了这种索引机制,我们可以总是用同一种查找方式来锁定数据。
4、索引原理
磁盘是硬盘和软盘的统称,大多时候指的就是硬盘
我们对数据库的读操作其实就是对硬盘的读操作,也就是磁盘的IO操作,那磁盘的IO操作就涉及到了磁盘的读取时间问题,磁盘的读取依靠的是机械运动,类似于以前的那种唱片,有指针和轨道,通过对轨道的旋转来发出特定的声音,磁盘的读取时间分为寻道时间和旋转延迟和传输时间三个部分,寻道时间是磁臂运动到指定磁道的时间,旋转延迟就是磁盘的转速,指的是磁臂运动到数据所在的区域的平均时间,传输时间指的是读和写数据的时间,这个时间很短,与前两个相比可以忽略不计,寻道时间和旋转延迟对操作系统是极大的浪费,所以操作系统为了优化磁盘IO这种高昂的操作,就设计了每发生一次磁盘IO,不光把当前磁盘数据读取出来也会把它相邻的数据都读出来,这就是预读,每一次磁盘IO读取的数据我们把它称作为一页,一页的大小由操作系统决定,所以我们读取一页数据的时候实际才发生了一次磁盘IO,索引就是依据磁盘IO和预读为前提设计出来的
5、索引的数据结构
平衡树(B+树) (hash这里不做讨论)
》》平衡树的查找过程:真实的数据要放在叶子节点,就是最下面那一层
》》平衡树的性质
索引的字段要尽量的小
索引的最左匹配特性