Mysql 简单子查询花费的时间太长,是否有任何选项?

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-

我不知道如何以非常慢的速度获取子查询以获取10k记录中的数据

表2\u代码:

+--------+-----------+------------+
| 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