zoukankan      html  css  js  c++  java
  • 库相关操作

    系统数据库

    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

    查看

    [root@egon db1]# cd /var/lib/mysql/db1/
    [root@egon db1]# ls
    db.opt  innodb_t1.frm  innodb_t1.ibd  innodb_t2.frm  innodb_t2.ibd

    sql_mode:反映数据库的全局变量

    数据库模式限制的是客户端对服务器操作数据的方式(是否严格)

    查看当前数据库模式:

    show variable like "%sql_mode%";#%匹配0-n个任意字符=>模糊查询

    设置为安全模式

    set global sql_mode="strict_trans_tables";

    重启连接(客户端)

    quit

    练习

    创建四个表,分别使用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
    [root@egon 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一字节-128-127smallint 两字节mediumint:三字节 int 四字节-2147483648-2147483647 bigint八字节

    小数:float:在位数比较短的情况下不精准 四字节(255,30)精度最低最常用

    double:在为数比较长的情况下不准八字节 (255,30) 精度高,占位多

    decimal:(如果使用小数,推荐使用decimal)(65,30)字符串存,全精度
    精准

    内部原理是以字符串形式去存

    字符串:

    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 表名;

  • 相关阅读:
    自定义TextInput中displayAsPassword的字符
    C#序列化与反序列化代码记录
    解决Discuz!NT"Code: 100, Message: 指定..."问题
    如何在asp.net项目开发的验证码图片和打印中区别0和O(零和字母O)
    "淘宝开放平台"可以成为程序员的摇钱树吗?
    Discuz!NT与asp.net整合集成实例教程
    最震撼的大片《2012》世界末日 电影 高画质 超DVD版清晰效果 在线视频播
    划时代的感人大片!《机器人总动员》(WALL.E) 在线播放
    从数据库某表转换并导入数据到另一表
    界面原型设计工具选择报告
  • 原文地址:https://www.cnblogs.com/suncunxu/p/10235008.html
Copyright © 2011-2022 走看看