Mysql表分区的选择与实践小结
2019独角兽企业重金招聘Python工程师标准>>>
在一些系统中有时某张表会出现百万或者千万的数据量,尽管其中使用了索引,查询速度也不一定会很快。这时候可能就需要通过分库,分表,分区来解决这些性能瓶颈。
一. 选择合适的解决方法
1. 分库分表。
分库分表从名字上就明白是需要创建额外的新数据库或新表,可以建在其他的机器上也可以是和当前数据库同一台机器。在优化查询上可能需要买新机器或者要修改逻辑代码了。比如一张user表,当数据超过10W,就可以创建新的user表,假设是user2。通过接收的UID,和分组10W(假定),取模就是对应的user表名的索引数字。
2. 分区。
分区这里是指表分区,mysql数据库管理系统提供的表功能,分区后逻辑上是同一张表,物理上数据存储是分开的。能否优化查询还取决于在查询中是否使用到了分区字段,这个就和索引的使用有点类似,但是好处就是这个不像分库分表,可以几乎不修改业务逻辑代码就可以提升速度。下面再总结一下mysql数据保存格式和innodb,myisam。
2.1. innodb存储引擎。
innodb,支持事务处理,外来键,在查询方面要慢于myisam。对并发友好,支持行锁和表锁,行锁的形成要看查询条件。有共享空间结构和独立空间结构,保存的格式有frm和ibddata1(共享结构),ibd(独立结构)。
2.1.1.共享空间结构。
共享结构为innodb默认的结构,除了frm保存innodb表结构外,整个数据库所有表的索引和数据源都保存在ibdata中。可以通过在mysql-ini中添加 innodb_file_per_table=1设置为独立空间结构。
2.1.2.独立空间结构。
独立空间结构就是每个对应的表保存对应的数据源和索引在一个后缀为ibd的文件中,表结构同样也保存在frm中。
2.2. myisam存储引擎
myisam是mysql默认存储引擎,不支持事务,但是会对I/O进行平均分配,相较于innodb查询速度要快,对并发不友好,支持表锁。格式frm同样也是表结构,myd为表的数据源,myi表的索引储存(所以一张表的索引不是越多越好,因为在添加和修改数据时也需要对索引库进行修改和添加)
二. 表分区的几种分区类型。
1. RANGE分区:基于属于一个给定连续区间的列值,把多行分配给分区。
2. LIST分区:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。
3. HASH分区:基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL 中有效的、产生非负整数值的任何表达式。
4. KEY分区:类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL服务器提供其自身的哈希函数。必须有一列或多列包含整数值。
具体介绍可以搜索以下"mysql表分区的分区类型"。
三. 表分区的创建。
par格式为保存的是分区的规则,ibd就是分别为每一块分区后的数据源,以下为innodb分区,myisam的是有多个myd文件同时也存在par。
1. 新建表时添加分区。
比如以下创建一张employees 的表,并创建了list类型的4个分区,以store_id 字段为分区字段。
CREATE TABLE employees (id INT NOT NULL,fname VARCHAR(30),lname VARCHAR(30),hired DATE NOT NULL DEFAULT '1970-01-01',separated DATE NOT NULL DEFAULT '9999-12-31',job_code INT,store_id INT
)PARTITION BY LIST(store_id)PARTITION pNorth VALUES IN (3,5,6,9,17),PARTITION pEast VALUES IN (1,2,10,11,19,20),PARTITION pWest VALUES IN (4,12,13,14,18),PARTITION pCentral VALUES IN (7,8,15,16)
);
2. 存在的表添加分区
将原来的数据以当前的分区规则对原来数据进行规整,以下是对ztest表添加range类型的3个分区,以id字段为分区字段。
alter table rm_ztest partition by RANGE (id)
(PARTITION p0 VALUES LESS THAN (948), PARTITION p1 VALUES LESS THAN (960),PARTITION p3 VALUES LESS THAN MAXVALUE
)
3. navicat for mysql工具添加或创建。
平时我使用上面的工具比较多,所以他也有一个添加分区的功能。"新建表"或者是"设计表",点击"选项",“分割区”就可以进入分区的创建了。
四. 分区查询的实验结果。
我就拿了一张几百万数据的表备份了副本,其中一张创建了分区,并使用id分区字段进行查询。
从上面两张截图可以看出使用了分区的查询速度要比未使用分区快差不多1倍,但是如果不使用id为查询条件或没有使用到,速度二者是一样的,甚至有时分区过的还要慢于未分区的,所以在使用上还需结合当前业务做合理的选择。
explain partitions select * from table_name …… 可以查看当前查询是否使用了分区,分区使用的是哪几个等等信息。
公众号
转载于:https://my.oschina.net/u/2456768/blog/3040505
Mysql表分区的选择与实践小结相关推荐
- mysql 添加分区_创建,增加,删除mysql表分区
1.测试添加分区和删除分区 ###添加删除range分区 (1)创建一个分区: CREATE TABLE titles ( emp_no INT NOT NULL, title ...
- MySQL 表分区详解MyiSam引擎和InnoDb 区别(实测)
MySQL 表分区详解MyiSam引擎和InnoDb 区别(实测) 一.什么是表分区 通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysql5.1开始支持数据表分区了. 如:某用户表的记录超过 ...
- mysql 表分区、按时间函数分区、删除分区、自动添加表分区
mysql 表分区的几种方式: RANGE分区:基于属于一个给定连续区间的列值,把多行分配给分区. LIST分区:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进 ...
- MySql表分区介绍
一.什么是表分区 表分区就是就是把表的数据切分成不同的块进行存储,可以存储在不同的文件系统.而用户所选择的.实现数据分割的规则被称为分区函数,这在MySQL中它可以是模数,或者是简单的匹配一个连续的数 ...
- maxvalue mysql自动分区_创建mysql表分区的方法
创建 mysql 表分区的方法 我来给大家介绍一下 mysql 表分区创建与使用吧,希望对各位同学会有所帮助.表分区的测试使用,主要内容来自 于其他博客文章以及 mysql5.1 的参考手册. 表分区 ...
- mysql分区表优缺点,Mysql 表分区和性能
以下内容节选自 mysql表分区: 分区功能并不是所有存储引擎都支持的,如CSV.MERGE等就不支持.mysql数据库支持的分区类型为水平分区(指一张表中不同行的记录分配到不同的物理文件中),不支持 ...
- 处理Zabbix历史数据库办法二---使用MySQL表分区
一 应用场景描述 http://john88wang.blog.51cto.com/2165294/1770582 在前面介绍可以通过创建新表然后导入一个月内的数据到新表,最后删除旧表的方法来处理历史 ...
- mysql 支持分区表,mysql表分区的限制
头一次使用mysql表分区,遇到不少的问题,现在总结下遇到的问题和解决方案. 1.如果分区值类型不是整型值,会出现如下错误: [Err] 1697 - VALUES value for partiti ...
- MySQL表分区细节逻辑
MySQL表分区细节逻辑 一.建表时进行分区 二.建表后进行分区(消耗资源巨大) 一.建表时进行分区 Range分区表建表语句如下,其中分区键必须和id构成主键和唯一键: create table i ...
最新文章
- python嵩天课后思考题_Python语言程序设计基础(第二版)嵩天等课后习题答案
- 刚发现的 Wi-Fi 安全漏洞,可能危及全球所有设备!
- Ganglia 调试技巧
- Cold-Staking | TPoS vs LPoS vs DPoS
- CENTOS6.4安装vnc-server
- 美团点评容器平台HULK的调度系统
- Java用户修改密码
- Shell shift的使用方法
- Java虚拟机(十一)——执行引擎
- 第 1 章 课程概述
- 查询存储过程,数据库对象的创建历史
- HtmlCleaner CleanerProperties 参数配置(转自macken博客,链接:http://macken.iteye.com/blog/1579809)...
- 【CoRL 2018】通过元策略优化的MBRL算法
- 【转】 测试人员的职业规划 --整理标注
- kubernetes视频教程笔记 (18)-service
- wps个人免费版支持宏操作
- html中pt与px的转换,ptpx换算(pt和像素换算)
- 究竟云计算就业前景好不好 零基础如何学云计算
- 6.11 通过文件描述符来获取信号
- 美国大学计算机专业排名2014,2014年USNews美国大学计算机专业研究生排名
热门文章
- 位图索引(bitmap index)冲突引起的TX锁争用
- centOS 5.5 安装 ORACLE 11G RAC 问题汇总
- AndroidManifest中activity属性设置大全
- android jni 返回java类
- android getMemoryClass()的使用
- android hardware architecture
- 【Android】launcher启动参数
- Chrome Native Client 原理
- 找不到 javax.servlet.http.HttpServletResponse 和 javax.servlet.http.HttpServletRequest 问题解决...
- stm32f405xx.h头文件的问题Undefined symbol IS_TIM_BREAK_INSTANCE