库相关操作

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 数据库还有很多其他存储引擎,上述只是列举了最为常用的一些引擎。如果 你喜欢,完全可以编写专属于自己的引擎,这就是开源赋予我们的能力,也是开源的魅 力所在。
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 表名;

以上是关于库相关操作的主要内容,如果未能解决你的问题,请参考以下文章

Chrome-Devtools代码片段中的多个JS库

Xamarin Android 片段库

防止导航到同一个片段

视图或片段库为常见数据类型组成 UI

滑动 ViewPager 时如何清除片段相关状态

ActionBar Sherlock ,操作栏选项卡和片段