1、MySQL服务器的SQL模式

  • 由系统变量sql_mode控制。

  • sql模式对sql语句的执行情况有多方面的影响。(例如:如何处理非法数据,如何引用标识符等)

  • 可以设置全局和用户会话范围。

几种可能的sql模式设置值

  • STRICT_ALL_TABLES和STRICT_TRANS_TABLES将启用严格模式。在严格模式下,MySQL服务器在接收“坏”数据值时更加严格。(具体地说,它将拒绝“坏”数据值,而不是将它们转换为最接近的合法值)  STRICT_TRANS_TABLES如果不能将给定的值插入到事务表中,则放弃该语句。对于非事务表,如果值出现在单行语句或多行语句的第1行,则放弃该语句。本节后面给出了更详细的描述。

  • TRADITIONAL是另外一种复合模式。它类似于严格模式,但启用了其它几种引入额外限制条件的模式以进行更加严格的数据检查。TRADITIONAL模式将导致MySQL服务器在处理“坏”数据时跟接近传统SQL服务器。该模式的简单描述是当在列中插入不正确的值时“给出错误而不是警告”。释:一旦发现错误立即放弃INSERT/UPDATE。如果你使用非事务存储引擎,这种方式不是你想要的,因为出现错误前进行的数据更改不会“滚动”,结果是更新“只进行了一部分”。

  • ANSI_QUOTES将‘"’视为识别符引号(‘`’引号字符),不要视为字符串的引号字符。在ANSI模式,你可以仍然使用‘`’来引用识别符。启用ANSI_QUOTES后,你不能用双引号来引用字符串,因为它被解释为识别符。

  • PIPES_AS_CONCAT将||视为字符串连接操作符(+)(同CONCAT()),而不视为OR。

  • ANSI等同REAL_AS_FLOAT、PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE。其结果是让MySQL服务器的行为比它的默认运行状态更接近标准SQL。

设置值时,可以设置单个,也可以逗号连接,也可以用“”表示清除。设置方式:

  • mysqld 命令行

--sql-mode="TRADITIONAL"

--sql-mode="ANSI_QUOTES,PIPES_AS_CONCAT"

  • 选项文件

  • 运行时用SET设置

会话:SET sql_mode="TRADITIONAL"

全局:SET GLOBAL sql_mode="TRADITIONAL"

查询:select @@global.sql_mode;  select @@session.sql_mode;

2、SQL语句中的字母大小写问题

不区分:

SQL关键字,函数名,数据列,索引,储存函数,储存过程,事件,触发器,列别名。

区分:

分情况:

数据库,数据表,表别名,视图,在Windows,MacOs X的HFS+文件系统不区分,Unix,Mac OS X的UFS区分;

字符串值取决于是否区分取决于它是二进制还是非二进制。

注释:

(1)尽管在某些平台中数据库名和表名对大小写不敏感,不应在同一查询中使用不同的大小写来引用给定的数据库或表。下面的查询不会工作,因为它同时引用了表my_tables和as MY_tables:

SELECT * FROM my_table WHERE MY_TABLE.col=1;

(2)为了避免数据库名和数据表在区分和不区分大小写的系统中迁移出现的问题,最好采用一致的转换。例如总是用小写。

3、字符集支持

  • MySQL允许对服务器,数据库,数据表,数据列或字符串常量级别的字符集作出互不影响的设定。

①服务器有一个默认的字符集;

②create database和alter database用来设定和修改数据库字符集;

③create table和enable table有专门用来设定表级和数据列级的字符集的字句;

④ 用于字符串常数的字符集可以根据上下文设定,也可以明确设定。

  • 一种给定的字符集可以有一种或多种排序方式。

  • 有用来判断、转换数据集字符集的函数和操作符。COLLATE()和COLLATE操作符可以用来查询和改变某个字符串的排序方式。

  • show语句和information_schema数据表提供了关于可用字符集和排序方式的信息。

  • 当你改变带索引的数据列时,MySQL服务器会自动地对索引进行重新排序。

  • 同一字符串不能混用不同的字符集,同一列不能在不同的数据行使用不同的字符集。不过,可以选用一种Unicode字符集(用单一编码方案表示多语言的字符)去实现多语言支持。

3.1 字符集的设定。

  • 服务器的默认字符集和排序方式是在编译时内建的,可以在启动服务器时使用--character-set-server和--collation-server选项,或者在服务器启动后设置character_set_server和collation_server系统变量

  • 如果选定了一种排序方式,必须让它与字符集保持兼容。(排序方式的开头是字符集的名字,比如排序方式:utf8_general_ci,字符集:utf8)

  • 创建数据库和数据表的SQL语句里,有两个字句专门设置数据库,数据表,数据列的字符集和排序方式:

    • CHARACTER SET charset

    • COLLATE collation

CHARSET 可以用作CHARACTER SET的同义词。这两个字句可以同时和分开使用。同时使用要保持两者兼容,只设置字符集,则使用默认排序方式,只设置排序方式,           则使用排序方式开头的字符集。这些字句按照以下方式使用

  • create database db_name CHARACTER SET charset COLLATE collation;

  • create table table_name (...) CHARACTER SET charset COLLATE collation;

  • colume_name CHAR(10) CHARACTER SET charset COLLATE collation;  适用于CHAR, VARCHAR(), TEXT(), ENUM, SET

如果没有设定,则继承上一级别的设置。

对字符串:

select c from t order by c COLLATE latin1_swedish_ci;

3.2 确定可供选择的字符集和当前设置

查询可供选择的字符集和排序方式:

SHOW CHARACTER SET;

SHOW COLLATION;

查询当前使用的字符集和排序方式,可以用show variables语句

3.3 数据表的增删改查

3.3.1存储引擎

查询存储引擎

show engines;

select * from information_schema.engines;

3.3.2 数据表在硬盘上的储存方式

会在mysql数据目录里与数据库名称对应的子目录里创建一个table_name.frm文件。frm文件的内容是不变的,无论哪个存储引擎,每个数据表只有一个相应的frm文件。

几种存储引擎为特定的数据表创建的文件的扩展名。

对于某些存储引擎而言,存储引擎是与某特定数据表相关联的唯一文件。其他存储引擎会把数据表的内容保存到硬盘的其它地方。或者使用一个或多个表空间(tablespace,由多个数据表所共享的存储区域),如下所示。

  • MEMORY数据表存放在内存里,不占用任何硬盘空间。

  • 默认情况下,InnoDB会把数据表里的数据和索引存储在它的共享表空间里。也就是说,所有InnoDB数据表的内容都存储在一个共享表空间里。而不是与某个特定的数据表相关联的文件里。InnoDB只在你特意配置它为每个数据表分别创建一个表空间时才会去创建.idb文件。

  • Falcon引擎把数据表的数据和索引保存在表空间文件里。有一个默认的Falcon表空间,但你也可以根据需要创建其它的表空间。这些表空间的任何一个都可以容纳多个数据表的内容。

  • BLACKHOLE和EXAMPLE实际上不储存任何数据,所以它们不需要创建任何文件

  • FEDERATED用于访问某远程MySQL服务器上的数据表,它本身不创建任何文件。

接下来介绍几种储存引擎

  • MyISAM

MyISAM储存引擎是MySQL默认的储存引擎。它的功能:

  • MyISAM储存引擎提供了键压缩功能。它采用某种压缩算法来保存连续的,相似的字符串索引值。还可以压缩相似的数值索引值。要激活数值压缩功能,创建MyISAM数据表时使用PACK_KEYS=1选项。

  • 与其它储存引擎相比,为auto_increment数据列提供了更多的功能。

  • 每个MyISAM表都有一个标志,服务器或myisamchk程序在检查MyISAM数据表时会对这个标志进行设置。MyISAM数据表还有一个标志来表明改数据表在使用完之后是不是被正常地关闭了。如果服务器意外宕机或者机器崩溃,这个标志可以用来判断是否需要检查和修复。如果你想让这种检查自动进行,需要再启动服务器时使用--myisam-recover选项。这回让服务器每次打开一个MyISAM数据表时会自动检查该数据表的标志并进行必要的数据表修复处理。

  • MyISAM储存引擎支持全文检索,但需要通过FULLTEXT索引来实现。

  • MyISAM支持空间数据类型和SPATIAL索引。

  • MERGE

MERGE数据表提供了一种吧多个MyISAM数据表合并为一个逻辑单元的手段。查询一个MERGE数据表相当于查询其所有成员数据表。这样做的好处之一是可以绕过文件系统对各个MyISAM数据表的最大长度的限制。

用来构成MERGE数据表的所有数据表必须有同样的结构。这就意味着必须为各个成员数据表里的数据列定义同样的名字,同样的类型和同样的顺序,索引也必须按同样的方法同样的顺序定义。我们可把经过压缩和未经过压缩的数据表混杂在一起而构成一个数据表(myisamchk可以用来自动创建压缩表)。

另外,分区数据表可以作为除MERGE数据表以外的另一种选择,而其成员不限于MyISAM数据表。

  • MEMORY

MEMORY存储引擎把数据表保存在内存里,这些数据表有着长度固定不变的数据行,这两个特点使得数据表的检索速度非常之快。

从某种意义上来看,MEMORY数据表时临时性的。当服务器掉电时,数据表的内容也就消失了。重启后表存在但是内容是空的。MEMORY数据表的另一个特点是对其它客户来说是可见的,这与create  temporary table语句创建出来的临时表形成了对照。

MEMORY数据表的以下特点使得比其它类型的数据表更容易处理,所以检索速度非常快。

  • 默认情况下,MEMORY数据表使用散列索引,利用这种所以进行“相等比较”的速度非常快,但进行“范围查询”的速度就慢多了。因此,散列索引只适合用在使用“=”和“<=>”操作符进行的比较操作里,不适合用在“>”或“<”操作符进行的比较里。出于同样的考虑,散列索引也适合用在ORDER BY字句里。

  • 储存在MEMORY数据表里的数据行使用的是长度固定不变的格式,以此加快处理速度,这意味着你不能使用TEXT和BLOB这样的长度可变的数据类型。VARCHAR是一种长度可边的数据类型,当因为它在MySQL内部被当做一种长度不变的CHAR类型,所以你可以再MEMORY数据表里使用VARCHAR类型。

