文章插图
如果sql语句有问题,那么会走所有区 。会很危险 。所以分区表后,select语句必须走分区键 。
以下3种不是太常用,就一笔带过了 。
LIST分区
LIST分区和RANGE分区很相似,只是分区列的值是离散的,不是连续的 。LIST分区使用VALUES IN,因为每个分区的值是离散的,因此只能定义值 。
HASH分区
说到哈希,那么目的很明显了,将数据均匀的分布到预先定义的各个分区中,保证每个分区的数量大致相同 。
KEY分区
KEY分区和HASH分区相似,不同之处在于HASH分区使用用户定义的函数进行分区,KEY分区使用数据库提供的函数进行分区 。
四.分区和性能
一项技术,不是用了就一定带来益处 。比如显式锁功能比内置锁强大,你没玩好可能导致很不好的情况 。分区也是一样,不是启动了分区数据库就会运行的更快,分区可能会给某些sql语句性能提高,但是分区主要用于数据库高可用性的管理 。数据库应用分为2类,一类是OLTP(在线事务处理),一类是OLAP(在线分析处理) 。
对于OLAP应用分区的确可以很好的提高查询性能,因为一般分析都需要返回大量的数据,如果按时间分区,比如一个月用户行为等数据,则只需扫描响应的分区即可 。在OLTP应用中,分区更加要小心,通常不会获取一张大表的10%的数据,大部分是通过索引返回几条数据即可 。
比如一张表1000w数据量,如果一句select语句走辅助索引,但是没有走分区键 。那么结果会很尴尬 。如果1000w的B+树的高度是3,现在有10个分区 。那么不是要(3+3)*10次的逻辑IO?(3次聚集索引,3次辅助索引,10个分区) 。所以在OLTP应用中请小心使用分区表 。
在日常开发中,如果想查看sql语句的分区查询结果可以使用explain partitions + select sql来获取,partitions标识走了哪几个分区 。
mysql> explain partitions select * from TxnList where startTime> '2016-08-25 00:00:00'andstartTime< '2016-08-25 23:59:00';
+----+-------------+-------------------+------------+------+---------------+------+---------+------+-------+-------------+
| id |select_type | table |partitions | type |possible_keys | key |key_len | ref |rows | Extra |
+----+-------------+-------------------+------------+------+---------------+------+---------+------+-------+-------------+
| 1 |SIMPLE | ClientActionTrack |p20160825 | ALL |NULL | NULL |NULL | NULL |33868| Using where |
+----+-------------+-------------------+------------+------+---------------+------+---------+------+-------+-------------+
row inset ( 0. 00sec)
参考:
《MySQL技术内幕》
【彻底搞懂MySQL分区】
推荐阅读
- MySQL数据库下的Explain命令深度解析
- 一文搞懂SQL中的所有JOIN
- 如何解决网站访问慢-MySQL负载高
- MySQL, PostgreSQL CentOS常用数据库安装和python使用
- 一口气搞懂“质量”
- 怎样才能安装和彻底卸载Mac软件?
- Docker 安装 Nginx、PHP、MySQL、Tomcat、Python、Redis、Apache
- 抑郁症能否彻底治好 抑郁症有什么办法可以治好
- MySQL 8.0:字符集从 utf8 转换成 utf8mb4
- 安装MySQL数据库
