我最近一直在阅读有关可扩展架构的文章.在这种情况下,继续显示wrt数据库的两个词是分片和分区.我搜索了关于搜索引擎,维基百科和stackoverflow的描述,但最终仍然感到困惑.
stackoverflow的专家能帮助我掌握基础知识吗?
我试图掌握数据库分区的不同概念,这就是我对它的理解:
水平分区/分片:将表拆分到不同的表中,该表将包含初始表中的行的子集(如果按大陆分割Users表,我已经看到了很多示例,如北美的子表,另一个为欧洲等...).每个分区位于不同的物理位置(了解"机器").据我所知,水平分区和分片是完全相同的(?).
垂直分区:根据我的理解(http://technet.microsoft.com/en-us/library/ms178148%28v=sql.105%29.aspx),有两种垂直分区:
规范化(包括通过拆分表并使用外键链接来从数据库中删除冗余).
Row Splitting,这是我不明白的,Normalization和Row Splitting有什么区别?那两种技术在哪些方面有所不同?
我还读过这篇文章(数据库水平和垂直缩放之间的差异),水平分区和垂直分区之间的区别在于,您通过添加更多机器来扩展第一个,而在第二个中您通过添加更多功率进行扩展( CPU,RAM)到你现有的机器,是一个正确的定义?我认为这两种技术之间的核心区别在于您分割表格的方式.
对于大量问题我很抱歉,但是我有点困惑,因为我遇到的很多不同的网站都说不同的东西.
任何帮助澄清将不胜感激.任何带有几个表格的简单演示的链接也会非常有用.
database database-design sharding database-performance database-partitioning
我不确定使用非常常见的共享列值(如Country)作为复合主键的分区键还是相当独特的列值(如Last_Name),在性能方面是否更好.
看看Cassandra 1.2关于索引的文档,我得到了这个:
" 何时使用索引:Cassandra的内置索引最适合包含索引值的许多行的表.特定列中存在的唯一值越多,平均而言,查询和查询的开销就越大.维护索引.例如,假设您有一个拥有十亿用户的用户表,并希望按照他们所居住的状态查找用户.许多用户将共享相同的状态列值(例如CA,NY,TX等) .).这将是一个指数的良好候选人. "
" 何时不使用索引:不要使用索引来查询少量结果的大量记录.例如,如果在具有许多不同值的列上创建索引,则字段之间的查询将招致许多寻求极少数的结果.在该表中有一个十亿用户,查找通过他们的电子邮件地址(也就是通常是唯一针对每个用户的值)的用户,而不是由他们的状态,很可能是非常低效的.它可能会更有效地手动维护表作为索引的一种形式,而不是使用Cassandra内置索引.对于包含唯一数据的列,为方便起见,使用索引有时性能良好,只要查询量到具有索引列的表是适度的而不是在恒定负载下."
查看CQL的SELECT for 中的示例
" 查询复合主键和排序结果 ",我看到类似UUID的东西被用作分区键... 这表明最好使用一些相当独特的东西?

cassandra database-partitioning composite-primary-key database-indexes
我知道Django中的游标对象.在迁移中是否还有其他首选方法可以执行原始SQL?我想为我的一个模型表引入postgresql分区.分区逻辑是一系列功能和触发器,必须在我想要自动化的设置中添加到数据库中.
我有一个包含时间戳列的日志文件.时间戳采用unix纪元时间格式.
我想基于具有分区年,月和日的时间戳创建分区.
到目前为止,我已经做到了这一点,但它正在抛出错误.
PARSE ERROR cannot recognize input '(' in column type
Run Code Online (Sandbox Code Playgroud)
这是我的代码.
from (
from raw_data
MAP ${PREFIX}raw_data.line
USING 's3://scripts/clean.py'
AS (timestamp STRING, name STRING)
) map_out
INSERT OVERWRITE TABLE date_base_data_temp PARTITION(year(timestamp), month(timestamp)), day(timestamp)))
select map_out.name;
Run Code Online (Sandbox Code Playgroud) 我有一张桌子:
create table registrations(
id int not null auto_increment primary key,
name varchar(50),
mobile_number varchar(13))
engine=innodb
partition by range(id) (
partition p0 values less than (10000),
partition p0 values less than (20000),
partition p0 values less than max value);
Run Code Online (Sandbox Code Playgroud)
不完全像上面那样但与......相似
现在假设我的表有200000行,现在我想删除表上的分区,并根据要求重新组织它们,而不包含MAX VALUE.
任何人都可以帮我重新排列分区而不丢弃数据或删除表并重新创建它吗?
mysql sql database database-administration database-partitioning
我正在运行配置单元071,处理具有以下目录布局的现有数据:
-TableName
- d =(例如2011-08-01)
- d = 2011-08-02
- d = 2011-08-03
...等
在每个日期下我都有日期文件.
现在加载我正在使用的数据
CREATE EXTERNAL TABLE table_name (i int)
PARTITIONED BY (date String)
LOCATION '${hiveconf:basepath}/TableName';**
Run Code Online (Sandbox Code Playgroud)
我希望我的hive脚本能够根据一些输入日期和天数加载相关分区.所以如果我通过date ='2011-08-03'和days ='7'
脚本应加载以下分区
- d = 2011-08-03
- d = 2011-08-04
- d = 2011-08-05
- d = 2011-08-06
- d = 2011-08-07
- d = 2011-08-08
- d = 2011-08-09
除了明确地运行之外,我没有找到任何方法来做到这一点:
ALTER TABLE table_name ADD PARTITION (d='2011-08-03');
ALTER TABLE table_name ADD PARTITION (d='2011-08-04');
ALTER TABLE table_name ADD …Run Code Online (Sandbox Code Playgroud) 我在我正在处理的应用程序中遇到了一些代码,它只是为了调用UUID字符串上的ORA_HASH函数(文档)而进行数据库调用.它这样做的原因是它需要值来对另一个似乎ORA_HASH用于分区的系统进行服务调用.
我想知道算法的ORA_HASH使用,以便我可以重新实现它,以便为一个无法访问真实数据库的应用程序进行类似的服务调用,更不用说Oracle了.到目前为止,我只能找到相当于Oracle API文档的内容.
只是要非常明确:我需要克隆,ORA_HASH因为这是我控制之外的另一个系统所使用的,我需要与该系统集成.是的,如果可以使用真正标准的算法,如MD5 ,那将是很好的,但我不能,除非这ORA_HASH是在幕后的内容.
建议使用散列算法的答案或注释ORA_HASH无济于事.这个问题具体是关于ORA_HASH,而不是一般的散列或分区.
我想通过datetime列对mysql表进行分区.有一天分区.创建表脚本是这样的:
CREATE TABLE raw_log_2011_4 (
id bigint(20) NOT NULL AUTO_INCREMENT,
logid char(16) NOT NULL,
tid char(16) NOT NULL,
reporterip char(46) DEFAULT NULL,
ftime datetime DEFAULT NULL,
KEY id (id)
) ENGINE=InnoDB AUTO_INCREMENT=286802795 DEFAULT CHARSET=utf8
PARTITION BY hash (day(ftime)) partitions 31;
Run Code Online (Sandbox Code Playgroud)
但是当我选择某天的数据时,它找不到分区.select语句是这样的:
explain partitions select * from raw_log_2011_4 where day(ftime) = 30;
Run Code Online (Sandbox Code Playgroud)
当我使用另一个语句时,它可以找到分区,但我没有选择某天的数据.
explain partitions select * from raw_log_2011_4 where ftime = '2011-03-30';
Run Code Online (Sandbox Code Playgroud)
有没有人告诉我如何选择某天的数据并利用分区.谢谢!