如何在我的应用程序中使用 Explain 找到 Mysql 查询的慢度?

问题描述

我开发了一个 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]

解决方法

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

仅通过详细的 Hibernate 输出告诉您,您的查询可能会受益于以下复合索引:

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

如果使用该索引,MySQL 可能会在评估查询时避免检查许多记录。你可以试试直接在MySQL上添加这个索引,然后再测试一下Hibernate的性能。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...