如果确实需要使用MEMORY数据表和“>”、“<”或BETWEEN操作符进行某种比较以判断某个值是否落在某个范围内,可以使用BTREE索引来加快速度。

  • InnoDB

InnoDB存储引擎有以下几个功能:

  • 支持提交和回滚操作,确保数据在事务处理中万无一失。还可以通过创建保存点(savepoint)的办法来实现部分回滚(partial rollback)。

  • 在系统崩溃后可以自动恢复。

  • 外键和引用完整性支持,包括递归式删除和更新。

  • 数据行级别的锁定和多版本共存,这使得InnoDB数据表在需要同时进行检索和更新操作的复杂查询里表现出非常好的并发性能。

  • 在默认情况下,InnoDB存储引擎会把数据表集中存储在一个共享的表空间里,而不是像大多数其它的存储引擎一样为不同的数据表创建不同的文件。InnoDB表空间可以由多个文件组成,还可以包括多个原始分区。实际上,InnoDB表空间就像一个虚拟的文件系统,它存储并管理InnoDB数据表的所有内容。这样一来,数据表的长度就可以超过文件系统对各个文件的最大长度的限制。你也可以吧InnoDB存储引擎设置成会为各个数据表分别创建一个表空间的样子,此时,每个数据表它的数据库子目录里都有一个对应的.ibd文件。

  • Falcon

Falcon存储引擎从MySQL6.0才有,具备以下特点

  • 支持提交和回滚操作,确保数据在事务处理中万无一失。还可以通过创建保存点(savepoint)的办法来实现部分回滚(partial rollback)。

  • 在系统崩溃后可以自动恢复。

  • 数据行级别的锁定和多版本共存,这使得InnoDB数据表在需要同时进行检索和更新操作的复杂查询里表现出非常好的并发性能。

  • 在存储时对数据进行压缩,在检索时对数据进行解压缩以节省空间。

  • 日常管理和维护方面的开销低。

  • FEDREATED

FEDREATED的用途是访问其他MySQL服务器管理下的数据表。换句话说,FEDREATED数据表的内容不是存放在本机里的。当你创建一个FEDREATED数据表时,需要制定一台运行着的其它服务器程序的主机,并提供那台服务器的合法账户的用户名和口令。当你打算访问FEDREATED数据表时,本地服务器将使用这个账户连接远程服务器。

  • NDB

NDB是MySQL的集群存储引擎。在这个存储引擎工作时, MySQL的工作时帮助其它进程访问NDB数据表,从整个集群的高度看,其行为像是一个客户。各集群节点上的进程通过彼此通信来管理内存中的数据表。为了减少冗余,数据表在集群进程中被复制。内存存储提供了高性能,集群机制提供了高可用,即使个别节点发生崩溃,系统也不会崩溃。

  • 其它存储引擎

    • ARCHIVE存储引擎对数据进行归档。它最适合用来保存那些“写了就不改”的数据行。因此,它只支持几天很有限的SQL语句。INSERT和SELECT语句没有问题,但REPLACE语句的行为却永远像是INSERT语句,而DELETE和UPDATE语句根本不能用。为了节省空间,再存储时会对数据行进行压缩,在检索时再对它们进行解压缩。在MySQL5.1.6之前的版本里,ARCHIVE存储引擎根本不支持索引;即使是在MySQL5.1.6之后的版本里,每个ARCHIVE数据表只能有一个带索引的auto_increment数据列;其它的数据列还是不能带索引。

    • BLACKHOLE存储引擎创建的数据表有这样的行为特性:写操作其实是在删除数据,而读操作是返回空目录。

    • CSV存储引擎在存储数据时以逗号作为数据项之间的分隔符。它会再数据库子目录里为每个数据表创建一个.CSV文件。这是一个普通的文本文件,每个数据行占用一个文本行。CSV存储引擎不支持索引。

    • EXAMPLE存储引擎是用来演示如何编写存储引擎的最小化样板。它的存在价值在于让开发人员通过查看其源码去学习怎样才能把存储引擎正确地加载到服务器里。

3.3.3 存储引擎的可移植性

一般意义的可移植性:mysqldump工具备份数据,放到另一台服务器注解,加载备份文件。

二进制可移植性:直接复制数据表的硬盘文件至另一台服务器响应的数据子目录下就可以直接使用。

