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

标签 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 张 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/

相关文章:

sql - 如何选择最底部的行?

php - Yii 在事件记录中执行像 afterSave 这样的命令后自动调用函数

mysql - 如何在单个查询中的单个行中显示单个字段的多个值?

sql - MySQL 可以支持数据库电子邮件吗?

sql - 如何在 SELECT 语句中设置货币和小数的格式

sql-server - 从 SQLCMD 重命名 SQL Server 数据库

python - 我怎么会在 Django 中收到此无导入错误?

mysql - 在mysql select查询中获取不同的值计数

php - 复制mysql数据到同一张表

mysql - mysql 上的基本连接