十、MySQL表分区

十、MySQL表分区,第1张

  表分区是将⼀个表的数据按照⼀定的规则⽔平划分为不同的逻辑块,并分别进⾏物理存储,这个规则就叫做分区函数,可以有不同的分区规则。5.7可以通过show plugins语句查看当前MySQL是否⽀持表分区功能。

  但当表中含有主键或唯⼀键时,则每个被⽤作 分区函数的字段必须是表中唯⼀键和主键的全部或⼀部分 ,否则就⽆法创建分区表。⽐如下⾯的表由于唯⼀键和主键没有相同的字段,所以⽆法创建表分区

上述例⼦中删除唯⼀键,确保主键中的字段包含分区函数中的所有字段,创建成功

或者将主键扩展为包含ref字段

表分区的主要优势在于:

  可以允许在⼀个表⾥存储更多的数据,突破磁盘限制或者⽂件系统限制

  对于从表⾥将过期或历史的数据移除在表分区很容易实现,只要将对应的分区移除即可

  对某些查询和修改语句来说,可以 ⾃动 将数据范围缩⼩到⼀个或⼏个表分区上,优化语句执⾏效率。⽽且可以通过 显示指定表分区 来执⾏语句,⽐如 SELECT * FROM t PARTITION (p0,p1) WHERE c <5

表分区类型分为:

范围表分区,按照⼀定的范围值来确定每个分区包含的数据,分区函数使⽤的字段必须只能是 整数类型,分区的定义范围必须是连续的,且不能有重叠部分,通过使⽤VALUES LESS THAN来定义分区范围,表分区的范围定义是从⼩到⼤定义的

⽐如:

  Store_id<6的数据被放在p0分区⾥,6<=store_id<10之间的数据被放在p1分区⾥,以此类推,当新插⼊的数据为(72, ‘Mitchell’, ‘Wilson’, ‘1998-06-25’, NULL, 13) 时,则新数据被插⼊到p2分区⾥,但当插⼊的数据的store_id为21时,由于没有分区去容纳此数据,所以会报错,我们需要修改⼀下表的定义

报错:

修改表的定义:

   MAXVALUE关键词的作⽤是表示可能的最⼤值,所以任何store_id>=16的数据都会被写⼊到p3分区⾥。分区函数中也可以使⽤表达式 ,⽐如:

   对timestamp字段类型可以使⽤的表达式⽬前仅有unix_timestamp ,其他的表达式都不允许

列表表分区,按照⼀个⼀个确定的值来确定每个分区包含的数据,通过PARTITION BY LIST(expr)分区函数表达式必须返回整数,取值范围通过VALUES IN (value_list)定义

对List表分区来说,没有MAXVALUE特殊值,所有的可能取值都需要再VALUES IN中包含,如果有未定义的取值则会报错

同样,当有主键或者唯⼀键存在的情况下,分区函数字段需要包含在主键或唯⼀键中

对range和list表分区来说,分区函数可以包含多个字段,分区多字段函数(column partition) 所涉及的字段类型可以包括:

范围多字段分区函数与普通的范围分区函数的区别在于:

a) 字段类型多样化

b) 范围多字段分区函数 不⽀持表达式,只能⽤字段名

c) 范围多字段分区函数⽀持⼀个或多个字段

再⽐如创建如下的表分区:

对多列对⽐来说:

当然只要保证取值范围是增⻓的,表分区就能创建成功,⽐如:

但如果 取值范围不是增⻓的,就会返回错误

对其他数据类型的⽀持:

list列表多字段表分区,例如:你有一个在12个城市客户的业务, 为了销售和市场的目的, 你的组织每3个城市划分为一个区域针对LIST COLUMNS分区, 你可以基于城市的名称创建一个客户数据表并声明4个分区当你的客户在对应的这个区域:

使用日期分区

但是这种情况在日期增长到非常大的时候是很复杂的, 所以这种还是使用RANGE 分区方式比较好

  按照⼀个⾃定义的函数返回值来确定每个分区包含的数据,这个 ⾃定义函数也可以仅仅是⼀个字段名字

  通过PARTITION BY HASH (expr)⼦句来表达哈希表分区,其中的 expr表达式必须返回⼀个整数,基于分区个数的取模(%)运算。根据余数插⼊到指定的分区

  对哈希表分区来说只需要定义分区的个数,其他的事情由内部完成

如果没有写明PARTITIONS字段,则默认为1,表达式可以是整数类型字段,也可以是⼀个函数,⽐如

⽐如: CREATE TABLE t1 (col1 INT, col2 CHAR(5), col3 DATE) PARTITION BY HASH( YEAR(col3) ) PARTITIONS 4

