Mysql 简单子查询花费的时间太长,是否有任何选项?
我不知道如何以非常慢的速度获取子查询以获取10k记录中的数据 表2\u代码:Mysql 简单子查询花费的时间太长,是否有任何选项?,mysql,Mysql,我不知道如何以非常慢的速度获取子查询以获取10k记录中的数据 表2\u代码: +--------+-----------+------------+ | code_id| code_name | code_date | +--------+-----------+------------+ | 1 | A1 | 2017-02-01 | | 2 | A2 | 2017-02-02 | | 3 | A3 | 2017-02-
+--------+-----------+------------+
| code_id| code_name | code_date |
+--------+-----------+------------+
| 1 | A1 | 2017-02-01 |
| 2 | A2 | 2017-02-02 |
| 3 | A3 | 2017-02-03 |
| 4 | A4 | 2017-02-04 |
| 5 | A5 | 2017-02-05 |
| 6 | A6 | 2017-02-06 |
| 7 | A7 | 2017-02-07 |
|10000 | A10000 | 2017-02-22 |
+--------+-----------+------------+
表_reg:
+--------+------------+------------+
| reg_id | reg_number | reg_date |
+--------+------------+------------+
| 1 | 1010 | 2017-02-01 |
| 2 | 1020 | 2017-02-02 |
| 3 | 1030 | 2017-02-03 |
| 4 | 1040 | 2017-02-04 |
| 5 | 1050 | 2017-02-05 |
| 6 | 1060 | 2017-02-06 |
| 7 | 1070 | 2017-02-07 |
|10000 | 101010 | 2017-02-22 |
+--------+-----------+------------+
然后我跑:
SELECT
a.`code_name`,
a.`code_date`,
(SELECT b.`reg_number` FROM `table_reg` b WHERE b.`reg_date` <= a.`code_date` ORDER BY b.`reg_date` DESC LIMIT 1) AS `reg_number`,
(SELECT b.`reg_date` FROM `table_reg` b WHERE b.`reg_date` <= a.`code_date` ORDER BY b.`reg_date` DESC LIMIT 1) AS `reg_date`
FROM `table_code` a
DDL:
结果如预期,但速度非常慢,记录为10公里
如果代码日期与注册日期不匹配,它将使用注册编号作为最新日期
(SELECT b.`reg_number` FROM `table_reg` b WHERE b.`reg_date` <= a.`code_date` ORDER BY b.`reg_date` DESC LIMIT 1) AS `reg_number`
还有其他的选择吗
此链接为SQLFIDLE:[
任何帮助都将不胜感激。谢谢
解释结果样本表:
正如其他人所说,如果您添加适当的索引,您当前的方法可能会以可接受的速度运行。但当前查询的一个替代方法是使用行号方法
SET @row_number = 1;
SELECT t.code_name,
t.code_date,
t.reg_number,
t.reg_date
FROM
(
SELECT @row_number:=CASE WHEN @code_id = t1.code_id
THEN @row_number + 1 ELSE 1 END AS rn,
@code_id:=t1.code_id AS code_id,
t1.code_name,
t1.code_date,
t2.reg_number,
t2.reg_date
FROM table_code t1
INNER JOIN table_reg t2
ON t2.reg_date <= t1.code_date
ORDER BY t1.code_id, t2.reg_date DESC
) t
WHERE t.rn = 1
你的表没有索引。它们有PK-应该在这里索引b.reg_date@PaulSpiegel:对不起,你是对的-整个过程只与日期有关。Post result.Internal JOIN table_reg t2 ON t2.reg_date@PaulSpiegel在我看来像是一个交叉连接,不,这不是交叉连接,因为有ON子句。在任何情况下,使用空格可能不是问题就在于运行时间。OP需要对表代码表的每一行执行两个子查询。至少我的方法只需要一个连接和一个子查询。@TimBiegeleisen。为什么所有记录的注册号和注册日期都相似?我不理解你的评论。
(SELECT b.`reg_number` FROM `table_reg` b WHERE b.`reg_date` <= a.`code_date` ORDER BY b.`reg_date` DESC LIMIT 1) AS `reg_number`
SET @row_number = 1;
SELECT t.code_name,
t.code_date,
t.reg_number,
t.reg_date
FROM
(
SELECT @row_number:=CASE WHEN @code_id = t1.code_id
THEN @row_number + 1 ELSE 1 END AS rn,
@code_id:=t1.code_id AS code_id,
t1.code_name,
t1.code_date,
t2.reg_number,
t2.reg_date
FROM table_code t1
INNER JOIN table_reg t2
ON t2.reg_date <= t1.code_date
ORDER BY t1.code_id, t2.reg_date DESC
) t
WHERE t.rn = 1