我有3个表:选择子查询中选择的时间太长
60.000记录发票
100.000记录的汇率基于当前日期
25记录货币符号
table_invoice
:
+-----------+-------------+----------+--------------+
| invoice_id | currency_id | amount | invoice_date |
+------------+-------------+----------+--------------+
| 1 | 2 | 10 | 4/28/2016 |
| 2 | 3 | 30 | 4/29/2016 |
| 3 | 4 | 50 | 4/30/2016 |
| 4 | 2 | 40 | 6/18/2016 |
| 5 | 6 | 25 | 6/20/2016 |
| 6 | 7 | 87 | 6/25/2016 |
| 7 | 4 | 100 | 6/29/2016 |
| 8 | 9 | 45 | 7/14/2016 |
| 9 | 2 | 71 | 9/27/2016 |
| 60000 | 3 | 430 | 1/18/2017 |
+------------+-------------+----------+--------------+
和
table_exchange_rate
:
+-----------------+-------------+---------------+--------------------+
| exchange_rate_id | currency_id | exchange_rate | exchange_rate_date |
+------------------+-------------+---------------+--------------------+
| 1 | 2 | 13.352 | 4/25/2016 |
| 2 | 3 | 10.195 | 4/25/2016 |
| 3 | 4 | 14.390 | 4/25/2016 |
| 4 | 5 | 1.720 | 4/25/2016 |
| 5 | 6 | 118 | 4/25/2016 |
| 6 | 7 | 9.468 | 4/25/2016 |
| 7 | 2 | 13.125 | 6/15/2016 |
| 8 | 3 | 10.520 | 6/25/2016 |
| 9 | 4 | 14.800 | 6/25/2016 |
| 10 | 5 | 1.800 | 6/25/2016 |
| 11 | 6 | 120 | 6/25/2016 |
| 12 | 7 | 9.320 | 6/25/2016 |
| 100000 | 7 | 9.500 | 6/25/2016 |
+------------------+-------------+---------------+--------------------+
和
reference_currency:
+-----------------+---------------+-----------------------+
| currency_id |currency_symbol| currency_name |
+------------------+---------------+-----------------------+
| 1 | USD | US Dollar |
| 2 | AUD | Australian Dollar |
| 3 | EUR | Euro |
| 4 | HKD | Hong Kong Dollar |
| 5 | JPY | Japan Yen |
| 6 | SGD | Singapore Dollar |
| 7 | MYR | Malaysian Ringgit |
| 8 | CHF | Swiss Franc |
| 9 | THB | Thailand Baht |
| 10 | GBP | Great Britain Pounds |
| 11 | SEK | Swedish Krona |
| 12 | CNY | China Yuan |
| 25 | SAR | Saudi Arabian Riyal |
+------------------+-------------+-------------------------+
当我运行:
SELECT
a.invoice_id AS 'INVOICE_ID',
a.currency_id AS 'CURRENCY_ID',
a.amount AS 'AMOUNT',
a.invoice_date AS 'INVOICE_DATE',
(
SELECT b.exchange_rate FROM table_exchange_rate b
WHERE b.exchange_rate_date <= a.invoice_date AND b.currency_id = a.currency_id
ORDER BY b.exchange_rate_date DESC LIMIT 1) AS 'EXCHANGE RATE'
)
FROM table_invoice a
结果:
`+------------+-------------+----------+--------------+--------------+
| INVOICE_ID | CURRENCY_ID | AMOUNT | INVOICE_DATE | EXCHANGE_RATE |
+------------+-------------+----------+--------------+---------------+
| 1 | 2 | 10 | 4/28/2016 | 13.352
| 2 | 3 | 30 | 4/29/2016 | 10.195
| 3 | 4 | 50 | 4/30/2016 | 14.390
| 4 | 2 | 40 | 6/18/2016 | 13.125
| 5 | 6 | 25 | 6/20/2016 | 118
| 6 | 7 | 87 | 6/25/2016 | 9.320
`
,结果工作正常,但它是非常缓慢的(约> 60秒)与60K记录(table_invoice)循环在100K记录(table_exchange_rate)发现汇率在当前日期,
如果invoice_date不能与exchange_rate_date匹配,或者用户未在应用程序中输入汇率,它将使用汇率在当前日期之前已输入的最新记录(b.exchange_rate_date <= a.invoice_date AND b.currency_id = a.currency_id
)
我可以加快此查询或有任何其他选项吗?谢谢。
使用加入与同样的事情,通常速度比运行子查询 –
向我们展示说明你的查询** EXPLAIN SELECT a.invoice_id AS“INVOICE_ID”, 一个.amount AS '金额', ( SELECT b.exchange_rate FROM table_exchange_rate b WHERE b.exchange_rate_date <= a.invoice_date AND b.currency_id = a.currency_id ORDER BY b.exchange_rate_date DESC LIMIT 1)AS '汇率' ) FR OM table_invoice a; ** –
EXPLAIN本身并没有太大的帮助。我们通常也需要查看每个相关表的SHOW CREATE TABLE语句。也就是说,像这样的相关子查询通常比不相关的子查询表现得更差。 – Strawberry