表的排序与字符集,分区表的特点

字符集是用来定义每个字符在系统里的编码的集合,因为所有的字符都是以编码值的形式存储在硬盘上的,所以当我们输入了字符之后系统一定需要将他们转换成编码值,然后再存储到硬盘上.

校验就是对编码进行比较的一套规则,会影响比较和排序规则的,比如--default-charset=latin1 --default-collation=latin1_swedish_ci(默认),对于col1 'AAA',col2 'aaa',他们在硬盘上存储的编码值是相同的(都是按latin1编码方式存储),但是因为选择不同的校验,所以排序规则不同,一般一个字符集会对应3个校验规则,_cs(区分大小写),_ci(不区分大小写),_bin(二进制形式),对于latin1_swedish_ci校验,mysql比较时会认为'AAA','aaa'是相同的;但是latin1_swedish_cs校验规则会认为'AAA'大,对于latin1_swedish_bin是二进制比较,a和A的二进制必然不同。



MySQL对于字符集的指定可以细化到一个数据库,一张表,一列,应该用什么字符集。
服务器字符集和校对 character_set_server
数据库字符集和校对 character_set_databasse
表字符集和校对
CREATE TABLE tbl_name (column_list)
    [DEFAULT CHARACTER SET charset_name [COLLATE collation_name]]
列字符集和校对
col_name {CHAR | VARCHAR | TEXT} (col_length)
    [CHARACTER SET charset_name [COLLATE collation_name]]

mysql字符集的指定,如果不显示指定校对规则,那么是按_ci校验规则比较的。如果在列上不指定字符集,那么按表的默认字符集来设置列字符集,就是粒度小的不显示指定,那么就会被粒度大的所覆盖。
(1)编译MySQL 时,指定了一个默认的字符集,这个字符集是 latin1;
(2)安装MySQL 时,可以在配置文件 (my.ini) 中指定一个默认的的字符集,如果没指定,这个值继承自编译时指定的;
(3)启动mysqld 时,可以在命令行参数中指定一个默认的的字符集,如果没指定,这个值继承自配置文件中的配置,此时 character_set_server 被设定为这个默认的字符集;
(4)当创建一个新的数据库时,除非明确指定,这个数据库的字符集被缺省设定为character_set_server;
(5)当选定了一个数据库时,character_set_database 被设定为这个数据库默认的字符集;
(6)在这个数据库里创建一张表时,表默认的字符集被设定为 character_set_database,也就是这个数据库默认的字符集;
(7)当在表内设置一栏时,除非明确指定,否则此栏缺省的字符集就是表默认的字符集;

在操作数据库时需要注意乱码问题
set  names  字符集
将设置character_set_client,character_set_connection,character_set_results为统一字符集,只要他们和数据存储的字符集一致,那么就不会产生乱码等行为。




5) mysql 分区表

它允许设置为一定的规则,跨文件系统分配单个表的多个部分,并把表的不同部分在不同的位置被存储为单独的表。分割规则被称为分区函数。分区是针对数据和索引的,不能只是针对一个,一般情况下,索引不是那么明显。

SHOW VARIABLES LIKE '%partition%';//查看是否该版本支持分区。


分区的一些优点包括(摘自手册总结):
1)与单个表相比可以存更多数据
2)对于那些失去保存意义的数据,通常可以删除相应的分区。
3)查询可以分布到不同的磁盘来来同时进行
4)可以优化where,当某些唯一的记录在某个分区找到后就不用在其他分区查找了
5)对于记录的统计可以并行进行,意味着该查询可以在每个分区上同时进行,最终结果只需通过总计所有分区得到的结果。

mysql的分区方式
RANGE 分区:基于属于一个给定连续区间的列值,把多行分配给分区。
注意的限制是MySQL 必须能够计算表达式的返回值作为LESS THAN (<)比较的一部分;因此,表达式的值不能为NULL 。
比如测试数据,注意这里的DATA|INDEX DIRECTORY 不能包含data_dir 路径,否者会出现错误Incorrect arguments to DATA DIRECTORY。
CREATE TABLE testusers (
    uid INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(30) NOT NULL DEFAULT '',
    email VARCHAR(30) NOT NULL DEFAULT ' '
)
PARTITION BY RANGE (uid) (
    PARTITION p0 VALUES LESS THAN (3)
    DATA DIRECTORY = '/home/zhanghong/opdir/tmp/data0'
    INDEX DIRECTORY = '/home/zhanghong/opdir/tmp/index0',

    PARTITION p1 VALUES LESS THAN (6)
    DATA DIRECTORY = '/home/zhanghong/opdir/tmp/data1'
    INDEX DIRECTORY = '/home/zhanghong/opdir/tmp/index1');


LIST 分区:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。

HASH分区:基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包>含MySQL中有效的、产生非负整数值的任何表达式。CREATE TABLE testusers (
    uid INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(30) NOT NULL DEFAULT '',
    email VARCHAR(30) NOT NULL DEFAULT ' '
)
PARTITION BY HASH(uid)
PARTITIONS 4//指定分区的数目。

KEY
分区:类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL服务器提供其自身的哈希函数。



注意在指定DATA DIRECTORY 和INDEX DIRECTORY时 ,需要启动   --symbolic-links
启用符号链接表示你可以用CREATE TABLE语句的INDEX DIRECTORY或DATA DIRECTORY选项将MyISAM索引文件或数据文件链接到另一个目录,如果--skip-symbolic-links 那么就会出错




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值