繁体   English   中英

改善MySQL中的SELECT性能

[英]Improving SELECT performance in MySQL

我有此表的交易记录:

idtransaction(pk)

时间

数量

价格单位

transaction_type(枚举买卖)

item_iditem(fk)

character_id字符(fk)

而且我正在尝试按日期对属于给定用户的每个字符(一个用户帐户可以有多个字符)检索每个买卖交易。 有一个表“ aggr”列出了每个用户的每个字符,像这样

'aggr'character_idcharacter(fk),user_iduser(fk)

很自然地,我的查询将是(如果检索所有销售额)

SELECT idtransaction, item_iditem, quantity, time, price_unit
FROM transaction
WHERE transaction_type =  'Sell'
AND character_idcharacter
IN (

SELECT character_idcharacter
FROM aggr
WHERE user_iduser = ( 
SELECT iduser
FROM user
WHERE username =  'testuser' ) 
ORDER BY character_idcharacter
)
ORDER BY time ASC 

当我总共有约200万笔交易时(这需要4到5秒才能获得大约700个结果),这需要很长时间才能执行。

我已经尝试过为字符外键和transaction_type字段创建索引,但是它似乎并没有太大改进。 关于如何使速度更快的任何提示? (重写查询或在MySQL上摆弄其他东西)

您可以尝试使用INNER JOINS代替IN,以查看速度是否更快

SELECT t.idtransaction,t.item_iditem,t.quantity,t.time,t.price_unit
FROM transaction t
INNER JOIN aggr a ON a.character_idcharacter = t.character_idcharacter
INNER JOIN user u ON u.iduser = a.user_iduser
WHERE u.username = 'testuser'
AND t.transaction_type = 'Sell'
ORDER BY t.time ASC

首先,我要摆脱内部的“ ORDER BY character_idcharacter”。 如果这样做对性能没有太大帮助,我建议您使用内部联接而不是子查询。 像这样

SELECT transaction.idtransaction, transaction.item_iditem, transaction.quantity, transaction.time, transaction.price_unit
FROM transaction INNER JOIN aggr on transaction.character_idcharacter = aggr.character_idcharacter
INNER JOIN user on aggr.user_iduser = user.iduser 
WHERE transaction.transaction_type = 'Sell'
 and user.username = 'testuser' 
ORDER BY transaction.time ASC

诺埃尔

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM