【发布时间】:2017-01-12 10:46:00
【问题描述】:
我有以下查询需要很长时间(大约 1 分钟):
SELECT `transaction`.`fuel_terminal_id`, `transaction`.`xboard_id`, `transaction`.`gas_station_id`, `transaction`.`operator_id`, `transaction`.`shift_id`, `transaction`.`fuel_type`, `transaction`.`purchase_type`, `shift`.`num` AS `shiftNum`, `shift`.`shift_state_id` AS `shiftStateId`, `shift`.`start_totalizer_dispenser_1` AS `startTotalizerDispenser1`, `shift`.`start_totalizer_dispenser_2` AS `startTotalizerDispenser2`, `shift`.`end_totalizer_dispenser_1` AS `endTotalizerDispenser1`, `shift`.`end_totalizer_dispenser_2` AS `endTotalizerDispenser2`, min(shift.start_time)AS shiftStartTime, max(shift.end_time)AS shiftEndTime, count(*)AS groupCount, sum(fuel_cost)AS sumFuelCost, sum(payment_cost)AS sumPaymentCost, sum(actual_amount / 100)AS sumActualAmount, min(start_fuel_time)AS firstFuelingDate,max(end_fuel_time)AS lastFuelingDate
FROM `transaction`
LEFT JOIN `shift`
ON shift.gs_id = TRANSACTION .gas_station_id
AND shift.terminal_id = TRANSACTION .fuel_terminal_id
AND shift.id = TRANSACTION .shift_id
AND shift.start_time = TRANSACTION .shift_start_time
GROUP BY `transaction`.`gas_station_id`,
`transaction`.`fuel_terminal_id`,
`transaction`.`shift_start_time`,
`transaction`.`fuel_type`,
`transaction`.`purchase_type`,
`transaction`.`operator_id`;
我可以通过将“shift”表中“operator_id”列的数据大小从 VARCHAR 255 更改为 VARCHAR 16 并更改“事务”表中该列的数据类型来加快查询速度(大约 25%)从 TEXT 到 VARCHAR 16。但是,我仍然需要加快速度(也许通过添加更多索引或更改它们?)。
我在MySQL 5.7 Reference Manual 中读到,如果“possible_keys”列为 NULL,则没有相关索引。所以,我想知道是否有人可以帮助我了解我是否没有选择正确的索引?这些是我放在表“事务”上的索引:
【问题讨论】:
-
您从
transaction表中选择所有内容。当您从表中选择所有内容时 - 不需要索引。 -
@zerkms:我从
transaction表中只选择了 7 列(总共有 26 列) -
您已选择所有行。
-
@zerkms:抱歉,我不明白你的意思。我从 EXPLAIN 结果中了解到,表事务已被完全扫描。同样来自 MySQL 参考手册,由于可能的键列是 NULL,我想也许我应该在这个表上添加更多索引。我误解了吗?或者您知道如何加快查询速度吗?
-
它被完全扫描,因为您选择了所有行。把HDD换成SSD,是io问题(科学猜测)
标签: mysql indexing query-optimization explain