各存储引擎的二进制可以执行总结

  • MyISAM和InnoDB数据表的存储格式与机器无关,它们具备二进制可移植性--前提条件:处理器使用的是二进制补码整数算法和IEEE浮点(FLOAT,DOUBLE类型,不包括DECIMAL类型,因为它的小数点的位置是固定的)格式,一般都是。InnoDB要一致数据库和数据表的名字应该小写,因为InnoDB存储引擎在其数据字典里把这些名字统一保存为小写,但.frm文件里的名字的字母确实创建语句里指定的大小写。

  • MERGE数据表的可移植性取决于其成员的MyISAM数据表,只要那些MyISAM数据表是可移植的,MERGE数据表就是可移植的。

  • MEMORY数据表不具备可移植性,因为它们的内容都存储在内存上而不是硬盘里。

  • CSV数据表时二进制可移植的,因为.CSV文件本质上是普通的文本文件。

  • BLACKHOLE数据表时二进制可移植的,因为它们根本不包含任何内容。

  • 对应FEDERATED存储引擎,可移植性概念与之无关,因为FEDERATED数据表的内容都存储在另一个服务器上。

  • Falcon日志和表空间文件的存储格式与机器有关,它们只在两台机器的硬件特性完全相同时菜是二进制可移植的。比如说,不能把一台低字节优先的机器里的Falcon文件一直到一台高字节优先的机器。

不要再服务器关闭后吧数据表和表空间文件赋值到另一台机器上,因为如果服务器意外关闭,数据完整性无法保障,还可能事务信息扔保存在存储引擎的日志里,必须等它被提交或回滚后才能更新数据表。

3.3.4 创建表

(1)数据表选项

指定存储引擎:

create table table_name(...) engine = engine_name;

不区分大小写。

如果一条create table语句里给出了一个服务器能够支持但是此时不能使用的存储引擎的名字,MySQL将使用默认的存储引擎去创建那个数据表并说呢过程一套警告信息。

如果给出的存储引擎是不支持的,直接报错。

(2)临时数据表

create temporary table table_name...;

  • 服务器会在会话结束时自动删除temporary数据表,当然也可以在用完后显式删除。

  • 一个temporary数据表只对改数据表的客户是可见的。

  • 一个temporary数据表允许与一个现有的永久性数据表名字相同,此时只能访问到temporary表,永久性的表会隐藏起来,无法访问到。如果临时表改名或者被删除,可以访问到永久表。

(3)从其它数据表或查询结果创建数据表

  • create table new_table_name like table_name;

    • 创建一个空白副本

    • 数据列结构,属性,索引一致

    • 数据列必须与原始表保持一致

    • 要想填充数据,可以使用:insert into new_table_name select * from table_name;

  • create table ... select

    • 不会复制数据列属性和索引

    • 有填充数据

    • 可以自己指定所要创建的列

    • 保存下来是NULL还是NOT NULL,默认值,字符集和排序方式,注释。

  • 可以使用CAST()函数强制使数据列具有特定属性。允许的投射类型是signed,signed integer,unsigned,unsigned integer decimal,binary,char,date,datetime,time

  • 还可以再create table 部分提供明确的数据列定义,然后在select部分使用那些定义去检索数据列。两个部分你的数据列按名字匹配,所以在select部分往往需要提供一些必须的别名才能让他们正确地得到匹配。

(4)使用MERGE数据表

除了便于查询外,MERGE数据表还可以提供一下便利。

  • MERGE数据表可以用来创建一个尺寸超过各个MyISAM数据表所允许的最大长度的逻辑单元。

  • 你可以把经过压缩的数据包括在MERGE数据表里。(比如用myisampack工具)。

  • 支持insert, update, delete操作。

  • 数据表定义里insert_method选择可取no,first, last,分别代表insert是被禁止,插入第一个表还是最后一个表。

  • merge表新增表在union中新增即可

(5)使用分区数据表

分区数据表与merge数据表相似,它们之间的区别:

  • 分区表是真实数据表,MERGE数据表时逻辑数据表。

  • 分区数据表可以使用MyISAM以外的存储引擎,而MERGE表只能用MyISAM数据表来构成。

分区数据表的优点:

  • 分布式储存,可以通过建立某种I/O并行机制缩短访问时间。

  • 优化器可以把检索操作限定在某个特定的分区或是同时搜索多个分区。

步骤:建表->partition by字句定义把数据行分配到各个分区的分区函数->写出其它必须的分区选项。

分区函数与建立MERGE数据表使用的INSERT_METHOD,但是它更通用:它可以把数据行插入所有分区,而INSERT_METHOD选项只能把所有的新数据行插入一张表。

分区函数分配数据行的依据可以是取值范围、值的列表、或散列值。

  • 取值范围

数据行所包含的值可以划分为一系列互不冲突的区间,比如日期、收入水平、重量等。

  • 数据列表

分隔分区分别对应一个明确值的列表,比如邮政编码表、电话区号,身份证号中的地区编号等。

  • 散列值

根据数据行的键字计算出一个散列值,再根据这个散列值把数据行分布到各分区。你可以自行提供一个散列函数,也可以列出一组数据列让MySQL使用一个内建的散列函数去计算那些数据列的散列值。

更新分期:

分区数据默认再数据库子目录下,要想将存储分配到其它位置,需要使用DATA_DIRECTORY和INDEX_DIRECTORY分区选项。

