我有一些旧软件在 Mariadb 10.6 上使用 MyISAM 表
当我检查查询摘要时,我总是看到执行时间从 100 毫秒开始。
这里可能出了什么问题?
Innodb 表显示时间较短。
这个用于对小表(30k 条记录以下)进行简单的 count(*) 查询:
# Query 2: 0.31 QPS, 0.03x concurrency, ID 0x56EB9978318FA6C3A68FEFD174701A51 at byte 0
# This item is included in the report because it matches --limit.
# Scores: V/M = 0.00
# Time range: 2024-02-07T07:00:07 to 2024-02-07T07:19:50
# Attribute pct total min max avg 95% stddev median
# ============ === ======= ======= ======= ======= ======= ======= =======
# Count 9 369
# Exec time 8 37s 100ms 202ms 101ms 100ms 9ms 100ms
# Lock time 0 0 0 0 0 0 0 0
# Query size 3 32.65k 89 94 90.60 92.72 1.15 88.31
我怀疑您的小型 30K 行 MyISAM 表上没有索引。由于行计数[我认为]存储在不存在的 .MYI
文件中,因此它必须读取数据来计算行数。对于几乎所有简单的事情,InnoDB 都比 MyISAM 慢
SELECT COUNT(*) FROM tbl
。可能其他一些活动的桌子上有
LOCK
。这会减慢许多操作的速度。 (InnoDB 允许并发访问表,因此在许多情况下速度更快。)为什么只有100ms?
long_query_time
是否设置为 0.1(秒)?如果是这样,也许只有几个
SELECTs
碰巧才勉强达到 100 毫秒。
COUNT
运行了多少次?如果 Query_cache 实际上给这个讨论带来了麻烦。请参阅
query_cache_type
和
query_cache_size
。对于 MyISAM 或 InnoDB,数据和索引都不会“保留在内存中”。在所有组合中,字节都以类似于“最近最少使用”的方式进行“缓存”。 (如果有足够的 RAM,所有内容都将缓存在 RAM 中。)