【问题标题】:How Can I find the Slowness of Mysql Query using Explain in my application?如何在我的应用程序中使用 Explain 找到 Mysql 查询的缓慢性?
【发布时间】:2021-06-13 10:15:57
【问题描述】:

我开发了一个 Spring Boot 应用程序并使用 MySql 来存储值。当我使用 API 存储值时效果很好,但是当我使用 1000 的倍数(1K、10K、100K 等)存储行时,需要很长时间才能完成。我怎样才能找到缺少时间来存储数据的地方。

MySql 插入查询需要更长的时间来插入一行。 Mysql查询慢怎么办?

我在 logback.xml 中添加了以下行,

<Logger name="org.hibernate.type.descriptor.sql" level="trace"/> 

但是它为相同的值提供了两次绑定参数,这是一个问题吗?

 select
        schema0_.id as id1_0_,
        schema0_.active as active2_0_,
        schema0_.body as body3_0_,
        schema0_.created_at as created_4_0_,
        schema0_.created_by as created_5_0_,
        schema0_.name as name6_0_,
        schema0_.updated_at as updated_7_0_,
        schema0_.version as version8_0_ 
    from
        my_schema schema0_ 
    where
        schema0_.name=? 
        and schema0_.version=? 
        and schema0_.active=1
binding parameter [1] as [VARCHAR] - [xxxxx]
binding parameter [1] as [VARCHAR] - [xxxxx]
binding parameter [2] as [VARCHAR] - [1.0]
binding parameter [2] as [VARCHAR] - [1.0]
extracted value ([id1_0_] : [BIGINT]) - [1]
extracted value ([id1_0_] : [BIGINT]) - [1]

【问题讨论】:

  • 是存储问题还是检索问题?通过休眠存储大量数据时,如果操作不正确,您会遇到性能问题。
  • 虽然存储只需要更长的时间..检索不是问题。
  • 那么您没有刷新和清除第一个级别缓存,导致由于脏检查而导致存储时间增加。请参阅vladmihalcea.com/…vladmihalcea.com/…,了解如何使用 JPA/Hibernate 正确执行批量插入(大型数据集)。
  • 如果您正在存储单个值并且需要越来越多的时间,您的表可能没有被索引(或索引太多)或者有其他错误。如果没有看到代码,这个问题将无法回答。
  • 表格使用的是什么引擎?

标签: java mysql spring-boot explain


【解决方案1】:

如果您的my_schema 表非常大,并且 MySQL 选择的执行计划是全表扫描,那么这个查询很容易很耗时。此外,插入可以同时快速。

从详细的 Hibernate 输出中可以看出,您的查询可能会受益于以下复合索引:

CREATE INDEX idx ON my_schema (name, version, active);

如果使用此索引,MySQL 将有可能避免在评估查询时检查许多记录。您可以尝试直接在 MySQL 上添加这个索引,然后再次测试 Hibernate 的性能。

【讨论】:

  • 不,它只有 8 列
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-06
  • 1970-01-01
  • 1970-01-01
  • 2015-09-14
  • 1970-01-01
  • 2023-04-09
  • 2016-03-09
相关资源
最近更新 更多