数据库分区操作以及完成查询功能
一、分区
就是把一张表的数据分成N个区块,在逻辑上看最终只是一张表,但底层是由N个物理区块组成的,例如 有个以时间为记录 ,大约有10年的数据集,可以已年划分为10个分区,每个分区包含的是其中一年的记录(注:一定要通过某个属性列来分割,譬如这里使用的列就是年份)
mysql支持的分区类型包括Range、List、Hash、Key,其中Range比较常用,我们用的就是range分区:
RANGE分区:基于属于一个给定连续区间的列值,把多行分配给分区。
LIST分区:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。
HASH分区:基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL 中有效的、产生非负整数值的任何表达式。
KEY分区:类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL服务器提供其自身的哈希函数。必须有一列或多列包含整数值。
接下来说如何在mysql进行range分区:
二、第一种情况是使用sql语句进行,这种适用于新建表
CREATE TABLE things (
id INT AUTO_INCREMENT,
name DOUBLE NOT NULL,
time INT NOT NULL,
PRIMARY KEY(id, order_day)
) ENGINE=Innodb
PARTITION BY RANGE(time) (
PARTITION p0 VALUES LESS THAN (2020),
PARTITION p1 VALUES LESS THAN (2021),
PARTITION p2 VALUES LESS THAN MAXVALUE);
第二种情况是已经有了数据表,再进行分区
例如;
1.首先新加‘year’字段,由于主键或者唯一索引必须包含分区字段
2.选择分区表进行编辑(‘year’需要改为year,否则会报错)
3.查看分区情况,到此分区操作完成
三、分区之后需要进行查询操作
由于我用的是thinkphp5,tp5是没有封装分区查询操作的,所以需要用原生的sql语句来进行查询(即不能使用链式查询)。(tp6是可以使用链式查询的)
$list = Db::query(select * from 表名 partition (分区名)");
sql的内连接方式:
select * from A partition (分区名) inner join B on A.id = B.id //正确方法
select * from A ,B partition (分区名) where A.id = B.id //这种方法也是内连接,但是会报错,以为B中并没有分区。
然后是要在sql语句中加变量
$time = 'p0';//分区名变量
$id = '276';
$status = '(0,5)';//sql语句中 IN中的范围变量
$start = 0;
$limit = 10;
$sql = "select * from A partition ({$time}) inner join B on A.id = B.id where id = '{$id}' AND status IN {$status} order by id desc limit {$start},{$limit}";
//相当于sql语句
$sql = "select * from A partition (p0) inner join B on A.id = B.id where id = '276' AND status IN (0,5) order by id desc limit 0,10";
数字的话,加{}就可以。字符串的话需要带上单引号:'{}',{}代表括号里面是变量,但是一开始我以为$status是一个字符串,我加上单引号,却报错了。
从报错可以看出多了一个单引号,所以就视情况而定。
四、具体实例
1.下拉框代码
<select name="time" id="time" lay-filter="time">
<option value="" disabled selected hidden>选择申报年份</option>
<option value="p2">2020</option>
<option value="p0">2019</option>
</select>
2.该组件是基于layui做的,所以要先导入layui的相应模块。
var time = 'p0'
layui.use(['table','form'], function(){
var table = layui.table;
var form = layui.form;
table.render({
...
,url:"后台url"
,where: {time: 'p0'} //条件,分区名默认设置为p0.
'''
})
//这里是你的table表格,用来具体显示某个分区的内容。
form.on('select(time)', function(data){
// 用layui的方式来写这个下拉框筛选表格的功能
// 关键在于lay-filter过滤器来选择select标签
time = data.value;
if(data.value=="p0"){
table.reload('test',{
where:{time:'p0'}
})
}else{
table.reload('test',{
where:{time:data.value}
})
}
});
})
3.下拉选框选择分区查询功能基本完成。
推荐阅读
-
数据库分区操作以及完成查询功能
-
mysql数据库表的创建以及字段的增删改查操作及一些常用的查询命令介绍
-
C#连接SQL数据库和查询数据功能的操作技巧
-
【DM】达梦数据库中分区表的创建及查询操作
-
mysql数据库表的创建以及字段的增删改查操作及一些常用的查询命令介绍
-
如何使用Node.js操作redis来完成添加查询功能的具体介绍
-
php访问数据库实现分页功能以及多条件查询功能的示例分享
-
php访问数据库实现分页功能以及多条件查询功能的示例分享
-
如何使用Node.js操作redis来完成添加查询功能的具体介绍
-
1. 写一个自定义异常类来处理上传过程以及各种错误 2. (选做) 写一个与指定数据表绑定的类, 实现基本的模型功能,例如查询, 新增, 更新,删除等操作