mysql – 简单子查询需要太长时间,有什么选择吗?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了mysql – 简单子查询需要太长时间,有什么选择吗?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3510字,纯文字阅读大概需要6分钟。
内容图文
![mysql – 简单子查询需要太长时间,有什么选择吗?](/upload/InfoBanner/zyjiaocheng/902/635564e560e64f0396977fd1bac8d8e8.jpg)
我无法弄清楚如何让这个子查询在10k记录中获取数据非常慢
table_code:
+--------+-----------+------------+
| 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 |
+--------+-----------+------------+
table_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
结果:
+-----------+------------+------------+------------+
| code_name | code_date | reg_number | reg_date |
+-----------+------------+------------+------------+
| A1 | 2017-02-01 | 1010 | 2017-02-01 |
| A2 | 2017-02-02 | 1020 | 2017-02-02 |
| A3 | 2017-02-03 | 1030 | 2017-02-03 |
| A4 | 2017-02-04 | 1040 | 2017-02-04 |
| A5 | 2017-02-05 | 1050 | 2017-02-05 |
| A6 | 2017-02-06 | 1050 | 2017-02-05 |
| A7 | 2017-02-07 | 1050 | 2017-02-05 |
| A10000 | 2017-02-22 | 1050 | 2017-02-05 |
+-----------+------------+------------|------------+
DDL:
CREATE TABLE `table_reg` (
`reg_id` INTEGER(11) NOT NULL AUTO_INCREMENT,
`reg_number` INTEGER(11) DEFAULT NULL,
`reg_date` DATE DEFAULT NULL,
PRIMARY KEY (`reg_id`) USING BTREE,
KEY `table_reg_idx1` (`reg_date`) USING BTREE
) ENGINE=InnoDB
AUTO_INCREMENT=4 CHARACTER SET 'latin1' COLLATE 'latin1_swedish_ci'
COMMENT='InnoDB free: 7168 kB; InnoDB free: 6144 kB';
CREATE TABLE `table_code` (
`code_id` INTEGER(11) NOT NULL AUTO_INCREMENT,
`code_name` VARCHAR(20) COLLATE latin1_swedish_ci DEFAULT NULL,
`code_date` DATE DEFAULT NULL,
PRIMARY KEY (`code_id`) USING BTREE,
KEY `table_code_idx1` (`code_date`) USING BTREE
) ENGINE=InnoDB
AUTO_INCREMENT=8 CHARACTER SET 'latin1' COLLATE 'latin1_swedish_ci'
COMMENT='InnoDB free: 7168 kB; InnoDB free: 6144 kB';
结果按预期工作,但是10k记录非常慢,
如果code_date与reg_date_date不匹配,它将使用reg_number最新日期.
(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`
还有其他选项查询吗?
这个链接sqlfiddle:[http://sqlfiddle.com/#!9/f090ad/1]
任何帮助,将不胜感激.谢谢
EXPLAIN结果示例表:
解决方法:
正如其他人所说,如果添加适当的索引,您当前的方法可能会以可接受的速度运行.但是,当前查询的一种替代方法是使用行号方法.
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
内容总结
以上是互联网集市为您收集整理的mysql – 简单子查询需要太长时间,有什么选择吗?全部内容,希望文章能够帮你解决mysql – 简单子查询需要太长时间,有什么选择吗?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。