目录
1. 数据库相关概念
数据库管理系统 :Database Management System(DBMS):是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库。
记录:每一组数据组成一条记录
表:文件,用来存储多条记录
库:文件夹,用来组织文件/表(存储在data文件夹下)
数据库分类:
-
关系型(RDBMS):mysql(开源)、Oracle、MariaDB(mysql分支)、SQLserver(简单)、sqlite、Access(微软、存储数据)
每个字段之间关系紧密,通过任何一个字段都可以查到该组数据
-
非关系型(NoSQL):redis、mongodb
只能通过key来获取values, 高性能、高并发,对数据一致性要求不高。
SQL语句:结构化查询语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据可系统。
不同数据库之间的SQL语句不能完全相互通用。
2. 数据库基本操作
sql操作语句是以分号结尾的
2.1 库的操作:
查看数据库: show databases;
查看其中一个库: show create database 库名;
创建数据库: create database 库名;
create database 库名 charset utf8; # 指定字符集
修改数据库编码:
alter database 库名 charset latin1; # 最好在创建数据库时指定编码,否则存入的数据没办法更改编码方式。
删除数据库:drop database 库名;
使用数据库:use 数据库名
2.2 表的操作:
表名不能重复。
创建表:create table 表名(id int, name char(16)) # id :字段,int:类型,16:字符长度
查看库下的所有表:show tables;
查看一张表:show create table 表名;
查看一张表的结构:desc 表名;
修改数据类型:alter table 表名 modify 字段 char(16); # 修改表的字段数据类型
修改字段名和数据类型:
alter table 表名 change 原名 新名 char(2);
删除一张表:drop table 表名;
2.3 记录(数据)的操作:
新增记录:insert into 表名 values(1,‘meet’),(2,‘alex’);
查看记录:select * from 表名; # 查所有的数据
select 字段 from 表名; # 查某一字段的数据
select * from 表名 where id = 2; # 指定某一条件查看数据
修改记录:update 表名 set name = ‘sb’ where id=2;
删除记录:delete from 表名 where id=1;
清空记录:delete from 表名;
truncate table 表名; # 速度快
3. 其他指令
show variables like "%char%";
# 查看字符集编码指令
mysql -h IP地址 -p 3306 -uroot -p
# mysql客户端连接服务端时的完整指令
# 创建账号
mysql> create user '用户名'@'192.168.10.%' identified by '密码';# 指示网段
mysql> create user '用户名'@'192.168.10.5' # 指示某机器可以连接
mysql> create user '用户名'@'%' #指示所有机器都可以连接
mysql> show grants for 'eva'@'192.168.10.5';查看某个用户的权限
# 创建账号并授权
mysql> grant all on *.* to '用户名'@'IP地址' identified by '密码'
# 远程登陆
mysql -u用户名 -p密码 -h 对方IP # 对方给你权限
4. 数据库root密码忘记解决方法:
1. 停掉MySQL服务端(net stop mysql)
2. 切换到MySQL安装目录下的bin目录下,然后在cmd下手动指定启动程序来启动mysql服务端,指令: mysqld.exe --skip-grant-tables
3. 重新启动一个cmd窗口,输入mysql,连接mysql服务端,
4. 进入mysql库(use mysql),修改mysql库中user表里面的root用户记录的密码:
update user set password = password('123') where user='root';
5. 输入 flush privileges; # 刷新权限
6. 关掉mysqld服务端进程,指令:
tasklist|findstr mysqld # 获取mysqlpid进程号
taskkill /F /PID 进程号 # 强制杀死进程
7. 正常启动服务端(net start mysql)
5. 修改密码
方法1:
首先登录mysql,使用mysql自带的那个客户端连接上mysql。
格式:mysql> set password for 用户名@localhost = password('新密码');
例子:mysql> set password for root@localhost = password('123');
方法2:用mysqladmin (因为我们将bin已经添加到环境变量了,这个mysqladmin也在bin目录下,所以可以直接使用这个mysqladmin功能,使用它来修改密码)
关于mysqladmin的介绍:是一个执行管理操作的客户端程序。它可以用来检查服务器的配置和当前状态、创建和删除数据库、修改用户密码等等的功能,虽然mysqladmin的很多功能通过使用MySQL自带的mysql客户端可以搞定,但是有时候使用mysqladmin操作会比较简单。
格式:mysqladmin -u用户名 -p旧密码 password 新密码
例子:mysqladmin -uroot -p123 password 123456
方法3:用updata直接编辑那个自动的mysql库中的user表
首先登录mysql,连接上mysql服务端。
mysql> use mysql; use mysql的意思是切换到mysql这个库,这个库是所有的用户表和权限相关的表都在这个库里面,我们进入到这个库才能修改这个库里面的表。
mysql> update user set password=password('123') where user='root' and host='localhost'; 其中password=password('123') 前面的password是变量,后面的password是mysql提供的给密码加密用的,我们最好不要明文的存密码,对吧,其中user是一个表,存着所有的mysql用户的信息。
mysql> flush privileges; 刷新权限,让其生效,否则不生效,修改不成功。
6. 存储引擎
存储引擎的概念是MySQL里面才有的。
默认的引擎:Innodb
show engines; # 查看所有的存储引擎
MySQL支持多种存储引擎,每种引擎有着一些自己独特的功能,用户在使用的时候,可以根据自己的业务场景来使用不同的存储引擎,其中MySQL最常用的存储引擎为:MyISAM和InnoDB。
show variables like "storage_engine%";
#查看当前正在使用的引擎
Innodb引擎:
InnoDB引擎是MySQL数据库的另一个重要的存储引擎,正称为目前MySQL AB所发行新版的标准,被包含在所有二进制安装包里。和其他的存储引擎相比,InnoDB引擎的优点是支持兼容ACID的事务(类似于PostGreSQL),以及参数完整性(即对外键的支持)。
InnoDB引擎特点:
1.支持事务:支持4个事务隔离界别,支持多版本读。
2.行级锁定(更新时一般是锁定当前行):通过索引实现,全表扫描仍然会是表锁,注意间隙锁的影响。
3.读写阻塞与事务隔离级别相关(有多个级别,这就不介绍啦~)。
4.具体非常高效的缓存特性:能缓存索引,也能缓存数据。
5.整个表和主键与Cluster方式存储,组成一颗平衡树。(了解)
6.所有SecondaryIndex都会保存主键信息。(了解)
7.支持分区,表空间,类似oracle数据库。
8.支持外键约束,不支持全文索引(5.5之前),以后的都支持了。
9.和MyISAM引擎比较,InnoDB对硬件资源要求还是比较高的。
MyISAM引擎:
MyISAM引擎特点:
1.不支持事务
事务是指逻辑上的一组操作,组成这组操作的各个单元,要么全成功要么全失败。
2.表级锁定
数据更新时锁定整个表:其锁定机制是表级锁定,也就是对表中的一个数据进行操作都会将这个表锁定,其他人不能操作这个表,这虽然可以让锁定的实现成本很小但是也同时大大降低了其并发性能。
3.读写互相阻塞
不仅会在写入的时候阻塞读取,MyISAM还会再读取的时候阻塞写入,但读本身并不会阻塞另外的读。
4.只会缓存索引
MyISAM可以通过key_buffer_size的值来提高缓存索引,以大大提高访问性能减少磁盘IO,但是这个缓存区只会缓存索引,而不会缓存数据。
5.读取速度较快
占用资源相对较少
6.不支持外键约束,但只是全文索引
7.MyISAM引擎是MySQL5.5版本之前的默认引擎,是对最初的ISAM引擎优化的产物。
7. 存储引擎的使用
7.1 指定表的引擎
create table innodb_t2(id int)engine=innodb;
# 创建表时指定引擎
# 配置文件中使用,指定默认存储引擎
default-storage-engine=INNODB
innodb_file_per_table=1 #表示独立表空间存储,可以不写
7.2 不同引擎在创建表的不同:
创建四个表,分别使用innodb,myisam,memory,blackhole存储引擎,进行插入数据测试。
#下面是使用四个不同的引擎来创建的表
create table t1(id int)engine=innodb;
create table t2(id int)engine=myisam;
create table t3(id int)engine=memory;
create table t4(id int)engine=blackhole;
在mysql安装目录下的data文件中可打开创建的库。
上面文件的解析:
1.db.opt文件:用来记录该库的默认字符集编码和字符集排序规则用的。也就是说如果你创建数据库指定默认字符集和排序规则,那么后续创建的表如果没有指定字符集和排序规则,那么该新建的表将采用db.opt文件中指定的属性。
2.后缀名为.frm的文件:这个文件主要是用来描述数据表结构(id,name字段等)和字段长度等信息。
3.后缀名为.ibd的文件:这个文件主要存储的是采用独立表储存模式时储存数据库的数据信息和索引信息;
4.后缀名为.MYD(MYData)的文件:从名字可以看出,这个是存储数据库数据信息的文件,主要是存储采用独立表储存模式时存储的数据信息;
5.后缀名为.MYI的文件:这个文件主要储存的是数据库的索引信息;
6.ibdata1文件:主要作用也是储存数据信息和索引信息,这个文件在mysql安装目录的data文件夹下。
从上面可以看出,.ibd储存的是数据信息和索引信息,ibdata1文件也是存储数据信息和索引信息,.MYD和.MYI也是分别储存数据信息和索引信息,那他们之间有什么区别呢?
主要区别是再于数据库的存储引擎不一样,如果储存引擎采用的是MyISAM,则生成的数据文件为表名.frm、表名.MYD、表名的MYI;而储存引擎如果是innoDB,开启了innodb_file_per_table=1,也就是采用独立储存的模式,生成的文件是表名.frm、表名.ibd,如果采用共存储模式的,数据信息和索引信息都存储在ibdata1(在里面进行分类,从外面看是一个文件)中;
在进行数据恢复的时候,如果用的是MYISAM数据引擎,那么数据很好恢复,只要将相应.frm, .MYD, .MYI文件拷贝过去即可。但是如果是innodb的话,则每一个数据表都是一个单独的文件,只将相应的.frm和.ibd文件拷贝过去是不够的,必须在你的ibd文件的tablespace id和ibdata1文件中的元信息的tablespace id一致才可以。
msyql设定的规则就是这样存储表的,使用它的系统,就要理解它的规则。