我正在使用 MySQL 5.0 并处理一些拥挤的表。我实际上想计算一些东西
写了一个这样的查询:
SELECT
shuttle_payments.payment_user as user,
SUM(-1 * (shuttle_payments.payment_price + meal_payments.payment_price ) +
print_payments.payment_price) as spent
FROM
((shuttle_payments
INNER JOIN meal_payments ON shuttle_payments.payment_user = meal_payments.payment_user)
INNER JOIN print_payments ON meal_payments.payment_user = print_payments.payment_user)
GROUP BY
shuttle_payments.payment_user
ORDER BY
spent DESC
LIMIT 1
嗯,这里有 3 张 table ,大约有 3 张 table 。每个表 60,000 行。是否因为表太拥挤而花费了太长时间(所以我应该转移到NoSQL或其他什么),或者这是一个正常的查询,但我的服务器花费了太长时间,因为它的CPU很弱?还是我的查询有误?
我希望此查询对三个表中的所有价格列进行求和,并找到哪个用户花费最多的钱。
感谢您的宝贵时间:)
最佳答案
看起来您的查询没有问题。您必须检查这三个表上是否存在索引。 请创建索引,例如 -
CREATE INDEX idx_shuttle_payments ON shuttle_payments(payment_user);
CREATE INDEX idx_meal_payments ON meal_payments(payment_user);
CREATE INDEX idx_print_payments ON print_payments(payment_user);
以上语句将在 payment_user
列上创建非聚集索引。
如果 payment_user
数据类型为BLOB/Text
,则-
CREATE INDEX idx_shuttle_payments ON shuttle_payments(payment_user(100));
CREATE INDEX idx_meal_payments ON meal_payments(payment_user(100));
CREATE INDEX idx_print_payments ON print_payments(payment_user(100));
在上面的语句中,我将前缀长度
设置为100。您必须根据您的数据决定此前缀长度。
来自 MySQL documentation :
BLOB and TEXT columns also can be indexed, but a prefix length must be given.
关于mysql - 查询无法执行,或者等待时间太长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59259930/