EF6的MySQL子查询性能问题

时间:2017-08-28 01:17:15

标签: mysql entity-framework-6 database-performance

我遇到的问题是MySQL运行以下查询需要30多秒。展平子查询可以解决问题。不幸的是,实体框架(或MySql.Data.Entity实现)也产生了可怕的预测。

我是否需要删除所有EF投影,或者我还有其他选择吗?

版本:

  • Entity Framework v6.1.3
  • MySQL v5.7.15
  • MySql.Data.Entity v6.9.9

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))"
      }
    }
  }
}

0 个答案:

没有答案