3.3.5 为数据表编制索引

(1)储存引擎的索引特性

MERGE数据表与MyISAM数据表有相似的索引特性。它没有包括ARCHIVE、BLACKHOLE、CSV、EXAMPLE引擎,它们或者根本不支持索引,或者支持很有限。

(2)创建索引

索引类型

  • 唯一索引。这种索引不允许索引项本身出现重复值。对于单列索引,改列值唯一,对于复合索引,数据列值的组合唯一。

  • 普通(非唯一)索引。允许索引项出现重复值

  • FULLTEXT索引。用来进行全文检索。这种索引只适用于MyISAM数据表。

  • SPATIAL索引。适用于MyISAM数据表和空间数据类型。

  • HASH索引。这是MEMORY数据表的默认索引类型,可以改用BTREE索引来代替。

可以使用create table语句创建索引,使用alter table或create index语句给现有的数据表添加索引。(MySQL会在内部把create index语句映射为alter table语句)。

create table table_name

(

...column definitions...

primary key(index_columns),-- 可放在列的末尾定义

unique index_name(index_columns),-- 可放在列的末尾定义

index index_name(index_columns),

spatial index_name(index_columns),

fulltext index_name(index_columns)

)

alter index 比 create index语句更灵活多能,可以创建任何索引。比如:

alter table table_name add index primary key(index_columns);

alter table table_name add unique index_name(index_columns);

alter table table_name add index index_name(index_columns);

alter table table_name add spatial index_name(index_columns);

alter table table_name add fulltext index_name(index_columns);

create table 和 alter table 里的index_name是可选的,如果没有指定,MySQL将会跟第一个带索引的数据列给它挑选一个名字。

如果某个索引是一个primary key 或 spatial索引,索引列必须非空,其它类型索引的数据列可以为空。

除了primary key,其它类型的索引几乎都可以用create index语句来添加:

create unique  index index_name on table_name (index_columns);

create index index_name on table_name (index_columns);

create spatial index index_name on table_name (index_columns);

create fulltext  index index_name on table_name (index_columns);

这里的index_name是必选的。

MEMORY数据表默认的索引类型是HASH,在进行精确值查找时非常快,但是进行范围查找效果不好,此时可以创建BTREE索引来代替之。具体做法在索引定义里增加一条USING BTEE字句:

create table table_name(

id int not null,

name char(100),

index using btree (id)

) engine = memory;

建立字符串数据列的前缀编索引命名数据列的语法是col_name(n)。n代表数据列值的前n个字节(二进制字符串)或前n个字符(非二进制字符串)。

create table addresslist

(

name char(30) not null,

address binary(60) not null,

index (name(10)),

index(address(15))

);

前缀计量单位,二进制字符串以字节为单位,非二进制字符串以字符为单位。不过,索引项本身的最大长度在MySQL内部以字节为单位。

以下情况必须使用前缀索引:

  • BLOB和TEXT数据列只能创建前缀型索引。

  • 索引项本身的长度等于构成索引的各个数据列的索引部分的长度总和。如果长度超过了索引项本身所能容纳的最大字节数,可以通过为数据列前缀编索引来“缩短”这个索引。

FULLTEXT所涉及的列时全部带索引的,MySQL会忽略设置的前缀。

可以像下面这样为空间数据类型的数据列(入POINT或GEOMETRY)编索引:

  • SPATIAL索引只能用于MyISAM数据表,只能用于NOT NULL 属性的数据列。所涉及的列时全部带索引的。

  • 其它索引类型(PRIMARY KEY,UNIQUE, INDEX)可以配合除ARCHIVE以外支持空间数据类型的任何存储引擎使用。出POINT数据列以外,索引所涉及的空间数据列以字节计算的前缀长度必须在创建索引时给出。

(3)删除索引

使用drop index 和 alter table语句来完成。

drop index 要给出索引的名字。

drop index index_name on table_name;

如果drop index 要删除一个primary key, 就必须以一个带印好的标识符的形式给出名字primary, 如下所示:

drop index `primary` on table_name;

drop index 与add index一样,内部转换为alter table语句,使用alter table删除索引:

alter table table_name drop index index_name;

alter table table_name drop primary key;

查询索引:show create table ,或 show index from table_name

3.3.6 获取数据库的元数据

获取数据库元数据的集中办法:

  • show语句;

  • information_schema数据库里的数据表;

  • 命令行工具,入mysqlshow 或 mysqldump。

(1)show语句

show语句典型用法:

查询数据库:

show  databases;

查询建库信息:

show  create database db_name;

查询默认数据库或给定数据库的表(不包含temporary表):

show tables;

show tables from db_name;

查询建表信息:

show create table table_name;

查询表的列或索引信息:

show columns from table_name;(desc table_name; describe table_name; explain table_name)

show index from table_name;

查看默认数据库或给定数据库的表的描述性信息:

show table status;

show table status from db_name;

(2)information_schema数据库里的数据表;

相比于show的有点

①可以灵活选择列;

②可以使用联结