如果插⼊⼀条数据对应的col3为‘2005-09-15’时,则插⼊数据的分区计算⽅法为:

  与哈希表分区类似,只不过哈希表分区依赖于⾃定义的函数,⽽key表分区的哈希算法是依赖MySQL本身, CREATE TABLE ... PARTITION BY KEY () 创建key表分区, 括号⾥⾯可以包含0个或者多个字段,所引⽤的字段必须是主键或者主键的⼀部分 ,如果括号⾥⾯没有字段,则代表使⽤主键

如果表中没有主键但有唯⼀键,则使⽤唯⼀键,但 唯⼀键字段必须定义为not null ,否则报错

所引⽤的字段未必必须是整数类型,其他的类型也可以使⽤,⽐如:

⼦表分区,是在表分区的基础上再创建表分区的概念, 每个表分区下的⼦表分区个数必须⼀致 ,⽐如:

ts表拥有三个范围分区,同时每个分区都各⾃有两个⼦分区,所以总共有6个分区

⼦表分区必须是范围/列表分区+哈希/key⼦表分区的组合

⼦表分区也可以显示的指定⼦表分区的名字,⽐如:

不同的表分区对NULL值的处理⽅式不同

对范围表分区来说,如果插⼊的是NULL值,则将数据放到最⼩的分区表⾥

对list表分区来说,⽀持NULL值的唯⼀情况就是某个分区的允许值中包含NULL

对哈希表分区和Key表分区来说,NULL值会被当成0值对待

通过alter table命令可以执⾏增加,删除,重新定义,合并或者拆分表分区的管理动作

对范围表分区和列表表分区来说,删除⼀个表分区命令如下:

删除表分区的动作不光会把分区删掉,也会把表分区⾥原来的数据给删除掉

在原分区上增加⼀个表分区可以通过alter table … add partition语句来完成

但对范围表分区来说,增加的表分区必须在尾部增加,在头部或者在中间增加都会失败:

为解决这个问题,可以使⽤ REORGANIZE 命令:

对列表表分区来说,只要新增加的分区对应的值在之前的表分区中没有出现过,就可以通过alter table… add partition来增加

当然, 也可以通过REORGANIZE命令将之前的多个分区合并成⼀个或⼏个分区,但要保持分区值⼀致:

更复杂的⽐如将多个分区重组成多个分区:

pager 的作用类似于 Linux 的管道符,可以把输出给另外一个命令作为输入。强大之处在于这个管道符接的命令是 Linux 命令,我们可以利用我们熟悉的 Linux 命令实现各种骚 *** 作。话不多说,直接来几个例子。

翻页

mysql>pager lessPAGER set to 'less'mysql>show engine innodb status\G1 row in set (0.00 sec)

innodb status 的输出很长,接 Linux 命令 less 实现翻页,同样地根据您个人喜好,也可以用 more。

查找搜索

一般来说我们想查看目前有哪些正在跑的慢 SQL,可以用以下命令查询information_schema 中的 processlist 表,这要求你熟悉元数据表。

关闭 pager用完 pager 记得取消,取消的方法也很简单,有三种方法。

#常用方法,设置pager回原默认值(stdout)

mysql>pager

Default pager wasn't set, using stdout.

#关闭pager

mysql>nopager

PAGER set to stdout

#退出客户端,重新连接

mysql>quit

Bye

获取mysql有关的帮助信息,直接在mysql提示符下输入help即可获得有关在mysql客户端相关的帮助信息。

这个方式与Oracle SQL*plus下的help 是类似的。

mysql>help

For information about MySQL products and services, visit:

http://www.mysql.com/

For developer information, including the MySQL Reference Manual, visit:

http://dev.mysql.com/

To buy MySQL Enterprise support, training, or other products, visit:

https://shop.mysql.com/

List of all MySQL commands:

Note that all text commands must be first on line and end with ''

