MySQL分区性能初探[转]

一, 分区概念

分区允许根据指定的规则,跨文件系统分配单个表的多个部分。表的不同部分在不同的位置被存储为单独的表。MySQL从5.1.3开始支持Partition。

分区和手动分表对比

手动分表 分区
多张数据表 一张数据表
重复数据的风险 没有数据重复的风险
写入多张表 写入一张表
没有统一的约束限制 强制的约束限制

MySQL支持RANGE,LIST,HASH,KEY分区类型,其中以RANGE最为常用:

Range(范围)–这种模式允许将数据划分不同范围。例如可以将一个表通过年份划分成若干个分区。
Hash(哈希)–这中模式允许通过对表的一个或多个列的Hash Key进行计算,最后通过这个Hash码不同数值对应的数据区域进行分区。例如可以建立一个对表主键进行分区的表。
Key(键值)-上面Hash模式的一种延伸,这里的Hash Key是MySQL系统产生的。
List(预定义列表)–这种模式允许系统通过预定义的列表的值来对数据进行分割。
Composite(复合模式) –以上模式的组合使用 

二,分区能做什么

逻辑数据分割
提高单一的写和读应用速度
提高分区范围读查询的速度
分割数据能够有多个不同的物理文件路径
高效的保存历史数据
一个表上的约束检查
不同的主从服务器分区策略,例如master按Hash分区,slave按range分区

Continue reading

MySQL表分区和分布性能测试[转]

MySQL分区性能测试
By 成江东, on 八月 31st, 2010
一,测试服务器配置:

Cpu: 2*4核Intel(R) Xeon(R) E5405 @ 2.00GHz

内存:4G

存储:36块1T的7.2K的SATA组成raid0。使用其中的1T

Mysql版本:5.1.45-community-log MySQL Community Server (GPL)

二,建测试表:

Myisam不分区不分表,单表10亿数据量:

Select Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
create table biguser

(

   ID                   bigint not null auto_increment comment ‘自增ID’,

   Username             varchar(30) not null comment ‘用户名’,

   sex                  tinyint not null comment ‘性别’,

   birthday             datetime not null comment ‘生日’,

   email                varchar(50) not null comment ‘邮箱’,

   tel                  int not null comment ‘手机’,

   intro                varchar(255) not null comment ‘个人简介’,

   primary key (ID)

)

type = MYISAM

default charset=utf8;

Continue reading

Mysql分区表的使用

by steve(chowhwei@gmail.com) on Dec 16, 2015
分区表可以解决按月和按id物理分表引起的表数量过多的问题,提供一定的查询便利,使用过程中需要遵循一些约定,以避免查询扩散到所有分区。
Continue reading

MySQL的表分区详解[转]

这篇文章主要介绍了MySQL的表分区,例如什么是表分区、为什么要对表进行分区、表分区的4种类型详解等,需要的朋友可以参考下

一、什么是表分区
通俗地讲表分区是将一大表,根据条件分割成若干个小表。mysql5.1开始支持数据表分区了。
如:某用户表的记录超过了600万条,那么就可以根据入库日期将表分区,也可以根据所在地将表分区。当然也可根据其他的条件分区。

二、为什么要对表进行分区
为了改善大型表以及具有各种访问模式的表的可伸缩性,可管理性和提高数据库效率。
分区的一些优点包括:
1)、与单个磁盘或文件系统分区相比,可以存储更多的数据。
2)、对于那些已经失去保存意义的数据,通常可以通过删除与那些数据有关的分区,很容易地删除那些数据。相反地,在某些情况下,添加新数据的过程又可以通过为那些新数据专门增加一个新的分区,来很方便地实现。通常和分区有关的其他优点包括下面列出的这些。MySQL分区中的这些功能目前还没有实现,但是在我们的优先级列表中,具有高的优先级;我们希望在5.1的生产版本中,能包括这些功能。
3)、一些查询可以得到极大的优化,这主要是借助于满足一个给定WHERE语句的数据可以只保存在一个或多个分区内,这样在查找时就不用查找其他剩余的分区。因为分区可以在创建了分区表后进行修改,所以在第一次配置分区方案时还不曾这么做时,可以重新组织数据,来提高那些常用查询的效率。
4)、涉及到例如SUM()和COUNT()这样聚合函数的查询,可以很容易地进行并行处理。这种查询的一个简单例子如 “SELECT salesperson_id, COUNT (orders) as order_total FROM sales GROUP BY salesperson_id;”。通过“并行”,这意味着该查询可以在每个分区上同时进行,最终结果只需通过总计所有分区得到的结果。
5)、通过跨多个磁盘来分散数据查询,来获得更大的查询吞吐量。

