mysql表分区

订单表优化方案

别等时光非礼了梦想. 提交于 2019-12-03 07:59:45
目录 1 背景 2 常用思路 2.1 单表分区 2.2 大表分表 2.3 业务分库 2.4 读写分离和集群 2.5 热点缓存 2.6 用ES代替DB 3 订单表优化方案 3.1 业务分析 3.2 分区方案(order_sku/order_product_attr/order_sku_epay) 3.2 历史表+分区方案(order_info) 附录 1 背景 随着用户不断下单,DB订单表和订单附属表的单表记录数过大,影响到前端和管理系统拉取订单列表的性能。单表最大多少行合适与具体业务有关,难以下定论,但一般推荐不要超过1千万行,之后单表的性能下降会比较明显。 本文档整理了数据库大表优化的一些常用思路的原理,最后针对订单表提出优化方案。 2 常用思路 单表分区 大表分表 业务分库 读写分离和集群 热点缓存 用ES代替DB 2.1 单表分区 什么是分区? 就是将一张表的单个大文件,按一定逻辑拆分成多个物理的区块文件。对于应用程序来说,还是一张整表;但底层实际上是由多个物理区块组成。目前主流的DB如Oracle、MySql等都有成熟的方案支持分区 MySql支持哪些分区类型? range分区:根据key的范围来分区,比如日志表,可以按天或按月分区 list分区:根据key的枚举值分区,比如以订单状态为key,待付款、待发货、待收货等分别建立一个分区 hash分区:给定分区数

MySql―分区表【应用场景/局限性/实现原理/使用教程/实际测试】

匿名 (未验证) 提交于 2019-12-02 22:06:11
一.概述 之所以接触到Mysql表分区,是缘由最近客户公司运营自去年,数据量曾几何暴增,导致表数据非常的庞大,一张表有上亿数据行不止。普通MySql优化,如关键字段索引,字段优化,查询语句优化也已经远远满足不了需求。前期经过开会商讨,给予的方案是:①数据库上:按月建立分表,按年建立分库;②客户端:默认显示当月数据,实现按月查询 ③服务端:按日期进行建表/查表,及相应数据的改/删。此方案基本解决了客户端用户的体验,但是对于针对个别用户要进行数据校验,就要进行从年库汇总,还要从月库汇总累加,服务端代码量的修改,及业务逻辑十分复杂。此时便萌生我们的MySql有没有为我们提供此问题的解决方案,通过了解,查到MySQL--分区表的相关知识。 二.应用场景/为什么要进行分区/优点(MySQL版本在5.1及以上) ①对于那些已经失去保存意义的数据,通常可以通过删除与那些数据有关的分区,很容易地删除那些数据。相反地,在某些 情况下,添加新数据的过程又可以通过为那些新数据专门增加一个新的分区,来很方便地实现。 ②与单个磁盘或文件系统分区相比,可以存储更多的数据。 ③一些查询可以得到极大的优化,这主要是借助于满足一个给定WHERE语句的数据可以只保存在一个或多个分区内,这样 在查找时就不用查找其他剩余的分区。因为分区可以在创建了分区表后进行修改,所以在第一次配置分区方案时还不曾这 么做时

MySQL-表分区

匿名 (未验证) 提交于 2019-12-02 22:06:11
一、表分区介绍 1.1、简单介绍 1)表分区是将一个表的数据按照一定的规则 水平划分 为不同的逻辑块,并分别进行物理存储,这个规则就叫做 分区函数 ,可以有不同的分区规则 2)通过 show plugins 语句查看当前MySQL是否支持表分区功能 mysql > show plugins ; +----------------------------+----------+--------------------+---------+---------+ | Name | Status | Type | Library | License | +----------------------------+----------+--------------------+---------+---------+ | binlog | ACTIVE | STORAGE ENGINE | NULL | GPL | | mysql_native_password | ACTIVE | AUTHENTICATION | NULL | GPL | | sha256_password | ACTIVE | AUTHENTICATION | NULL | GPL | | PERFORMANCE_SCHEMA | ACTIVE | STORAGE ENGINE | NULL | GPL | | MRG

mysql 表分区、按时间函数分区、删除分区、自动添加表分区