? (\?) Synonym for `help'.

clear (\c) Clear the current input statement. --清除当前输入的语句

connect (\r) Reconnect to the server. Optional arguments are db and host. --重新连接,通常用于被剔除或异常断开后重新连接,SQL*plus下也有这样一个connect命令

delimiter (\d) Set statement delimiter. --设置命令终止符,缺省为;,比如我们可以设定为/来表示语句结束

edit (\e) Edit command with $EDITOR. --编辑缓冲区的上一条SQL语句到文件,缺省调用vi,文件会放在/tmp路径下

ego (\G) Send command to mysql server, display result vertically. --控制结果显示为垂直显示

exit (\q) Exit mysql. Same as quit. --退出mysql

go(\g) Send command to mysql server. --发送命令到mysql服务

help (\h) Display this help.

nopager (\n) Disable pager, print to stdout.--关闭页设置,打印到标准输出

notee (\t) Don't write into outfile. --关闭输出到文件

pager (\P) Set PAGER [to_pager]. Print the query results via PAGER. --设置pager方式,可以设置为调用more,less等等,主要是用于分页显示

print (\p) Print current command.

prompt(\R) Change your mysql prompt. --改变mysql的提示符

quit (\q) Quit mysql.

rehash(\#) Rebuild completion hash. --自动补齐相关对象名字

source(\.) Execute an SQL script file. Takes a file name as an argument. --执行脚本文件

status(\s) Get status information from the server.--获得状态信息

system(\!) Execute a system shell command.--执行系统命令

tee (\T) Set outfile [to_outfile]. Append everything into given outfile.-- *** 作结果输出到文件

use (\u) Use another database. Takes database name as argument. --切换数据库

charset (\C) Switch to another charset. Might be needed for processing binlog with multi-byte charsets. --设置字符集

warnings (\W) Show warnings after every statement. --打印警告信息

nowarning (\w) Don't show warnings after every statement.

--上面的所有命令,扩号内的为快捷 *** 作,即只需要输入“\”+ 字母即可执行

For server side help, type 'help contents'--注意这里的描述help contents将获得服务器端的相关帮助信息

--演示部分,演示常用命令

--connect命令

mysql>connect chardb localhost

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A

Connection id:5

Current database: chardb

--设置分页,在多余一个页面显示时会不停的翻滚,用该命令可以设置分页,设置为调用系统命令

mysql>pager more --设置为more方式

PAGER set to 'more'

mysql>select table_name,table_type,engine from information_schema.tables --该查询会超出一屏显示后按空格键会自动翻滚到下一屏

mysql>pager tail -5 --设置输出尾部5行

PAGER set to 'tail -5'

mysql>select table_name,table_type,engine from information_schema.tables

| setup_timers | BASE TABLE | PERFORMANCE_SCHEMA |

| threads | BASE TABLE | PERFORMANCE_SCHEMA |

| animals | BASE TABLE | InnoDB |

| shop | BASE TABLE | InnoDB |

+----------------------------------------------+-------------+--------------------+

92 rows in set (0.02 sec)

mysql>pager --查看当前的pager设置

PAGER set to 'tail -5'

mysql>nopager --切换到标准(缺省)pager方式

PAGER set to stdout

--tee命令,输出日志文件

mysql>tee /tmp/query.log--开启输出到文件,相当与SQL*plus下的spool

Logging to file '/tmp/query.log'

mysql>select table_name,table_type,engine from information_schema.tables

+----------------------------------------------+-------------+--------------------+

| table_name | table_type | engine |

+----------------------------------------------+-------------+--------------------+

| CHARACTER_SETS | SYSTEM VIEW | MEMORY |

| COLLATIONS | SYSTEM VIEW | MEMORY |

.............

mysql>notee --关闭输出到文件,相当于SQL*Plus下的spool off

Outfile disabled.

mysql>system tail /tmp/query.log--查看输出的日志文件

| setup_consumers | BASE TABLE | PERFORMANCE_SCHEMA |

| setup_instruments| BASE TABLE | PERFORMANCE_SCHEMA |

| setup_timers | BASE TABLE | PERFORMANCE_SCHEMA |

| threads | BASE TABLE | PERFORMANCE_SCHEMA |

| animals | BASE TABLE | InnoDB |

| shop | BASE TABLE | InnoDB |

+----------------------------------------------+-------------+--------------------+

92 rows in set (0.02 sec)

--改变mysql提示符

mysql>prompt SessionA>

PROMPT set to 'SessionA>'

--恢复到缺省提示符

SessionA>prompt

Returning to default PROMPT of mysql>

--执行sql脚本文件

mysql>system more query.sql --注意,此时为当前目录

use chardb

select * from tb_isam

mysql>source query.sql

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A

Database changed

+------+-------+

| id | value |

+------+-------+

|1 | a |

|2 | b |

|3 | c |

|4 | f |

+------+-------+

4 rows in set (0.00 sec)

--获取状态信息

mysql>status

--------------

mysql Ver 14.14 Distrib 5.5.37, for Linux (x86_64) using readline 5.1

Connection id: 6

Current database: chardb

Current user: root@localhost

SSL:Not in use

Current pager: less

Using outfile: ''

Using delimiter:

Server version: 5.5.37-log MySQL Community Server (GPL)

Protocol version: 10

Connection: Localhost via UNIX socket

Server characterset:latin1

Db characterset:utf8

Client characterset:latin1

Conn. characterset:latin1

UNIX socket:/var/lib/mysql/mysql.sock

Uptime: 3 hours 10 min 59 sec

Threads: 1 Questions: 97 Slow queries: 0 Opens: 313 Flush tables: 1 Open tables: 51 Queries per second avg: 0.008

--------------

--修改客户端字符集


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/7650146.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-08
下一篇 2023-04-08

发表评论

登录后才能评论

评论列表(0条)

保存