三、分区类型
· RANGE分区:基于属于一个给定连续区间的列值,把多行分配给分区。
· LIST分区:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。
· HASH分区:基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL 中有效的、产生非负整数值的任何表达式。
· KEY分区:类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL 服务器提供其自身的哈希函数。必须有一列或多列包含整数值。

1.RANGE分区
基于属于一个给定连续区间的列值,把多行分配给分区。这些区间要连续且不能相互重叠,使用VALUES LESS THAN操作符来进行定义。以下是实例。 Continue reading

深入了解MySQL分区功能[转]

MySQL 5.5的发布带来了许多增强的功能,虽然已经报道了很多增强功能,如半同步复制,但大家却忽略了分区方面的增强,有时甚至还对其真正意义产生了误解,在这篇文章中,我们希望解释一下这些很酷的增强,特别是我们大多数人还没有完全理解的地方。

MySQL 5.5分区增强

非整数列分区

任何使用过分区的人应该都遇到过不少问题,特别是面对非整数列分区时,MySQL 5.1只能处理整数列分区,如果你想在日期或字符串列上进行分区,你不得不使用函数对其进行转换。

MySQL 5.5中新增了两类分区方法,RANG和LIST分区法,同时在新的函数中增加了一个COLUMNS关键词。我们假设有这样一个表:

Select Code
1
2
3
4
5
CREATE TABLE expenses (  
  expense_date DATE NOT NULL,  
  category VARCHAR(30),  
  amount DECIMAL (10,3)  
);

如果你想使用MySQL 5.1中的分区类型,那你必须将类型转换成整数,需要使用一个额外的查找表,到了MySQL 5.5中,你可以不用再进行类型转换了,如:

Select Code
1
2
3
4
5
6
7
8
9
ALTER TABLE expenses  
PARTITION BY LIST COLUMNS (category)  
(  
  PARTITION p01 VALUES IN ( 'lodging', 'food'),  
  PARTITION p02 VALUES IN ( 'flights', 'ground transportation'),  
  PARTITION p03 VALUES IN ( 'leisure', 'customer entertainment'),  
  PARTITION p04 VALUES IN ( 'communications'),  
  PARTITION p05 VALUES IN ( 'fees')  
);

这样的分区语句除了更加易读外,对数据的组织和管理也非常清晰,上面的例子只对category列进行分区。

在MySQL 5.1中使用分区另一个让人头痛的问题是date类型(即日期列),你不能直接使用它们,必须使用YEAR或TO_DAYS转换这些列,如:

Select Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/* 在MySQL 5.1中*/  
CREATE TABLE t2  
(  
  dt DATE 
)  
PARTITION BY RANGE (TO_DAYS(dt))  
(  
  PARTITION p01 VALUES LESS THAN (TO_DAYS('2007-01-01')),  
  PARTITION p02 VALUES LESS THAN (TO_DAYS('2008-01-01')),  
  PARTITION p03 VALUES LESS THAN (TO_DAYS('2009-01-01')),  
  PARTITION p04 VALUES LESS THAN (MAXVALUE));  
 
SHOW CREATE TABLE t2 \G  
*************************** 1. row ***************************  
       Table: t2  
Create Table: CREATE TABLE `t2` (  
  `dt` date DEFAULT NULL 
) ENGINE=MyISAM DEFAULT CHARSET=latin1  
/*!50100 PARTITION BY RANGE (TO_DAYS(dt))  
(PARTITION p01 VALUES LESS THAN (733042) ENGINE = MyISAM,  
 PARTITION p02 VALUES LESS THAN (733407) ENGINE = MyISAM,  
 PARTITION p03 VALUES LESS THAN (733773) ENGINE = MyISAM,  
 PARTITION p04 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) */

看上去非常糟糕,当然也有变通办法,但麻烦确实不少。使用YEAR或TO_DAYS定义一个分区的确让人费解,查询时不得不使用赤裸列,因为加了函数的查询不能识别分区。

但在MySQL 5.5中情况发生了很大的变化,现在在日期列上可以直接分区,并且方法也很简单。

Select Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/*在MySQL 5.5中*/  
CREATE TABLE t2  
(  
  dt DATE 
)  
PARTITION BY RANGE COLUMNS (dt)  
(  
  PARTITION p01 VALUES LESS THAN ('2007-01-01'),  
  PARTITION p02 VALUES LESS THAN ('2008-01-01'),  
  PARTITION p03 VALUES LESS THAN ('2009-01-01'),  
  PARTITION p04 VALUES LESS THAN (MAXVALUE));  
 
SHOW CREATE TABLE t2 \G  
*************************** 1. row ***************************  
       Table: t2  
Create Table: CREATE TABLE `t2` (  
  `dt` date DEFAULT NULL 
) ENGINE=MyISAM DEFAULT CHARSET=latin1  
/*!50500 PARTITION BY RANGE  COLUMNS(dt)  
(PARTITION p01 VALUES LESS THAN ('2007-01-01') ENGINE = MyISAM,  
 PARTITION p02 VALUES LESS THAN ('2008-01-01') ENGINE = MyISAM,  
 PARTITION p03 VALUES LESS THAN ('2009-01-01') ENGINE = MyISAM,  
 PARTITION p04 VALUES LESS THAN (MAXVALUE) ENGINE = MyISAM) */

在这里,通过函数定义和通过列查询之间没有冲突,因为是按列定义的,我们在定义中插入的值是保留的。
Continue reading

PHP explode 分割空字符串

今天开发的时候偶然间遇到一个神奇的情况,当用explode分割一个空字符串的时候有可能会得到一个array(0=>”)这样的数组,对于处理后的数据使用起来非常的不方便,所以记录下,在explode之前先判断被分割的字符串是否为空

IOS App Store 服务端支付接口开发

首先 “苹果禁止在app中提供第三方支付” 所以但凡是做IOS App的,需要充值的地方都会遇到服务端充值的功能需要开发。

 

充值的大体流程是这样的,App内在购买成功后,会得到一个从苹果AppStore服务器得到一个本次交易数据的字符串,即收据(Receipt),Receipt中包含了本次交易的几乎所有信息,前面这部分的内容都是由App内实现,所以服务端不用去管。

 

App拿到Receipt之后,向应用的服务端(即用户自己的服务器)请求发送本次交易的Receipt及当前用户的唯一标识。服务端再从Receipt中获取到交易信息,并发往苹果的AppStore服务器验证交易信息的真伪,验证通过后则修改当前App用户的账户余额信息(为了防止越狱和IAP free等插件造成的欺诈性购买)。之后将增加后的用户余额信息返回给App引用,此时用户看到app上显示充值成功并且自己的账户余额也发生了变化。

 

与服务器端的通信,就是一个RPC的过程,服务器端写好一些供调用的API接口,在客户端联网调用,具体有什么xmlrpc, jsonrpc的,都有开源的框架可以使用。注意:客户端与游戏服务器端通信的时候,必需附带一个标识其身份的代码(UUID或者帐号名称),否则服务器端无法知道是谁进行了充值。
Continue reading

在程序员的眼里,用户是这样使用他们开发的软件的

看到一篇有趣的文章,转过来

 

我曾经说过,程序员不是一般的人,是具有某种超能里的人。但问题是,程序员往往意识不到 自己的这种特异功能,在他们的眼里,会认为自己很普通,跟常人一样,所以,程序员能做到的事情,其他人——比如他们的客户/软件用户——也应该很容易做 到。但事实上,由于大部分人——绝大部分人(包括软件开发公司的客户/购买软件的用户)——都是电脑小白(对电脑知识/计算机知识/软件知识知之甚少的 人)。一个对于程序员来说很显而易见的软件操作,换成让用户来操作,就会出现各种各样奇怪的事情。这让程序员非常痛苦。

记得有一次,一个客户打电话给我,说他电脑桌面上的大e找不到了,我没听懂,什么大e找不到了?客户解释说:就是那个长的像大个儿的英文字母e的图标找不到了。我倒。终于明白了他指的是桌面上的IE浏览器的图标不见了。

还有一次,有个客户提出一个需求,要求在页面上增加一个搜索功能,我问它,系统里有搜索功能,为什么还要在这个地方新增一个搜索功能,他说他要的不是那个 搜索,他要的是在这个页面上搜在某个关键词。经过进一步的沟通,我明白了,他要的是浏览器上的快捷键CTRL+F的功能。

因为用户的这些特征,导致了程序员认为完美的程序,到了客户的手里,却变成极其难用的软件,投诉电话如乡下骂街的泼妇似的响个不停。而事后分析发现,根本 原因都是应为程序员高估了用户对软件的掌控能力,低估了自己对软件的创造能力,于是导致了他们看这些客户使用他们开发的软件时,都是那样一种可笑的行为, 如下图:

在程序员的眼里,用户是这样使用他们开发的软件的

