,从一开始就进行数据字典的维护 尽量控制单表数据量的大小在500w以内,超过500w可以使用历史数据归档,分库分表来实现(500万行并不是MySQL数据库的限制。...MySQL没有对存储有限制,取决于存储设置和文件系统) 谨慎使用mysql分区表(分区表在物理上表现为多个文件,在逻辑上表现为一个表) 谨慎选择分区键,跨分区查询效率可能更低 建议使用物理分表的方式管理大数据...列限制好处:减少磁盘io,保证热数据的内存缓存命中率,避免读入无用的冷数据) 禁止在表中建立预留字段(无法确认存储的数据类型,对预留字段类型进行修改,会对表进行锁定) 禁止在数据中存储图片,文件二进制数据...(使用文件服务器) 禁止在线上做数据库压力测试 禁止从开发环境,测试环境直接连生产环境数据库 限制每张表上的索引数量,建议单表索引不超过5个(索引会增加查询效率,但是会降低插入和更新的速度)...在varchar字段上建立索引时,必须指定索引长度,没必要对全字段建立索引,根据实际文本区分度决定索引长度即可。
使用压缩存储 列存储表具有压缩优势。 在CREATE TABLE时使用WITH子句指定表的存储模式。...一个已分区表上的主键或者唯一约束必须包含所有的分区列。一个唯一索引可以忽略分区列,但是它只能在已分区表的每个部分而不是整个已分区的表上被强制。...要在一个被分区的表上创建索引,就在用户创建的分区表上创建一个索引。该索引会被传播到Greenplum数据库所创建的所有子表上。不支持在Greenplum数据库为分区表创建的子表上创建索引。...只有索引键的列与Greenplum分布键相同(或者是其超集)时,Greenplum数据库才允许唯一索引。在追加优化表上不支持唯一索引。在分区表上,唯一索引无法在一个分区表的所有子表分区之间被实施。...测试并且比较使用索引和不使用索引的查询性能。只有被索引列的查询性能有提升时才增加索引。 创建一个索引 CREATE INDEX命令在一个表上定义一个索引。
,如果存储的数据重复度很低(也就是说基数很大),对该列数据以等值查询为主,没有范围查询、没有排序的时候,特别适合采用哈希索引,例如这种SQL: select id,name from table where...2、利用索引中的附加列,您可以缩小搜索的范围,但使用一个具有两列的索引 不同于使用两个单独的索引。...分表与分区的区别在于:分区从逻辑上来讲只有一张表,而分表则是将一张表分解成多张表。 十二、表分区有什么好处? 1、分区表的数据可以分布在不同的物理设备上,从而高效地利用多个硬件设备。 2....在where语句中包含分区条件时,可以只扫描一个或多个分区表来提高查询效率;涉及sum和count语句时,也可以在多个分区上并行处理,最后汇总结果。 3、分区表更容易维护。...,在查询和索引定义上有一定的影响; 避免表字段运行为null,建议设置默认值(例如:int类型设置默认值为0)在索引查询上,效率立显; 建立索引,最好建立在唯一和非空的字段上,建立太多的索引对后期插入、
,如果存储的数据重复度很低(也就是说基数很大),对该列数据以等值查询为主,没有范围查询、没有排序的时候,特别适合采用哈希索引,例如这种SQL: select id,name from table where...2、利用索引中的附加列,您可以缩小搜索的范围,但使用一个具有两列的索引 不同于使用两个单独的索引。...分表与分区的区别在于:分区从逻辑上来讲只有一张表,而分表则是将一张表分解成多张表。 十二、表分区有什么好处? 1、分区表的数据可以分布在不同的物理设备上,从而高效地利用多个硬件设备。2....在where语句中包含分区条件时,可以只扫描一个或多个分区表来提高查询效率;涉及sum和count语句时,也可以在多个分区上并行处理,最后汇总结果。 3、分区表更容易维护。...,在查询和索引定义上有一定的影响; 避免表字段运行为null,建议设置默认值(例如:int类型设置默认值为0)在索引查询上,效率立显; 建立索引,最好建立在唯一和非空的字段上,建立太多的索引对后期插入、
,如果存储的数据重复度很低(也就是说基数很大),对该列数据以等值查询为主,没有范围查询、没有排序的时候,特别适合采用哈希索引,例如这种SQL: # 仅等值查询 select id, name from...2、利用索引中的附加列,您可以缩小搜索的范围,但使用一个具有两列的索引不同于使用两个单独的索引。...分表与分区的区别在于:分区从逻辑上来讲只有一张表,而分表则是将一张表分解成多张表。 十二、表分区的好处 1、存储更多数据 分区表的数据可以分布在不同的物理设备上,从而高效地利用多个硬件设备。...2、优化查询 在where语句中包含分区条件时,可以只扫描一个或多个分区表来提高查询效率;涉及sum和count语句时,也可以在多个分区上并行处理,最后汇总结果。...,在查询和索引定义上有一定的影响; 避免表字段运行为null,建议设置默认值(例如:int类型设置默认值为0)在索引查询上,效率立显; 建立索引,最好建立在唯一和非空的字段上,建立太多的索引对后期插入、
2、利用索引中的附加列,您可以缩小搜索的范围,但使用一个具有两列的索引不同于使用两个单独的索引。...分区表的数据可以分布在不同的物理设备上,从而高效地利用多个硬件设备。和单个磁盘或者文件系统相比,可以存储更多数据 2、 优化查询 。...在where语句中包含分区条件时,可以只扫描一个或多个分区表来提高查询效率;涉及sum和count语句时,也可以在多个分区上并行处理,最后汇总结果。 3、 分区表更容易维护 。...纯粹基于锁的并发机制并发量低,MVCC是在基于锁的并发控制上的改进,主要是在读操作上提高了并发量。...,在查询和索引定义上有一定的影响; 避免表字段运行为null,建议设置默认值(例如:int类型设置默认值为0)在索引查询上,效率立显; 建立索引,最好建立在唯一和非空的字段上,建立太多的索引对后期插入、
实验论证 分别创建分区表和普通表 假设该表是用于存储学生信息的,其上共有四列: 第一列stu_year,表示学生的入学年份; 第二列stu_no,表示学号(5位序号),每年的新生都从00001开始; 第三列...从WHERE子句中去除分区键的条件 分区表查询用SQL: 在分区表上执行后,得到的执行计划和运行统计信息如下: 从上图可见,由于去除了分区键列条件,造成对分区表的扫描是要访问全部5个分区。...在stu_no学号列上创建索引 在分区表的STU_NO列上创建本地分区索引: 在分区表上执行后,得到的执行计划和运行统计信息如下: 如上图所示,只访问了单个分区(即第4个分区)。...那么,如果在分区表的STU_NO列上,创建一个非分区索引,还会有分区裁剪的作用吗? 首先,我们在STU_NO列上创建非分区索引。...由于此前已经在该列上创建过本地分区索引,所以,需要先把该索引删除后,才能创建同一列上的非分区索引。
索引设计 索引并不是越多越好,要根据查询有针对性的创建,考虑在WHERE和ORDER BY命令上涉及的列建立索引,可根据EXPLAIN来查看是否用了索引还是全表扫描。...长度小的列,索引字段越小越好,因为数据库的存储单位是页,一页中能存下的数据越多越好。 离散度大(不同的值多)的列,放在联合索引前面。...分区 可以让单表存储更多的数据。 分区表的数据更容易维护,可以通过清楚整个分区批量删除大量数据,也可以增加新的分区来支持新插入的数据。另外,还可以对一个独立分区进行优化、检查、修复等操作。...部分查询能够从查询条件确定只落在少数分区上,速度会很快。 分区表的数据还可以分布在不同的物理设备上,从而搞笑利用多个硬件设备。...如果分区字段中有主键或者唯一索引的列,那么所有主键列和唯一索引列都必须包含进来。 分区表无法使用外键约束。 NULL值会使分区过滤无效。 所有分区必须使用相同的存储引擎。
目的:分区的主要目的是为了在特定的SQL操作中减少数据读写的总量,从而缩减SQL语句的响应时间。同时,对于应用来说,分区是完全透明的。...列表分区(List Partitioning):基于预定义的值列表进行划分。适用于那些值具有离散特性的列。...哈希分区(Hash Partitioning):使用哈希函数对列值进行计算,然后根据结果分配到不同的分区。适用于数据分布较为均匀的场景。 3、分区查询的实现 创建分区表:在创建表时,需要指定分区策略。...1、创建分区表 在创建分区表时,需要在表定义中指定分区规则。...2、分表 经验法则:当单表的数据行数达到千万级别(例如,1000万行)或更高,或者表的大小达到几十GB甚至上百GB时,通常需要考虑分表。
3、分区表的数据可以分布在不同的机器上,从而高效适用资源。...4、可以使用分区表来避免某些特殊的瓶颈 5、可以备份和恢复独立的分区 限制 1、一个表最多只能有1024个分区 2、5.1版本中,分区表表达式必须是整数,5.5可以使用列分区 3、分区表字段如果有主键和唯一索引列...,那么主键列和唯一索引列都必须包含进来 4、分区表中无法使用外键约束 5、需要对现有表的结构进行修改 6、所有分区都必须使用相同的存储引擎 7、分区函数中可以使用的函数和表达式会有一些限制 8、某些存储引擎不支持分区...水平切分的缺点 1、给应用增加复杂度,通常查询时需要多个表名,查询所有数据都需UNION操作 2、在许多数据库应用中,这种复杂度会超过它带来的优点,查询时会增加读一个索引层的磁盘次数 垂直分表 把主键和一些列放在一个表...适用场景 1、如果一个表中某些列常用,另外一些列不常用 2、可以使数据行变小,一个数据页能存储更多数据,查询时减少I/O次数 缺点 管理冗余列,查询所有数据需要join操作 分表缺点 有些分表的策略基于应用层的逻辑算法
该列显示的为分区表命中的分区情况, 非分区表该字段为空(NULL). 5.type 最重要的一个指标, 显示查询使用了何种类型 除ALL之外, 其他type都可以用到索引; 除index_merge...存储引擎, 当查询的表只有一行或空表的情况下,type字段将是system....建议在explain时先去除limit 11.filtered 这个字段表示存储引擎返回的数据在server层过滤后, 剩下多少满足查询的记录数量的比例; 注意是百分比,不是具体记录数. 12....,效率最快 在带有order by子句的sql中,要尽可能使extra字段不要出现Using filesort,而是Using index 举例如何去掉 Using filesort: explain结果每个字段的含义说明...具有LIMIT和不具有LIMIT的ORDER BY可能是不同的 file_sort优化器会预先分配固定数量的sort_buffer_size字节。
3.使用枚举或整数代替字符串类型 4.尽量使用TIMESTAMP而非DATETIME 5.单表不要有太多字段,建议在20以内 6.用整型来存IP 索引 1.索引并不是越多越好,要根据查询有针对性的创建,...考虑在WHERE和ORDER BY命令上涉及的列建立索引,可根据EXPLAIN来查看是否用了索引还是全表扫描 2.应尽量避免在WHERE子句中对字段进行NULL值判断,否则将导致引擎放弃使用索引而进行全表扫描...MySQL实现分区的方式也意味着索引也是按照分区的子表定义,没有全局索引 用户的SQL语句是需要针对分区表做优化,SQL条件中要带上分区条件的列,从而使查询定位到少量的分区上,否则就会扫描全部分区,可以通过...EXPLAIN PARTITIONS来查看某条SQL语句会落在那些分区上,从而进行SQL优化,我测试,查询时不带分区条件的列,也会提高速度,故该措施值得一试。...另外,还可以对一个独立分区进行优化、检查、修复等操作 3.部分查询能够从查询条件确定只落在少数分区上,速度会很快 4.分区表的数据还可以分布在不同的物理设备上,从而搞笑利用多个硬件设备 5.可以使用分区表赖避免某些特殊瓶颈
一方面,因为MySQL的InnoDB引擎使用B+树维护索引,一个典型的索引节点大概可以存储60-120个数据记录,一个三层的索引大概可以存储百万条数据。...如果订单表增加一个数量级,索引的层数也需要增加,查询订单时磁盘的IO次数也随着增加,影响性能。 另一方面,为了加快查询效率,订单表通常需要创建一些索引。...在分区表中,每个分区实际上是一个独立的表,包含了与主表相同的列,并有一个特定的分区键,用于确定每行数据所属的分区。 分区表有哪些好处?...如果记录的值包含在列表中,那么记录将存储在相应的分区中。 KEY分区:类似于哈希分区,但不是基于哈希函数,而是根据列值上的一组键来执行分区。...创建分区表: 在创建分区表时,需要指定分区键,即表上哪一列的值作为分区依据。选择不同的分区类型将影响到后面的分区操作和存储方式。
图4:在线收集统计信息为新创建的sales2表提供表和列的统计信息收集 在线收集统计信息并不会收集直方图和索引统计信息,因为这些种类的统计信息需要额外的数据扫描,这可能在数据加载时对性能产生较大影响。...图5 : 设置选项为GATHER AUTO来创建 SALES2 表上的直方图, 而不涉及基本统计信息 注意列“HISTOGRAM_ONLY”指示在不重新收集列基本统计信息的情况下收集了直方图。...此过程将具有代表性的源 [sub] 分区的统计信息复制到新创建的和空的目标 [子] 分区中。 它还会拷贝相关对象的统计信息:列、本地(分区)索引等。...图9:读取数据字典,通过过滤器执行任务并存储结果 任务完成后,可以用html或文本格式生成报告,也可以创建操作( SQL)脚本。 ? 图10:报告advisor任务和生成操作SQL脚本。...在Schema:sh上Oracle将为每个非分区表创建一个统计收集作业(图12中的级别1); » CHANNELS » COUNTRIES » TIMES Oracle将为每个分区表创建一个协调作业
利用索引中的附加列,您可以缩小搜索的范围,但使用一个具有两列的索引 不同于使用两个单独的索引。...在where语句中包含分区条件时,可以只扫描一个或多个分区表来提高查询效率;涉及sum和count语句时,也可以在多个分区上并行处理,最后汇总结果。 分区表更容易维护。...什么是存储过程 简单的说,就是一组SQL语句集,功能强大,可以实现一些比较复杂的逻辑功能,类似于JAVA语言中的方法; ps:存储过程跟触发器有点类似,都是一组SQL集,但是存储过程是主动调用的,且功能比触发器更加强大...给表创建主键,对于没有主键的表,在查询和索引定义上有一定的影响。 避免表字段运行为null,建议设置默认值(例如:int类型设置默认值为0)在索引查询上,效率立显!...建立索引,最好建立在唯一和非空的字段上,建立太多的索引对后期插入、更新都存在一定的影响(考虑实际情况来创建)。
领取专属 10元无门槛券
手把手带您无忧上云