问题描述
我开发了一个 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的性能。