1
npc0der 2015-03-18 17:11:32 +08:00 1
额 找出 最近90天出库的 那批 skuId
然后找出 整库的 skuId 差集。。。。skuId 有索引的吧 应该会很快。。。。 |
2
abcfyk OP @npc0der 目前是这么做的。但是目前SKU总数100W+, 最近90天有出货的大约30W。用PHP来筛选。但是我想尽量能在mysql层面做就在mysql里面做算了。用php脚本跑的话效率太差了。
|
3
takatost 2015-03-18 17:20:50 +08:00 1
这么大级别的数据量为何不分表
|
4
Septembers 2015-03-18 17:27:40 +08:00
1. 建议做表分区
2. 给时间做索引 |
5
Septembers 2015-03-18 17:27:58 +08:00 1
1. 建议做表分区
2. 给时间(outDate)做索引 |
6
Septembers 2015-03-18 17:28:50 +08:00
@takatost 如果是PgSQL单表 15亿都压力不大
|
7
jk2r 2015-03-18 17:30:30 +08:00 1
你先贴出create的sql/explain的结果,大家才好帮你看
|
8
Mac 2015-03-18 18:33:59 +08:00
LZ先说说慢到什么程度?
|
10
abcfyk OP @Septembers 表分区。。暂时比较难,outDate 已加索引。。
|
11
abcfyk OP @jk2r
类似这种: CREATE TABLE `outDetail`{ `id` int(11) NOT NULL AUTO_INCREMENT, `outId` int(11) NOT NULL, `skuId` varchar(30) NOT NULL, `outDate` datetime NOT NULL, `outQty` int(11) NOT NULL PRIMARY KEY (`id`), KEY `indexOutId` (`outId`), KEY `indexSkuId` (`skuId`), KEY `indexOutDate` (`outDate`), }ENGINE=InnoDB DEFAULT CHARSET=utf8 explain 结果大概如下 +----+-------------+-----------------+-------+---------------+-------------+---------+------+----------+-------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-----------------+-------+---------------+-------------+---------+------+----------+-------+ | 1 | SIMPLE | outDetail | index | NULL | IndexSkuId | 92 | NULL | 23980757 | | +----+-------------+-----------------+-------+---------------+-------------+---------+------+----------+-------+ |
12
abcfyk OP @Mac PHP把全部100W 的 SKU查出来存入变量,大概需要一小时。查找最近三个月出货的SKU存到变量又要一小时。光取数据还没求差集的时间就2小时了。
|
13
O14 2015-03-18 19:13:30 +08:00 via Android 1
不知我理解的对不?
SELECT DISTINCT skuId FROM outDetail WHERE outDate < date_sub(curdate(), interval 90 day) AND skuId NOT IN (SELECT DISTINCT skuId FROM outDetail WHERE outDate > date_sub(curdate(), interval 90 day)); |
14
takatost 2015-03-18 19:53:40 +08:00 via iPhone
@Septembers 可惜是mysql
|
15
sohoer 2015-03-18 20:59:09 +08:00 1
select skuId from (select skuId from outDetail where outDate > date_sub(curdate(), interval 90 day)) as t group by skuId;
|
16
frankzeng 2015-03-18 21:39:46 +08:00 1
如果不是严格实时要求,你可以写个脚本把跑出来的数据存到另一张表里。
|
17
cevincheung 2015-03-18 21:49:53 +08:00 1
|
18
yangqi 2015-03-18 22:51:26 +08:00 1
难道不是简单的一句
SELECT DISTINCT skuId FROM outDetail WHERE outDate < date_sub(curdate(), interval 90 day); ? |
19
WispZhan 2015-03-18 23:08:30 +08:00 1
Group by + Having 本身就没有效率可言吧……
|
20
npc0der 2015-03-19 09:02:21 +08:00 1
取出你说的 30w 的这些skuId 不会很慢吧 3000w 的表不算很大啊 我这张表 38,643,224 记录 取出skuId 你到临时表里面去
或者你这样 skuID 你 100w 的那张表 加一个字段 标示为 90天内出库了 更新下 这样 筛选出来也快 做分页查询 其他业务也方便。 100w 表加个字段不会很慢的 表大了就不容易加字段了。 |
22
abcfyk OP |
23
jhdxr 2015-03-19 22:45:10 +08:00
@Septembers 我现在有个单表2亿的,在合适的索引的配合下,目前我的查询均可以在0.3s内完成。然后上个月把数据同样地拷了一份到postgresql里去,配合同样的索引,效率远不如mysql。用explain看了下也已经走了索引了。不知道能否指教下有哪些需要注意的点?
|