库相关操作
Posted suncunxu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了库相关操作相关的知识,希望对你有一定的参考价值。
系统数据库
information_schema:虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息,列信息,权限信息,字符信息等
performance_schema:mysql 5.5开始新增一个数据库:主要是用于收集数据库服务器性能参数,记录处理查询请求时发生的各种事件,锁等现象
mysql:授权库,主要存储系统用户的权限信息
test:MySQL数据库系统自动创建的测试数据库
创建数据库:
1.语法:CREATE DATABASE 数据库名 charset utf8;
2.数据库命名规则:
可以由字母.数字,下划线,@,#,$
区分大小写
唯一性
不能使用关键字 create select
不能单独使用数字
最长128位
数据库相关操作:
1:查看数据库
show databases;
show create database db1;
select database();
2:选择数据库
USE 数据库名
3.删除数据库
DROP DATABASE 数据库名;
4.修改数据库
alter database db1 charset utf-8;
存储引擎即表类型,mysql根据不同的表类型会有不同的处理机制
对应文件有不同类型需要不同处理机制,数据库中的表也应该有不同的类型,表类型不同会对应mysql不同的存取机制,表类型又称存储引擎
show engines 查看所有支持的存储引擎
show variables like ‘storage_engine%‘;查看正在使用的存储引擎
1 #InnoDB 存储引擎 2 支持事务,其设计目标主要面向联机事务处理(OLTP)的应用。其 3 特点是行锁设计、支持外键,并支持类似 Oracle 的非锁定读,即默认读取操作不会产生锁。 从 MySQL 5.5.8 版本开始是默认的存储引擎。 4 InnoDB 存储引擎将数据放在一个逻辑的表空间中,这个表空间就像黑盒一样由 InnoDB 存储引擎自身来管理。从 MySQL 4.1(包括 4.1)版本开始,可以将每个 InnoDB 存储引擎的 表单独存放到一个独立的 ibd 文件中。此外,InnoDB 存储引擎支持将裸设备(row disk)用 于建立其表空间。 5 InnoDB 通过使用多版本并发控制(MVCC)来获得高并发性,并且实现了 SQL 标准 的 4 种隔离级别,默认为 REPEATABLE 级别,同时使用一种称为 netx-key locking 的策略来 避免幻读(phantom)现象的产生。除此之外,InnoDB 存储引擎还提供了插入缓冲(insert buffer)、二次写(double write)、自适应哈希索引(adaptive hash index)、预读(read ahead) 等高性能和高可用的功能。 6 对于表中数据的存储,InnoDB 存储引擎采用了聚集(clustered)的方式,每张表都是按 主键的顺序进行存储的,如果没有显式地在表定义时指定主键,InnoDB 存储引擎会为每一 行生成一个 6 字节的 ROWID,并以此作为主键。 7 InnoDB 存储引擎是 MySQL 数据库最为常用的一种引擎,Facebook、Google、Yahoo 等 公司的成功应用已经证明了 InnoDB 存储引擎具备高可用性、高性能以及高可扩展性。对其 底层实现的掌握和理解也需要时间和技术的积累。如果想深入了解 InnoDB 存储引擎的工作 原理、实现和应用,可以参考《MySQL 技术内幕:InnoDB 存储引擎》一书。 8 9 #MyISAM 存储引擎 10 不支持事务、表锁设计、支持全文索引,主要面向一些 OLAP 数 据库应用,在 MySQL 5.5.8 版本之前是默认的存储引擎(除 Windows 版本外)。数据库系统 与文件系统一个很大的不同在于对事务的支持,MyISAM 存储引擎是不支持事务的。究其根 本,这也并不难理解。用户在所有的应用中是否都需要事务呢?在数据仓库中,如果没有 ETL 这些操作,只是简单地通过报表查询还需要事务的支持吗?此外,MyISAM 存储引擎的 另一个与众不同的地方是,它的缓冲池只缓存(cache)索引文件,而不缓存数据文件,这与 大多数的数据库都不相同。 11 12 #NDB 存储引擎 13 2003 年,MySQL AB 公司从 Sony Ericsson 公司收购了 NDB 存储引擎。 NDB 存储引擎是一个集群存储引擎,类似于 Oracle 的 RAC 集群,不过与 Oracle RAC 的 share everything 结构不同的是,其结构是 share nothing 的集群架构,因此能提供更高级别的 高可用性。NDB 存储引擎的特点是数据全部放在内存中(从 5.1 版本开始,可以将非索引数 据放在磁盘上),因此主键查找(primary key lookups)的速度极快,并且能够在线添加 NDB 数据存储节点(data node)以便线性地提高数据库性能。由此可见,NDB 存储引擎是高可用、 高性能、高可扩展性的数据库集群系统,其面向的也是 OLTP 的数据库应用类型。 14 15 #Memory 存储引擎 16 正如其名,Memory 存储引擎中的数据都存放在内存中,数据库重 启或发生崩溃,表中的数据都将消失。它非常适合于存储 OLTP 数据库应用中临时数据的临时表,也可以作为 OLAP 数据库应用中数据仓库的维度表。Memory 存储引擎默认使用哈希 索引,而不是通常熟悉的 B+ 树索引。 17 18 #Infobright 存储引擎 19 第三方的存储引擎。其特点是存储是按照列而非行的,因此非常 适合 OLAP 的数据库应用。其官方网站是 http://www.infobright.org/,上面有不少成功的数据 仓库案例可供分析。 20 21 #NTSE 存储引擎 22 网易公司开发的面向其内部使用的存储引擎。目前的版本不支持事务, 但提供压缩、行级缓存等特性,不久的将来会实现面向内存的事务支持。 23 24 #BLACKHOLE 25 黑洞存储引擎,可以应用于主备复制中的分发主库。 26 27 MySQL 数据库还有很多其他存储引擎,上述只是列举了最为常用的一些引擎。如果 你喜欢,完全可以编写专属于自己的引擎,这就是开源赋予我们的能力,也是开源的魅 力所在。
三:使用存储引擎
建表时指定:
MariaDB [db1]> create table innodb_t1(id int,name char)engine=innodb; MariaDB [db1]> create table innodb_t2(id int)engine=innodb; MariaDB [db1]> show create table innodb_t1; MariaDB [db1]> show create table innodb_t2;
方法2:在配置文件中指定默认的存储引擎
/etc/my.cnf [mysqld] default-storage-engine=INNODB innodb_file_per_table=1
查看
[[email protected] db1]# cd /var/lib/mysql/db1/ [[email protected] db1]# ls db.opt innodb_t1.frm innodb_t1.ibd innodb_t2.frm innodb_t2.ibd
练习
创建四个表,分别使用innodb,myisam,memory,blackhole存储引擎,进行插入数据测试
MariaDB [db1]> create table t1(id int)engine=innodb; MariaDB [db1]> create table t2(id int)engine=myisam; MariaDB [db1]> create table t3(id int)engine=memory; MariaDB [db1]> create table t4(id int)engine=blackhole; MariaDB [db1]> quit [[email protected] db1]# ls /var/lib/mysql/db1/ #发现后两种存储引擎只有表结构,无数据 db.opt t1.frm t1.ibd t2.MYD t2.MYI t2.frm t3.frm t4.frm #memory,在重启mysql或者重启机器后,表内数据清空 #blackhole,往表内插入任何数据,都相当于丢入黑洞,表内永远不存记录
表相当于文件,表中的一条记录就相当于文件的一行内容,表中的一条记录由对应的标题,称为表的字段
id,name,称为字段,其余的一行内容称之为一条记录
创建表:
create table 表名(字段名1 类型[(宽度) 约束条件],字段名2 类型[(宽度) 约束条件],)
在同一张表中,字段名是不能相同
宽度和约束条件可选
字段名和类型是必须的
查看表结构:describe t1;查看表结构,可简写为desc 表名
mysql常用数据类型概览
1.数字1
整型:tinyint int bigint
小数:float:在位数比较短的情况下不精准
double:在为数比较长的情况下不准
decimal:(如果使用小数,推荐使用decimal)
精准
内部原理是以字符串形式去存
字符串:
char(10):简单粗暴,浪费空间,存取速度快
varchar:精准,节省空间,存取速度慢
sql优化:创建表时,定长的类型往前放,变长的往后放
255个字符,超了就把文件路径存放到数据库中
时间类型:最常用datetime
枚举类型与集合类型
为整数类型指定宽度时,仅仅只是指定查询结果的显示宽度,与存储范围无关,
int的存储宽度是4个Bytes,即32个bit
整形类型没有必要显示宽度,使用默认就行
在实际应用的很多场景中,MySQL的这两种日期类型都能够满足我们的需要,存储精度都为秒,但在某些情况下,会展现出他们各自的优劣。下面就来总结一下两种日期类型的区别。 1.DATETIME的日期范围是1001——9999年,TIMESTAMP的时间范围是1970——2038年。 2.DATETIME存储时间与时区无关,TIMESTAMP存储时间与时区有关,显示的值也依赖于时区。在mysql服务器,操作系统以及客户端连接都有时区的设置。 3.DATETIME使用8字节的存储空间,TIMESTAMP的存储空间为4字节。因此,TIMESTAMP比DATETIME的空间利用率更高。 4.DATETIME的默认值为null;TIMESTAMP的字段默认不为空(not null),默认值为当前时间(CURRENT_TIMESTAMP),如果不做特殊处理,并且update语句中没有指定该列的更新值,则默认更新为当前时间。
char和varchar括号内的参数指的都是字符的长度
char类型:定长,简单粗暴,浪费空间,存取速度快
字符长度范围:0-255(一个中文是一个字符,是utf-8编码的三个字节)
存储:存储char类型的值时,会往右填充空格来满足长度
检索:查询时会自动删除末尾空格
varcahr类型:变长,精准,节省空间,,存取速度慢
字符长度范围:0-65535
存储:varchar类型存储数据的真实内容,不会用空格填充
检索:尾部有空格时会保存下来,在检索或者说查询时,也会正常显示包含空格在内的内容
InnoDB存储引擎:建议使用VARCHAR类型
单从数据类型的实现机制去考虑,char数据类型的处理速度更快,有时甚至可以超出varchar处理速度的50%
但对于InnoDB数据表,内部的行存储格式没有区分固定长度和可变长度列(所有数据行都使用指向数据列值的头指针),
因此在本质上,使用固定长度的CHAR列不一定比使用可变长度VARCHAR列性能要好。因而,主要的性能因素是数据行使用的存储总量。
由于CHAR平均占用的空间多于VARCHAR,因此使用VARCHAR来最小化需要处理的数据行的存储总量和磁盘I/O是比较好的。
其他字符串系列:(效率:char>varchar>text)
TEXT系列 TINYTEXT,TEXT,MEDIUMTEXT,LONGTEXT
BLOB系列 : TINYBLOB BLOB MEDIUMBLOB LONGBLOB
BINARY 系列: BINARY VARBINARY
text:text数据类型用于保存变长的大字符串
枚举类型与集合类型:
字段的值只能在给定范围中选择,如单选框,多选框
enum单选 只能在给定的范围内选一个值
set 多选 在给定的范围内可以选择一个或一个以上的值
约束条件与数据类型的宽度一样,都是可选参数
作用:用于保证数据的完整性和一致性
主要分为:
primary key(pk) 标识该字段为该表的主键,可以唯一的标识记录
foreign key(fk) 标识该字段为该表的外键
not null 标识该字段不能为空
unique key(uk) 标识该字段的值是唯一的
auto_increment 标识该字段的值自动增长(整数类型,而且为主键)
default 为该字段设置默认值
unsigned 无符号
zerofill 使用0填充
1.是否允许为空,默认为null,可设置为not null,字段不允许为空,必须赋值
2.字段是否有默认值,缺省的默认值是null,如果插入记录时不给字段赋值,此字段使用默认值
3.是否是key
主键 primary key
外键 foreign key
索引 (index,unique)
null表示空,非字符串
not null 不可空
null 可空
默认值,创建列时可以指定默认值,当插入数据时如果未主动设置,则会自动添加默认值
从约束角度看primary key字段的值不为空且唯一,主键primary key是innodb存储引擎组织数据的依据,innodb称之为索引组织表,一张表中必须有且只有一个主键
一个表中可以:单列做主键 多列做主键(符合主键)
auto_increment:约束字段为自动增长,被约束的字段必须同时被key约束
如何找出两张表之间的关系
1.先站在左表的角度去找:
是否左表的多条记录可以对应右表的一条记录,如果是则证明左表的一个字段foreign key右表的一个字段(通常是id)
2.在站在右表的角度去找
是否右表的多条记录可以对应左表的一条记录,如果是则证明右表的一个字段foreign key左表的一个字段(通常是id)
如果只有步骤一成立,则是左表多对一右表
如果只有步骤二成立,则是右表多对一左表
如果步骤一和二同时成立,则证明这两张表是一个双向的多对一,即多对多,需要定义一个这两张表的关系来专门存放二者的关系
如多1和2都不成立,则是左表的一条记录对应右表的一条记录,反之亦然,这种情况很简单,就是在左表foreign key右表的基础上,将左表的外键字段设置成unique即可
修改表:
1.修改表名:alter table 表名 rename 新表名
2.增加字段 alter table 表名 add 字段名 数据类型[完整性约束条件];
3.删除字段 alter table 表名 drop 字段名;
4.修改字段 alter table 表名 modify 字段名 数据类型[完整性约束条件];
alter table 表名 change 旧字段名 新字段名 旧数据类型[完整性约束条件];
alter table 表名 change 旧字段名 新字段名 就数据类型[完整性约束条件];
删除表
drop table 表名;
以上是关于库相关操作的主要内容,如果未能解决你的问题,请参考以下文章