查询无法执行,或等待时间太长

时间:2019-12-10 03:49:15

标签: mysql sql database


我正在使用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张桌子,大约有1张桌子。每张表格60,000行。是因为表过于拥挤而花费了太长时间(因此我应该转移到NoSQL还是其他),还是正常的查询,但是我的服务器却因为CPU弱而花费了太多时间?还是我的查询错了?

我希望此查询从三个表中汇总所有价格列,并找出哪个用户花了最多钱。


谢谢您的时间:)

1 个答案:

答案 0 :(得分:1)

您的查询似乎还可以。您必须检查这三个表上是否存在索引。 请创建类似-

的索引
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));

在上面的语句中,我将prefix length设置为100。您必须根据数据确定此前缀长度。

从MySQL documentation

  

BLOB和TEXT列也可以建立索引,但是前缀长度必须为   给定的。