匿名 (未验证) 提交于 2019-12-02 22:02:20
mysql 表分区的几种方式: RANGE分区:基于属于一个给定连续区间的列值,把多行分配给分区。 LIST分区:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。 HASH分区:基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL中有效的、产生非负整数值的任何表达式。 KEY分区:类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL服务器提供其自身的哈希函数。必须有一列或多列包含整数值。 常用的按时间分区可以按照年、月、日等条件用来分区,因为是按时间条件分区所以选用RANGE分区方式。 分区的切条件判断: LESS THAN:如果是数值就是小于等于,时间则是小于。 LESS THAN MAX:不等于。 IN:包含于某某区间。 按实际分区的时间函数选用: 按日分区切分时的条件可以用day()、to_days()时间函数,需要注意的是必须是返回值是整形的。 按月分区采用month()时间函数; 其他条件分区时间函数可到我关于时间函数的博文查看: https://blog.csdn.net/qq_36216193/article/details/90404527 其中按时间字段create_date按天分区,首先需要把date字段改成主键

mysql创建表分区

江枫思渺然 提交于 2019-12-01 22:47:39
MySQL创建表分区 create table erp_bill_index( id int primary key auto_increment, addtime datetime ); insert into erp_bill_index(addtime) values ('2018-02-01 12:00:00'), ('2018-03-01 12:00:00'), ('2018-04-01 12:00:00'), ('2018-05-01 12:00:00'), ('2018-06-01 12:00:00'), ('2018-07-01 12:00:00'), ('2018-08-01 12:00:00'), ('2018-09-01 12:00:00'), ('2018-10-01 12:00:00'), ('2018-11-01 12:00:00'), ('2018-12-01 12:00:00'), ('2019-01-01 12:00:00'), ('2019-02-01 12:00:00'), ('2019-03-01 12:00:00'), ('2019-04-01 12:00:00'), ('2019-05-01 12:00:00'), ('2019-06-01 12:00:00'), ('2019-07-01 12:00:00'), ('2019-08-01

MySQL-表分区

岁酱吖の 提交于 2019-12-01 01:50:44
一、表分区介绍 1.1、简单介绍 1)表分区是将一个表的数据按照一定的规则 水平划分 为不同的逻辑块,并分别进行物理存储,这个规则就叫做 分区函数 ,可以有不同的分区规则 2)通过 show plugins 语句查看当前MySQL是否支持表分区功能 mysql> show plugins; +----------------------------+----------+--------------------+---------+---------+ | Name | Status | Type | Library | License | +----------------------------+----------+--------------------+---------+---------+ | binlog | ACTIVE | STORAGE ENGINE | NULL | GPL | | mysql_native_password | ACTIVE | AUTHENTICATION | NULL | GPL | | sha256_password | ACTIVE | AUTHENTICATION | NULL | GPL | | PERFORMANCE_SCHEMA | ACTIVE | STORAGE ENGINE | NULL | GPL | | MRG

单表数据量超过千万的优化方案

有些话、适合烂在心里 提交于 2019-11-30 13:58:14
1. 数据库设计和表创建时就要考虑性能 2.sql 的编写需要注意优化 4. 分区 4. 分表 5. 分库 数据库设计和表创建时就要考虑性能 设计表时要注意: 表字段避免null值出现,null值很难查询优化且占用额外的索引空间,推荐默认数字0代替null。 尽量使用INT而非BIGINT,如果非负则加上UNSIGNED(这样数值容量会扩大一倍),当然能使用TINYINT、SMALLINT、MEDIUM_INT更好。 使用枚举或整数代替字符串类型 尽量使用TIMESTAMP而非DATETIME 单表不要有太多字段,建议在20以内 用整型来存IP 索引 索引并不是越多越好,要根据查询有针对性的创建,考虑在WHERE和ORDER BY命令上涉及的列建立索引,可根据EXPLAIN来查看是否用了索引还是全表扫描 应尽量避免在WHERE子句中对字段进行NULL值判断,否则将导致引擎放弃使用索引而进行全表扫描 值分布很稀少的字段不适合建索引,例如"性别"这种只有两三个值的字段 字符字段只建前缀索引 字符字段最好不要做主键 不用外键,由程序保证约束 尽量不用UNIQUE,由程序保证约束 使用多列索引时主意顺序和查询条件保持一致,同时删除不必要的单列索引 简言之就是使用合适的数据类型,选择合适的索引 # 选择合适的数据类型 ( 1 )使用可存下数据的最小的数据类型,整型 < date,time <

