我正在使用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弱而花费了太多时间?还是我的查询错了?
我希望此查询从三个表中汇总所有价格列,并找出哪个用户花了最多钱。
谢谢您的时间:)
答案 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列也可以建立索引,但是前缀长度必须为 给定的。