如果是脾气暴躁的程序员,遇到这种情况,难免会对着客户发一顿牢骚,而且,程序员的脾气一般都不是很好,所以,通常跟客户沟通时,项目经理一般都是跟着一起,以免事态激化。

用户虽然给程序员带来很多麻烦,但其实程序员的所有荣耀感都来自客户,因为只有客户用得满意,程序员才会有成就感。比如像下面这几个客户在使用一个新款软件时显露出来的表情,足够让一个处在北京重度雾霾的下午的程序员也能露出笑容:


用户在使用一款新软件时的样子

程序员虽然脾气不好,但他们都是为工作着想,不带任何个人恩怨。当开发软件有紧急任务 时,他们都是任劳任怨的加班加点,当在已经发布的软件中出现了重大bug时,他们都会深深在自责,会连夜赶制出紧急修复bug,如果不能在第一时间让用户 满意,他们会茶不思、饭不想、觉不睡。即使在实在没有短期内完整的补救措施的情况下,他们也会想出一些歪招,但也是行之有效的方案,让用户暂时度过难关。 比如,下面就是一个紧急修复补丁:


紧急修复补丁

用户应该体谅程序员。程序员的生活实际处在一种十分矛盾的状态中。编程不像其它行业,比 如泥瓦匠砌砖,砌一层砖,墙就会高一次。但编程不一样,有时候一个程序员写了一天的代码,急得满头大汗,但开发进度未必就有所进展,有时候甚至还会倒退。 软件编程是一个亦虚亦实的世界,有时候你搞不清一段代码为什么好用,有时候也会诧异由那样的代码构成的软件也能跑起来,正如下面这张图片中所示:


软件中有鬼

最后,说一下跟程序员打交道的一些注意事项。程序员因为整天和编程逻辑打交道,所以对因 果关系特别敏感。如果你的话语的因果关系不是很明确,这会让他们感到疑惑,如果你的话语的因果关系不完整,这会让他们办错事。如果你的话中有if,最好后 面用then做结束,或者用else给出选择,主语要明晰。如果不明晰,就会出现下图中出现的事故:


程序员是这样理解这个指示牌上的话的

如果你是一个程序员,你会理解我说的话。

App内置浏览器和被调用的html页面之间的js交互

之前一段时间公司花费了很长一段时间投入开发的App终于面世了,Android和IOS的各有一版,同时开发。Android App已经在各大App应用商店上架了,而IOS的还是依旧在一次次的卡审核,先默哀个!~

 

在最初的版本中,因为进度问题,部分页面采取了嵌套html页面的方法来处理(不过后来已经改成了全部原生App页面了),所以就多少会涉及到一些App和嵌套页面之间的JS交互问题。这里的JS交互主要指的是App调用html内的JS方法和页面内JS调用App的方法两个部分

 

相对而言,在Android的App内置浏览器嵌套的html页面中执行App的内置方法比ios的更加容易处理,就目前而言在Android上基本不用过多的特殊处理。而在IOS上就不一样了,IOS App中,App是可以直接调用被嵌套页面的JS方法的,但是反过来想要通过嵌套的Html页面来调用IOS App的开发就行不通了。这时候我们需要借助一个WebViewJavascriptBridge来实现处理了,附上WebViewJavascriptBridge的Git地址
Continue reading

js判断用户设备

从腾讯新闻站的页面源码上的找到的一段判断用户设备的js代码,主要思路还是根据用户的userAgent中的关键词来匹配判断用户当前的设备是什么。

Select Code
1
2
3
if(!/Android|webOS|iPhone|Windows Phone|iPod|BlackBerry|SymbianOS/i.test(navigator.userAgent)){
window.location.href = 'xxxx.ccc';
}

按需食用,可自行根据需要修改匹配字段中的关键字来取舍平台,比如自己的网站出了款ios的app,暂时没有安卓的,那么就可以把规则中的除‘iPhone|iPad|iPod’之外的设备关键词全都去掉,然后将if判断中的代码替换成加载展示某个浮动层提示用户可下载IOS的App。

另外推荐一个js库“https://github.com/matthewhudson/device.js”

Device.js 通过操作系统(比如 iOS,安卓,黑莓,Windows,Firefox OX),方向(横屏或者竖屏),类型(平板或者移动设备),比如在 iPhone 上的浏览的时候在添加的 CSS Class为‘ios iphone mobile’,前端开发者可以根据这些顶层class的不同针对不同的系统写出各自适配的样式。

© 2017 CheungQ

Theme by Anders NorenUp ↑