TokuDB · 引擎特性 · HybridDB for MySQL高压缩引擎TokuDB 揭秘

半腔热情 提交于 2019-11-28 21:48:31
原文出处: 阿里云RDS-数据库内核组 HybridDB for MySQL(原名petadata)是面向在线事务(OLTP)和在线分析(OLAP)混合场景的关系型数据库。HybridDB采用一份数据存储来进行OLTP和OLAP处理,解决了以往需要把一份数据多次复制来分别进行业务交易和数据分析的问题,极大地降低了数据存储的成本,缩短了数据分析的延迟,使得实时分析决策称为可能。 HybridDB for MySQL兼容MySQL的语法及函数,并且增加了对Oracle常用分析函数的支持,100%完全兼容TPC-H和TPC-DS测试标准,从而降低了用户的开发、迁移和维护成本。 TokuDB是TokuTek公司(已被 Percona收购)研发的新引擎,支持事务/MVCC,有着出色的数据压缩功能,支持异步写入数据功能。 TokuDB索引结构采用fractal tree数据结构,是buffer tree的变种,写入性能优异,适合写多读少的场景。除此之外,TokuDB还支持在线加减字段,在线创建索引,锁表时间很短。 Percona Server和Mariadb支持TokuDB作为大数据场景下的引擎,目前官方MySQL还不支持TokuDB。ApsaraDB for MySQL从2015年4月开始支持TokuDB,在大数据或者高并发写入场景下推荐使用。 TokuDB优势 数据压缩

Hive表的查询、创建、加载

若如初见. 提交于 2019-11-28 07:18:29
前言 hive中操作hdfs上的数据可以像操作mysql数据库一样方便轻松,避免编写mapreduce程序,又提高了数据分析查询的速度和效率,下面就来总结一下自己前些天学的表的DDL 其实和mysql差不多 但是有一点需要注意,hive是读检查,写不检查,也就是是hive在你查询的时候才验证数据的有效性,加载数据时不检查,直接加载,这样的好处是加快了处理数据的速度,如果数据量很大,加载是检查会严重拖慢速度 Hive数据类型 string int double timestamp时间 struct map array 数据库 : create database db1 location '/path' comment '描述' location代表指定数据库在dfs上的位置,其实就是创建了一个文件夹,不加也可以 用默认的位置 alert database db1 set xxx 更改数据库 drop database db1 CASCADE 删除数据库包括里面的表 show databases like 正则表达式 列出数据库 表 表分为内部表(受控表) 、外部表、临时表(创建时加TEMPORARY即可,退出客户端表即消失)。 外部表drop的时候只删除结构 不删除数据 并且可以指定表的目录(其实也就是数据的存放目录),可以用来备份数据用 create external t1(id

数据库分表分区

你说的曾经没有我的故事 提交于 2019-11-28 05:51:21
概念 分表:分表就是将一张表分成N张小表, 分区:就是将一张表的数据分成N个区块,这些区块可以放在一个磁盘上.一张表主要对应三个文件: frm:存放表结构 myd:存放表数据 myi:存放索引的 如果一张表数据量太大了的话,那么myd 和 myi 就会变的很大,那么我们在查询数据的时候就会很慢,所以这个时候我们就可对其进行表,在物理上将这一张表对应的三个文件,分割成多个小块,这时在查询某一条数据的时候,不用查找全部的数据,只用找到这条数据在哪儿一块儿,然后找到对应的那一块儿就行了.如果一张表的数据太大,可能一个磁盘放不下,这个时候,我们就可以把数据分配到不同的磁盘里面去了. 如何分表 分表的方式有两种: 水平分割(横向分割) 就是横着来分区,比如有100w条数据,分成10份,每一份存放在一个区,而每一区中都包含分区之前表中的所有字段. 垂直分割(纵向分割) 就是竖着来分区了.出现这种情况的原因很多时候是因位数据表在前期设计的时候每有考虑好,导致了这张表中的字段太多了.有些字段可以不经常用也放在一张表中,所有我们可以将这些字段分开来. 数据方面 分表后,数据都存放在分表中,以前的表就是一空壳,村塾数据发生在一个一个分表中, 分区后,没有分表的概念,分区只是包存放数据的文件分成了许多小块,分区之后的表还是一张表. 意义–提高性能 分表:单表并发能力提高了,因为查询一次的所用时间缩短了