我遇到的问题是MySQL运行以下查询需要30多秒。展平子查询可以解决问题。不幸的是,实体框架(或MySql.Data.Entity实现)也产生了可怕的预测。
我是否需要删除所有EF投影,或者我还有其他选择吗?
版本:
SQL:
CREATE TABLE Journals(
GeneralLedgerAccountId varchar,
Synchronized bit,
Number int
)
SELECT *
FROM (
SELECT *
FROM Journals
WHERE GeneralLedgerAccountId = 'abc123'
AND Synchronized = 1
) AS x
ORDER BY
x.Number DESC
LIMIT 1;
作为参考,以下等效查询需要一秒钟:
select * from Journals
where `GeneralLedgerAccountId` = 'abc123'
and `Synchronized` = 1 limit 1
查询计划:
{
"query_block": {
"select_id": 1,
"cost_info": {
"query_cost": "55155.11"
},
"ordering_operation": {
"using_filesort": true,
"table": {
"table_name": "Journals",
"access_type": "ref",
"possible_keys": [
"PRIMARY"
],
"key": "PRIMARY",
"used_key_parts": [
"GeneralLedgerAccountId"
],
"key_length": "98",
"ref": [
"const"
],
"rows_examined_per_scan": 273272,
"rows_produced_per_join": 27327,
"filtered": "10.00",
"cost_info": {
"read_cost": "500.71",
"eval_cost": "5465.44",
"prefix_cost": "55155.11",
"data_read_per_join": "9M"
},
"used_columns": [
"GeneralLedgerAccountId",
"Id",
"Number",
"Synchronized"
],
"attached_condition": "((`mydb`.`journals`.`GeneralLedgerAccountId` <=> 'abc123') and (`mydb`.`journals`.`Synchronized` = 1))"
}
}
}
}