联系:手机/微信(+86 17813235971) QQ(107644445)
作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]
联系:手机/微信(+86 17813235971) QQ(107644445)
作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]
联系:手机/微信(+86 17813235971) QQ(107644445)
作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]
联系:手机/微信(+86 17813235971) QQ(107644445)
作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]
一、linux系统
1、修改my.cnf中的参数
关闭数据库
修改my.cnf参数
在[mysqld]的段中加上一句:skip-grant-tables
启动数据库,使用mysqld/mysqld_safe/mysqld.service都可以
使用mysql直接登录修改root密码
2、mysqld_safe –skip-grant-tables 启动数据库
关闭数据库
mysqld_safe –skip-grant-tables & 启动数据库
使用mysql直接登录修改root密码
二、windows系统
关闭mysql
$mysqldir/bin/mysqld –skip-grant-tables启动数据库
使用mysql直接登录修改root密码
说明:修改密码请查看MYSQL修改密码
联系:手机/微信(+86 17813235971) QQ(107644445)
标题:Mysql Merge表
作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]
MERGE引擎类型允许你把许多结构相同的表合并为一个表。然后,你可以执行查询,从多个表返回的结果就像从一个表返回的结果一样。每一个合并的表必须有同样的表定义。
MERGE存储引擎在下面这种使用场合会最为有用,如果需要把日志纪录不停的录入MySQL数据库,并且每天、每周或者每个月都创建一个单一的表,而且要制作来自多个表的合计查询,MERGE表这时会非常有效。然而,这项功能有局限性。你只能合并MyISAM表而且必须严格遵守相同的表定义的限制。
创建方法如下:
mysql> create table t1(id int not null primary key,name varchar(20)) engine=myisam;
Query OK, 0 rows affected (0.03 sec)
mysql> create table t2(id int not null primary key,name varchar(20)) engine=myisam;
Query OK, 0 rows affected (0.00 sec)
mysql> create table mrg(id int not null primary key,name varchar(20)) engine=merge union(t1,t2) insert_method=first;
Query OK, 0 rows affected (0.00 sec)
测试:
1、在t1中插入数据
mysql> insert into t1 values(1,’tttttt’);
Query OK, 1 row affected (0.03 sec)
mysql> insert into t1 values(2,’tttttt’);
Query OK, 1 row affected (0.00 sec)
2、查询t1表
mysql> select * from t1;
+—-+——–+
| id | name |
+—-+——–+
| 1 | tttttt |
| 2 | tttttt |
+—-+——–+
2 rows in set (0.00 sec)
3、查询mrg表
mysql> select * from mrg;
+—-+——–+
| id | name |
+—-+——–+
| 1 | tttttt |
| 2 | tttttt |
+—-+——–+
2 rows in set (0.00 sec)
4、在t2中插入数据
mysql> insert into t2 values(1,’ssssss’);
Query OK, 1 row affected (0.00 sec)
5、查询t2表
mysql> select * from t2;
+—-+——–+
| id | name |
+—-+——–+
| 1 | ssssss |
+—-+——–+
1 row in set (0.00 sec)
6、查询mrg表
mysql> select * from mrg;
+—-+——–+
| id | name |
+—-+——–+
| 1 | tttttt |
| 2 | tttttt |
| 1 | ssssss |
+—-+——–+
3 rows in set (0.00 sec)
7、mrg表中插入数据并测试
mysql> insert into mrg values(1,’ssssss’);
ERROR 1062 (23000): Duplicate entry ‘1’ for key ‘PRIMARY’
mysql> insert into mrg values(2,’ssssss’);
ERROR 1062 (23000): Duplicate entry ‘2’ for key ‘PRIMARY’
mysql> insert into mrg values(3,’ssssss’);
Query OK, 1 row affected (0.00 sec)
mysql> insert into t2 values(4,’ssssss’);
Query OK, 1 row affected (0.00 sec)
mysql> insert into mrg values(4,’ssssss’);
Query OK, 1 row affected (0.00 sec)
mysql> select * from t1;
+—-+——–+
| id | name |
+—-+——–+
| 1 | tttttt |
| 2 | tttttt |
| 3 | ssssss |
| 4 | ssssss |
说明:因为我们设置的 INSERT_METHOD为FIRST,因此插入数据进入t1表,而t1表中有主键,所以部分数据插入失败
1. 此表类似于SQL中的union机制。
2. 此表结构必须与基本表完全一致,包括列名、顺序。UNION表必须同属一个DATABASE。
3. 基本表类型必须是MyISAM。
4. 可以通过修改.mrg文件来修改MERGE表,每个基本表的名字占一行。注意:修改后要通过FLUSH TABLES刷新表缓存。
5. 对基本表的更改可以直接反映在此表上。
6. INSERT_METHOD的取值可以是: 0 不允许插入 FIRST 插入到UNION中的第一个表 LAST 插入到UNION中的最后一个表。(4.0之后可用)
7. 定义在它上面的约束没有任何作用,约束是由基本表控制的,例如两个基本表中存在着同样的一个Key值,那么在MERGE表中会有两个一样的Key值。
联系:手机/微信(+86 17813235971) QQ(107644445)
标题:mysql通过substring_index和substring截取字符串
作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]
今天朋友问我mysql中有个列如下数值,怎么提出出其中ip地址
BGP-BeiJing-59.151.105.130-AD_read-YeZongKun
BGP-BeiJing-59.151.105.138_140_141-AD_LVS-YeZongKun
我提供sql语句如下:
select SUBSTRING(substring_index(‘BGP-BeiJing-59.151.105.130-AD_read-YeZongKun’,’-‘,3),(length(substring_index(‘BGP-BeiJing-59.151.105.130-AD_read-YeZongKun’,’-‘,2))+2));
SUBSTRING
SUBSTRING(str,pos,len)
SUBSTRING(str FROM pos FOR len)
SUBSTRING(str,pos)
SUBSTRING(str FROM pos)
mysql> SELECT SUBSTRING(‘Quadratically’,5);
-> ‘ratically’
mysql> SELECT SUBSTRING(‘foobarbar’ FROM 4);
-> ‘barbar’
mysql> SELECT SUBSTRING(‘Quadratically’,5,6);
-> ‘ratica’
mysql> SELECT SUBSTRING(‘Sakila’, -3);
-> ‘ila’
mysql> SELECT SUBSTRING(‘Sakila’, -5, 3);
-> ‘aki’
mysql> SELECT SUBSTRING(‘Sakila’ FROM -4 FOR 2);
-> ‘ki’
substring_index
substring_index(str,delim,count)
mysql> SELECT SUBSTRING_INDEX(‘www.mysql.com’, ‘.’, 2);
-> ‘www.mysql’
mysql> SELECT SUBSTRING_INDEX(‘www.mysql.com’, ‘.’, -2);
-> ‘mysql.com’
联系:手机/微信(+86 17813235971) QQ(107644445)
作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]
mysql> show BINARY logs;
+—————–+———–+
| Log_name | File_size |
+—————–+———–+
| mysqlbin.000001 | 107 |
+—————–+———–+
1 row in set (0.00 sec)
–查看当前bin_log情况
mysql> show master logs;
+—————–+———–+
| Log_name | File_size |
+—————–+———–+
| mysqlbin.000001 | 107 |
+—————–+———–+
1 row in set (0.00 sec)
–查看当前bin_log情况
mysql> show variables like ‘%log_bin%’;
+———————————+——-+
| Variable_name | Value |
+———————————+——-+
| log_bin | ON |
| log_bin_trust_function_creators | OFF |
| sql_log_bin | ON |
+———————————+——-+
3 rows in set (0.00 sec)
–查看log_bin相关配置
mysql> flush logs;
Query OK, 0 rows affected (0.06 sec)
–切换bin_log日志
mysql> PURGE BINARY LOGS TO ‘mysqlbin.000002’;
Query OK, 0 rows affected (0.03 sec)
–删除mysqlbin.000002之前的bin_log,并修改index中相关数据
mysql> PURGE BINARY LOGS BEFORE ‘2011-07-09 12:40:26’;
Query OK, 0 rows affected (0.04 sec)
–删除2011-07-09 12:40:26之前的bin_log,并修改index中相关数据
mysql> PURGE BINARY LOGS BEFORE ‘2011-07-09’;
Query OK, 0 rows affected (0.00 sec)
–删除2011-07-09之前的bin_log,并修改index中相关数据
mysql> set global expire_logs_days=5;
Query OK, 0 rows affected (0.00 sec)
–设置bin_log过期日期
mysql> reset master;
Query OK, 0 rows affected (0.02 sec)
–重设bin_log日志,以前的所有日志将被删除并且重设index中的数据
联系:手机/微信(+86 17813235971) QQ(107644445)
作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]
#! /bin/bash #数据库相关信息 dbuser=root dbpasswd=password mycnf=/etc/mysql/my.cnf #如果bin-log没有指定路径 dir_bin=/opt/mysql/mysqldata/mysqllog #数据库备份的路径 install_dir=/opt/MySqlBackUp data_dir=$install_dir/data temp_dir=$install_dir/temp log_dir=$install_dir/logs bin_dir=$install_dir/bin #接受邮箱 mail=chengfei@srt.com.cn #备份文件名、日志名、备份日志 sj=`date +\%Y``date +\%m``date +\%d``date +\%H``date +\%M``date +\%S` datafile=$sj"_data.tar.gz" log=$sj".log" binlogfile=$sj"_bin.tar.gz" #使用mysqldump备份 #是否启动dump功能(0表示不启用,1表示启用) dump_flag=1 #需要dump出来的数据库名 dumpdb=srtair #dump文件名 dumpfile=$sj"_"$dumpdb".sql.gz" #是否备份至远程 #是否启用ftp传输功能 ftp_flag=0 #ftp IP地址 ftp_ip= #ftp 用户名 ftp_user= #ftp 密码 ftp_passwd= #上传ftp 路径 ftp_dir= #读取my.cnf文件 process_readconfig() { echo "-----------开始读my.cnf文件--`date`-------------" #没有具体路径情况或者有具体路径 bin_log=`cat $mycnf | grep -i '^log-bin' | awk -F = '{print $2}'|sed s/\ //g` #数据文件路径 datadir=`cat $mycnf | grep -i '^datadir' | awk -F = '{print $2}'|sed s/\ //g` #需要判断是否有/,然后决定是否是全路径 #basedir路径 basedir=`cat $mycnf | grep -i '^basedir' | awk -F = '{print $2}'|sed s/\ //g` } #日志处理 process_binlog() { echo "……………………………开始备份日志文件--`date`………………………………">>"$log_dir/$log" echo "……………………………开始备份日志文件--`date`………………………………" echo "需要备份二进制日志列表……">>"$log_dir/$log" ls -tl "$bin_log."[0-9]* >>"$log_dir/$log" echo "开始备份二进制日志文件……"`date`>>"$log_dir/$log" tar czvfP "$data_dir/$binlogfile" "$bin_log".[0-9]* echo "结束备份二进制日志文件……"`date`>>"$log_dir/$log" #删除一天以前的日志文件 echo "删除过期二进制日志文件……"`date`>>"$log_dir/$log" echo "删除过期二进制日志列表……">>"$log_dir/$log" find $dir_bin -type f -mtime +1>>"$log_dir/$log" find $dir_bin -type f -mtime +1 -exec rm -f {} \; echo "删除过期二进制日志文件结束……"`date`>>"$log_dir/$log" echo "…………………………备份日志文件结束--`date`……………………………………">>"$log_dir/$log" echo "…………………………备份日志文件结束--`date`……………………………………" } #数据备份 process_backup() { process_readconfig #备份数据库 echo "……………………………开始备份数据文件--`date`………………………………" echo "……………………………开始备份数据文件--`date`………………………………">>"$log_dir/$log" source /root/.bash_profile $bin_dir/innobackupex --user="$dbuser" --password="$dbpasswd" --defaults-file="$mycnf" --stream=tar "$temp_dir" 2>"$temp_dir/$sj"_tmp.log | gzip>"$data_dir/$datafile" echo "……………………………备份数据文件结束--`date`………………………………">>"$log_dir/$log" echo "……………………………备份数据文件结束--`date`………………………………" cat "$temp_dir/$sj"_tmp.log>>"$log_dir/$log" #删除7天以前备份数据和信息 echo "清理7天前备份数据与相关信息……"`date`>>"$log_dir/$log" find $data_dir -type f -mtime +7>>"$log_dir/$log" find $data_dir -type f -mtime +7 -exec rm -f {} \; #mysqldump操作 if [ "$dump_flag" == 1 ]; then echo "……………… mysqldump操作开始--`date`……………" echo "……………… mysqldump操作开始--`date`………">>"$log_dir/$log" exp_sql echo "……………… mysqldump操作结束--`date`…………">>"$log_dir/$log" echo "……………… mysqldump操作结束--`date`……………………………" fi #登录mysql,切换日志 $basedir/bin/mysql -u$dbuser -p$dbpasswd<<XFF flush logs; exit XFF #备份日志文件 process_binlog #ftp(没有写是否上传失败,成功) if [ "$ftp_flag" == 1 ]; then echo "……………… ftp操作开始--`date`……………" echo "……………… ftp操作开始--`date`…………">>"$log_dir/$log" exec_ftp echo "……………… ftp操作结束--`date`…………">>"$log_dir/$log" echo "……………… ftp操作结束--`date`……………………………" fi #发送邮件 process_send } process_send() { #查找错误 grep "Error" "$temp_dir/$sj"_tmp.log > "$temp_dir/$sj".err IP=`/sbin/ifconfig ${eth} | grep 'inet addr:'| awk '{print $2}' | awk -F : '{print $2}'` IP=`echo $IP|awk '{print $1}'` echo `grep "innobackupex: completed OK\!" "$temp_dir/$sj"_tmp.log | awk -F : '{print $4}'|sed s/\ //g`>"$temp_dir/$sj".good GOOD_COUNT=`cat "$temp_dir/$sj".good |wc -l` ERROR_COUNT=`cat "$temp_dir/$sj".err |wc -l` if [ "$ERROR_COUNT" == 0 -a "$GOOD_COUNT" == 1 ]; then echo "`date`-----MySql备份成功-----">>"$log_dir"/result.log echo "-----------------------------------">>"$log_dir"/result.log echo "……………………………开始发送邮件--`date`………………………………" echo "……………………………开始发送邮件--`date`………………………………">>"$log_dir/$log" echo "MySql_Backup_Succeed" | mutt -s "$IP"_MySql_Backup_Succeed -a "$log_dir/$log" ${mail} else echo "`date`-----MySql备份失败,请检查$temp_dir"/"$sj"_tmp.log>>"$log_dir"/result.log echo "-----------------------------------">>"$log_dir"/result.log echo "……………………………开始发送邮件--`date`………………………………" echo "……………………………开始发送邮件--`date`……………………………">>"$log_dir/$log" cat "$temp_dir/$sj".err | mutt -s "$IP"_MySql_Backup_Fail -a "$temp_dir/$sj"_tmp.log ${mail} fi #删除7天前的日志文件 find $temp_dir -type f -mtime +7 -exec rm -f {} \; echo "……………………………发送邮件结束--`date`………………………………">>"$log_dir/$log" echo "……………………………发送邮件结束--`date`………………………………" } #导出sql语句 exp_sql() { mysqldump -u "$dbuser" -p"$dbpasswd" --single-transaction --allow-keywords --add-locks --add-drop-table -F -q "$dumpdb" |gzip 1>"$data_dir/$dumpfile" } #ftp操作 exec_ftp() { echo "#!/bin/bash">"$temp_dir/$sj"_ftp.sh echo "ftp -n $ftp_ip <<XFF">>"$temp_dir/$sj"_ftp.sh echo "user $ftp_user $ftp_passwd">>"$temp_dir/$sj"_ftp.sh echo "bin">>"$temp_dir/$sj"_ftp.sh echo "cd $ftp_dir">>"$temp_dir/$sj"_ftp.sh echo "lcd $data_dir">>"$temp_dir/$sj"_ftp.sh echo "put $datafile">>"$temp_dir/$sj"_ftp.sh echo "put $dumpfile">>"$temp_dir/$sj"_ftp.sh echo "put $binlogfile">>"$temp_dir/$sj"_ftp.sh echo "lcd $log_dir">>"$temp_dir/$sj"_ftp.sh echo "put $log">>"$temp_dir/$sj"_ftp.sh echo "close">>"$temp_dir/$sj"_ftp.sh echo "bye" >>"$temp_dir/$sj"_ftp.sh echo "XFF">>"$temp_dir/$sj"_ftp.sh chmod 777 "$temp_dir/$sj"_ftp.sh sh "$temp_dir/$sj"_ftp.sh } #执行备份 process_backup
mysql_backup.sh程序安装说明
1、安装mysqlbackup程序
上传mysqlbackup到服务器/tmp目录
cd /tmp
unzip mysqlbackup.zip
cp /tmp/mysqlbackup/* /opt/mysql/product/5.1/bin
mkdir -p /opt/MySqlBackUp/bin
mkdir -p /opt/MySqlBackUp/data
mkdir -p /opt/MySqlBackUp/logs
mkdir -p /opt/MySqlBackUp/temp
ln -s /opt/mysql/product/5.1/bin/innobackupex /opt/MySqlBackUp/bin/innobackupex
对innobackupex进行授权
cd /opt/mysql/product/5.1/bin/
chmod +x innobackupex*
chmod +x xtrabackup*
chmod +x tar4ibd
cp /tmp/mysqlbackup/mysql_backup.sh /opt/MySqlBackUp/bin/
chmod 775 /opt/MySqlBackUp/bin/mysql_backup.sh
2、修改mysql_backup.sh中的相关数据
dbuser
dbpasswd
mail
dumpdb
3、配置mysql环境变量到root中
export MYSQL_BASE=/opt/mysql
export BASEDIR=$MYSQL_BASE/product/5.1
export DATADIR=$MYSQL_BASE/mysqldata
export LD_LIBRARY_PATH=$BASEDIR/lib:/lib:/usr/lib:/usr/local/lib
export TMPDIR=/tmp
export PATH=${PATH}:/usr/bin:/bin:/usr/bin/X11:/usr/local/bin
export PATH=${PATH}:$BASEDIR/bin:$MYSQL_BASE:$BASEDIR:$LD_LIBRARY_PATH
添加到/root/.bash_profile文件中
4、测试备份
cd /opt/MySqlBackUp/bin
./mysql_backup.sh
5、查看备份是否成功
cat /opt/MySqlBackUp/logs/result.log
如果提示备份成功,则表示程序安装成功,可能不熟到crontab中
6、部署crontab
0 1 * * * (cd /opt/MySqlBackUp/bin;sh ./mysql_backup.sh)
说明:参数配置,均是基于按照mysql安装路径配置
方法一
(适用于管理员或者有全局权限的用户重设其它用户的密码)
进入命令行模式
mysql -u root mysql
mysql> UPDATE user SET password=PASSWORD(“new password”) WHERE user=’name’;
mysql> FLUSH PRIVILEGES;
mysql> QUIT
方法二
(应用同上,只是方法不同)
mysql -u root mysql
mysql> SET PASSWORD FOR name=PASSWORD(‘new password’);
mysql> QUIT
方法三
mysqladmin -u root “old password” “new password”
联系:手机/微信(+86 17813235971) QQ(107644445)
标题:MySql分区表管理
作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]
1、RANGE和LIST分区的管理
1.1)删除分区
ALTER TABLE table_name DROP PARTITION partition_name;
1.2)添加分区
ALTER TABLE table_name ADD PARTITION (PARTITION p3 VALUES LESS THAN (2000));
Note:
1)分区的范围或者值不能重复;
2)在范围分区中,不能添加比当前范围最大值小的分区
1.3)重新定义分区
ALTER TABLE tbl_name REORGANIZE PARTITION partition_list INTO (partition_definitions);
其中,tbl_name 是分区表的名称,partition_list 是通过逗号分开的、一个或多个将要被改变的现有分区的列表。partition_definitions 是一个是通过逗号分开的、新分区定义的列表,它遵循与用在“CREATE TABLE”中的partition_definitions 相同的规则。应当注意到,在把多少个分区合并到一个分区或把一个分区拆分成多少个分区方面,没有限制。例如,可以重新组织成员表的四个分区成两个分区,具体实现如下:
ALTER TABLE members REORGANIZE PARTITION p0,p1,p2,p3 INTO (
PARTITION m0 VALUES LESS THAN (1980),
PARTITION m1 VALUES LESS THAN (2000)
);
2、HASH和KEY分区的管理
2.1)合并HASH或KEY分区
ALTER TABLE … COALESCE PARTITION
Note:对于LINEAR HASH和LINEAR KEY分区同样有效
2.2)添加分区
ALTER TABLE table_name ADD PARTITION PARTITIONS 18;–18比原来值大
3、分区维护
3.1) 重建分区
ALTER TABLE table_name REBUILD PARTITION (p0, p1);
3.2)优化分区
ALTER TABLE table_name OPTIMIZE PARTITION (p0, p1);
3.3)分析分区
ALTER TABLE table_name ANALYZE PARTITION (p0, p1);
3.4)检查分区
ALTER TABLE table_name CHECK PARTITION (p0, p1);
联系:手机/微信(+86 17813235971) QQ(107644445)
标题:MySql创建分区表
作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]
一、前沿知识
1、分区表类型
RANGE分区、LIST分区、HASH分区、KEY分区、子分区
2、查询是否支持分区表
mysql> SHOW VARIABLES LIKE ‘%partition%’;
+———————–+——-+
| Variable_name | Value |
+———————–+——-+
| have_partition_engine | YES |
+———————–+——-+
1 row in set (0.00 sec)
3、MySQL分区处理NULL值的方式
MySQL中的分区在禁止空值(NULL)上没有进行处理,如果出现NULL,MySQL 把NULL视为0
二、分区表的创建
1、RANGE分区
CREATE TABLE employees ( id INT NOT NULL, fname VARCHAR(30), lname VARCHAR(30), hired DATE NOT NULL DEFAULT '1970-01-01', separated DATE NOT NULL DEFAULT '9999-12-31', job_code INT NOT NULL, store_id INT NOT NULL ) PARTITION BY RANGE (store_id) ( PARTITION p0 VALUES LESS THAN (6), PARTITION p1 VALUES LESS THAN (11), PARTITION p2 VALUES LESS THAN (16), PARTITION p3 VALUES LESS THAN MAXVALUE );
2、 LIST分区
CREATE TABLE employees ( id INT NOT NULL, fname VARCHAR(30), lname VARCHAR(30), hired DATE NOT NULL DEFAULT '1970-01-01', separated DATE NOT NULL DEFAULT '9999-12-31', job_code INT, store_id INT ) PARTITION BY LIST(store_id) PARTITION pNorth VALUES IN (3,5,6,9,17), PARTITION pEast VALUES IN (1,2,10,11,19,20), PARTITION pWest VALUES IN (4,12,13,14,18), PARTITION pCentral VALUES IN (7,8,15,16) );
Note:LIST分区没有类似如“VALUES LESS THAN MAXVALUE”这样的包含其他值在内的定义。将要匹配的任何值都必须在值列表中找到。
3、 HASH分区
CREATE TABLE employees ( id INT NOT NULL, fname VARCHAR(30), lname VARCHAR(30), hired DATE NOT NULL DEFAULT '1970-01-01', separated DATE NOT NULL DEFAULT '9999-12-31', job_code INT, store_id INT ) PARTITION BY HASH(YEAR(hired)) PARTITIONS 4;
3.1、LINEAR HASH分区
CREATE TABLE employees ( id INT NOT NULL, fname VARCHAR(30), lname VARCHAR(30), hired DATE NOT NULL DEFAULT '1970-01-01', separated DATE NOT NULL DEFAULT '9999-12-31', job_code INT, store_id INT ) PARTITION BY LINEAR HASH(YEAR(hired)) PARTITIONS 4;
Note:线性哈希功能使用的一个线性的2的幂(powers-of-two)运算法则,而常规哈希使用的是求哈希函数值的模数
4、KEY分区
CREATE TABLE tk ( col1 INT NOT NULL, col2 CHAR(5), col3 DATE ) PARTITION BY LINEAR KEY (col1) PARTITIONS 3;
Note:
1)按照KEY进行分区类似于按照HASH分区,除了HASH分区使用的用户定义的表达式,而KEY分区的 哈希函数是由MySQL 服务器提供。MySQL 簇(Cluster)使用函数MD5()来实现KEY分区;对于使用其他存储引擎的表,服务器使用其自己内部的哈希函数,这些函数是基于与PASSWORD()一样的运算法则。
2)“CREATE TABLE … PARTITION BY KEY”的语法规则类似于创建一个通过HASH分区的表的规则。它们唯一的区别在于使用的关键字是KEY而不是HASH,并且KEY分区只采用一个或多个列名的一个列表。
5、子分区
CREATE TABLE ts (id INT, purchased DATE) PARTITION BY RANGE(YEAR(purchased)) SUBPARTITION BY HASH(TO_DAYS(purchased)) ( PARTITION p0 VALUES LESS THAN (1990) ( SUBPARTITION s0 DATA DIRECTORY = '/disk0/data' INDEX DIRECTORY = '/disk0/idx', SUBPARTITION s1 DATA DIRECTORY = '/disk1/data' INDEX DIRECTORY = '/disk1/idx' ), PARTITION p1 VALUES LESS THAN (2000) ( SUBPARTITION s0 DATA DIRECTORY = '/disk2/data' INDEX DIRECTORY = '/disk2/idx', SUBPARTITION s1 DATA DIRECTORY = '/disk3/data' INDEX DIRECTORY = '/disk3/idx' ), PARTITION p2 VALUES LESS THAN MAXVALUE ( SUBPARTITION s0 DATA DIRECTORY = '/disk4/data' INDEX DIRECTORY = '/disk4/idx', SUBPARTITION s1 DATA DIRECTORY = '/disk5/data' INDEX DIRECTORY = '/disk5/idx' ) );
Note:子分区是分区表中每个分区的再次分割,DATA DIRECTORY/INDEX DIRECTORY确定数据和索引的存储位置