③可以使用create table ... select 或 insert into ... select将查询的结果保存到另一张数据表中去。

所包含的表:

对各个表做一个简要说明:

  • schema、tables、views、routines、triggers、events、partitions、columns。表示数据库、数据表、视图、存储程序、触发器、数据库里的世界、数据表的分期、数据表的列

  • files。关于NDB硬盘数据文件的信息。

  • table_constrains、key_column_usage。关于数据表和数据列上的约束条件信息,比如外键、唯一化索引等。

  • statistics。关于数据表索引特性的信息。

  • referential_constrains。关于外键的信息。

  • character_sets、collations、collation_character_set_applicability。关于所支持的字符集、每种字符集的排序方式、每种排序方式和与它字符集的映射关系。

  • engines、plugins。关于存储引擎和服务器插件的信息。

  • user_privileges、schema_privileges、table_privileges、column_privileges。全局、数据库、数据表、数据列的权限信息。这些信息分别来自mysql库的user、db、tables_priv、column_priv数据表。

  • global_variables、session_variables、global_status、session_status。全局和会话级系统变量和状态变量的值。

  • processlist。关于在服务器内执行的线程的信息。

各个存储引擎还会在information_schema数据库里增加他们专用的数据表。Falcon存储引擎就是如此(如果它们已被激活)。

(3)从命令行获取元数据

服务器所管理的数据库:

mysqlshow

查看某给定数据库的数据表信息:

mysqlshow db_name;

查看某给定数据表的数据列信息:

mysqlshow db_name table_name;

查看某给定数据表的索引信息:

mysqlshow --keys db_name table_name;

查看给定数据库里的数据表里的描述性信息:

mysqlshow --status db_name;

mysqldump可以查看建表语句(如果没加--no-data,看到的是数据表的数据)。

mysqldump --no-data db_name [table_name] ...

3.4 事务处理

3.4.1 利用事务来保证语句的安全执行  

MySQL默认是事务自动提交。

(1)开启/禁止事务自动提交

set autocommit=1;  -- 开启

set autocommit=0;  -- 禁止

(2)事务手动提交

start transaction;/begin;

statements;

commit;/rollback;

手动提交之后,会恢复到start transaction之前的状态。如果之前是自动提交,就回到自动提交。如果是手动提交,提交后就开启了下一个事务。

start transaction隐含提交上一个事务。

先禁用自动提交,再开启也将隐含提交一个事务。

综上:

1、set commit、start transaction、begin、commit、rollback都会对事务产生影响。

2、执行DDL和与锁定有关的语句之前都会提交事务。

3、客户连接退出将回滚事务,再次登录被置位自动提交。

3.4.2 事务的保存点

savepoint pointName;

3.4.3 事务的隔离性

多个事务并发时可能出现的问题:

  • 脏读

指某个事务所作出的修改在它尚未被提交时可以被其它事务看到。其它事务就会认为数据行已经被修改了,但对数据行所作出的修改的那个事务可能会回滚,这将导致数据库里的数据发生混乱。

客户端1:

客户端2:

客户端1:

  • 不可重复读

指同一个事务使用同一条select语句每次读取到的结果不一样。比如说,如果有一个事务执行了两次同一个select语句,但是另一个事务在这条select语句的两次执行之间修改了一些数据行,就会发生这种问题。

客户端1:

客户端2:

客户端1:

客户端2:

  • 幻读

指某个事务突然看到了一个她以前没有见过的数据行。比如说,如果某个事务刚执行完一条select语句就有另一个事务插入了新的数据行,前一个事务在执行同一条select语句时就可能多看到一个新的数据行,这就是幻读。

客户端1:

客户端2:

客户端1:

客户端2:

为此,InnoDB存储引擎提供了4种隔离级别,这些隔离级别用来确定允许某个事务看到与之同时执行的其它事务所做出的哪些修改。

  • 读未提交(read uncommited)

允许某个事务看到其它事务尚未提交的数据行改动。

  • 读已提交(read commited)

只允许某个事务看到其它事务已经提交的数据行改动。

  • 可重复读(repeatable read)

如果两个事务两次执行同一个select语句,其结果是可重复的。换句话说,即使有其它事务在同时插入或修改数据行,这个事务所看到的结果也是一样的。

  • 串行化(serialiazable)

这个隔离级别和可重复读很相似,但是对事务的隔离更彻底。某个事务正在查询的数据行不允许其它事务修改,直到该事务完成为止。换句话说,如果某个事务正在读取某些数据行,在它完成之前,其它事务将无法对那些数据行修改。

隔离级别所能解决的问题:

InnoDB存储引擎默认的隔离级别是可重复读。可以在启动服务器是使用--transaction-isolation或者在服务器运行时使用set transaction语句来改变。改语句有3中形式

set global transaction isolation level level_num;

set session transaction isolation level level_num;(作用于后续所有事务)

set transaction isolation level level_num;(super权限用户可以使用此语句设置全局隔离级别,作用于下一个事务)

level_num:READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE

3.5 使用FULLTEXT索引

全文搜索分为种模式:

  • 自然语言模式

把搜索字符串解释为一系列单词并查找包含这些单词的数据行。

  • 布尔模式

把搜索字符串解释为一系列单词,但允许用一些操作符来“修饰”这些单词以表明特定的要求,如果某给定单词必须出现(或不出现)在匹配的数据行里,某个数据行必须包含一个精确地短语,等等。

  • 查询扩展模式

这种搜索分为两阶段进行。第一阶段是自然语言搜索,第二阶段使用原来的搜索字符串加上第一次搜索中找到的相关度最好的匹配数据行再进行一次搜索。这也扩大了搜索范围,它可以把与原来的搜索字符串相关,但用原来的搜索字符串匹配不到的数据行也找出来。

要想对某个表进行全文搜索,必实现创建一个FULLTEXT索引,这个索引具有以下特点。

  • FULLTEXT索引只能在MyISAM数据表创建。只能由char、varchar、text这几个种数据类型列构成。

  • 全文搜索将忽略“常见的”单词,而“常见”在这里的含义是“至少在一半的数据行里出现过”。

  • 全文搜索会忽略以下常见的单词,如“the”、“after”、“other”等,这些单词被称为“休止单词”。

  • 太短的单词也将被忽略。默认为4个字符。

  • 全文搜索对“单词”的含义是:由字母,数组、下划线和撇号(it's)字符够成的字符序列。这就意味着“full-blood”将被解释为包含“full”和“blood”两个单词。全文搜索匹配整个单词,而不是单词的一部分。只要在一个数据行里找到了搜索字符串里的任何单词,FULLTEXT引擎就会认为和这个数据行与搜索字符串是匹配的。在此基础上,布尔式全文检索还允许你加上一些额外的要求。比如说,所有的单词必须出现(不论顺序)才认为是匹配,(在搜索一条短语时)单词顺序必须与在搜索字符串里列出的一致,等等。布尔搜索还可以用来匹配不包含特定单词的数据行,或者通过添加一个通配符来匹配以一个给定前缀开头的所有单词。

  • FULLTEXT索引可以为一个或多个数据列而创建。查询条件的组合和索引的组合个数保持一致(顺序不要求一致)。

示例:

apothegm.txt数据文件:

3.5.1 全文搜索:自然语言模式

用match操作符列出将要被搜索的数据列、用against()给出搜索字符串。如下所示:

where字句中使用match表达式时,自然语言模式的全文搜索的输出数据行按照相关程度递减的顺序排序。相关度以非负浮点数来表示,0表示“毫不相关”。要想查看这些值,在输出列清单里加上一个match表达式即可:

自然语言模式的搜索能够找到包含任何一个搜索单词的数据行:

自然语言模式是默认的全文搜索模式。可以在语句中加上in natural language mode来指定。

3.5.2 全文搜索:布尔模式

全文搜索的布尔模式可以让我们控制多单词搜索操作中的许多细节。要想进行这种模式的搜索,需要在against()函数里在搜索字符串后面加上in boolean mode短语。布尔模式的全文搜索有以下特点。

  • “50%”规则不再起作用,即使是在超过一半的数据行里出现过的单词也可以被这种搜索匹配出来。

  • 查询结果不再按照相关程度排行。

  • 在搜索一个短语时,你可以要求所有的单词必须按照某种特定的顺序出现。如果是搜索一个短信,需要把构成该短语的所有单词用双引号括起来;如果数据行包含的单词按照给定的顺序排序,才被认为是一个匹配。

  • 布尔模式的全文搜索还可以在没有被包括在FULLTEXT索引里的数据列上进行,但这要比搜索有FULLTEXT索引的数据列慢得多。

  • 布尔搜索可以给单词加上一些修饰符,比如“+”表示必含,“-”表示不含,“*”为通配符。

  • 布尔模式也将忽略休止单词

3.5.3 全文搜索:查询扩展模式

全文搜索的查询扩展模式将进行两个阶段的搜索。第一遍的搜索和普通的自然语言搜索一样,在这次搜索里找到的相关程度最高的数据行里的单词将会被用在第二阶。段。这些数据行里的单词加上原来那些搜索单词将被用来进行第二遍搜索。因为搜索单词的集合变大了,所以在最终结果里往往会多出一些在第一阶段没被找到、但与第一阶段的检索结果有一定关系的数据行。

用法,在搜索字符串后面加上:with query expansion

3.5.4 配置全文搜索引擎

系统变量或选项文件:

  • ft_min_word_len

FULLTEXT索引单词最小长度,默认4

  • ft_max_word_len

FULLTEXT索引单词最大长度,默认8

长度超过两个参数的范围的单词将被忽略。

加入吧最小单词长度设置为3

(1)把ft_min_word_len设置为3,重启服务器。如果要设置每次启动生效,防砸my.cnf文件里的[mysqld]选项组中。

(2)对于已经有FULLTEXT索引的数据表,要重新建立索引。可以先删除再重建。或者快速修复:repair table tbl_name quick;

使用SQL管理数据库相关推荐

  1. 1-2 通过SQL管理数据库文件

    1-2  通过SQL管理数据库文件 u      掌握数据库文件的类型,学习在管理平台下建立数据库文件和文件组 u      掌握数据库文件及日志文件的建立操纵语句 u      掌握对数据库文件的修 ...

  2. 《SQL Server企业级平台管理实践》读书笔记——关于SQL Server数据库的备份方式...

    数据备份一直被认为数据库的生命,也就是一个DBA所要掌握的主要技能之一,本篇就是介绍SQL Server备份原则,SQL Server数据库分为数据文件和日志文件.为了使得数据库能够恢复一致点,备份不 ...

  3. SQL Server2008数据库用户管理 (第三部分)

    3.1创建SQL Server数据库登录名 打开数据库管理器->安全性->登录名->右键选择新建登录名 1)Windows身份验证 选中Windows身份验证,点击搜索,在下面的提示 ...

  4. 了解SQL Server数据库静态数据及其如何适合数据库生命周期管理

    什么是静态数据 (What is static data) Static data (aka Code, Lookup, List or Reference data), in the context ...

  5. sql azure 语法_Azure Kubernetes服务(AKS)–管理SQL Server数据库文件

    sql azure 语法 In this article, we will review on managing database files of SQL Server running on Azu ...

  6. SQL 2008 -数据库的创建与管理

    SQL Server 2008数据库结构 系统数据库 master 记录了SQL Server系统的所有系统级信息的数据库 msdb 所有用户数据库和tempdb数据库的模板数据库 model 由SQ ...

  7. SQL Server数据库的管理及维护

    理论: 首先打开 SSMS(SQL server Management Studio) 使用SSMS可以实现好多功能:注册服务器,连接到数据库引擎,配置服务器的属性,创建对象,管理文件和文件组,附加或 ...

  8. 使用sql server Management Studio(企业管理器)或查询分析器管理数据库

    使用sql server Management Studio(企业管理器)管理数据库 sql server数据库中至少包含两个文件--数据库文件和事务日志文件. 数据库文件:一个数据库可以有一个或多个 ...

  9. Microsoft SQL Server 图书管理数据库的建立

    文章目录 题目描述 创建数据库 使用数据库 创建三个表 外码的表示形式 结果展示 题目描述 – 新建 "图书管理数据库" – 其中包含三个关系 – 图书(编号,图书名,作者,出版社 ...

  10. SQL Server 【附】创建商品管理数据库、学生选课数据库的SQL语句

    附:(创建"商品管理数据库"的SQL语句) --建立"商品管理数据库"数据库-- create database 商品管理数据库 on(name='商品管理数据 ...

最新文章

  1. android audiotrack使用问题:listener不回调的原因
  2. python stdout stderr 一起输出_Python捕获stdout/stderr并在看到outpu的同时记录到文件
  3. 毕业设计:基于Springboot实现物流统计分析系统
  4. Excel VBA中的等价(Eqv)和蕴含(Imp)
  5. HALCON示例程序train_characters_ocr.hdev使用SVM分类器训练字体
  6. nginx配置多个二级子域名
  7. 机器学习两大派别--南大周志华
  8. Linux基础(6)--文件IO操作
  9. 使用XStream对Java对象进行序列化和反序列化
  10. android51版本小游戏,世界游戏大全51游戏下载-世界游戏大全51预约 安卓版v1.0.0-PC6手游网...
  11. 【图像重建】基于matlab GUI霍夫曼图像重建(带面板)【含Matlab源码 1168期】
  12. shl归纳推理测试题库_逻辑推理测试题及答案-shl逻辑推理测试题目及答案
  13. ambari mysql 开机自动启动_ambari的服务启动顺序如何设置
  14. 常见的 Android 性能指标获取方式:CPU、FPS、Memory、GPU 、I/O、Network
  15. 利用.htaccess文件实现不带www域名301跳转到带www域名
  16. 最近感冒恢复中,读了《平凡的世界》,写点感受。
  17. 科学计算机怎么调试,用科学的方法调节用电脑之后的眼睛视力
  18. ubuntu E: Unable to locate package xxxxxxx解决办法
  19. 接收字符大写转化为对应的小写
  20. 使用Flexible实现手淘页面的终端适配

热门文章

  1. mysql超键 候选键_菜鸟学数据库——超键、候选键、主键、外键
  2. 基础linux命令详情
  3. 奶奶说标题不能起的太长要不然会有憨憨跟着读之Linux简述及常用命令
  4. WEB入门.七 CSS布局模型
  5. AI+一统互联网和物联网
  6. 详解Linux内核红黑树算法的实现 http://blog.csdn.net/npy_lp/article/details/7420689
  7. javascript DOM 操作基础知识小结
  8. python 爬虫--利用百度图片处理OCR识图API进行验证码识别,并通过python、requests进行网站信息爬取(二)实战
  9. matlab 蓝屏抠图,MATLAB抠图
  10. 一个好用的智能抠图网站