Die folgende Abfrage verursacht eine enorme CPU-Auslastung und hohe Latenz in meiner Datenbankumgebung. Ich habe versucht, verschiedene Arten von Indizes zu verwenden, um die Abfrageleistung zu verbessern, aber leider hat keiner der Indizes zur Verbesserung der Leistung beigetragen. Gibt es einen Vorschlag, die Abfrage neu zu schreiben, um das gleiche Ergebnis zu erhalten?
query SELECT kln.qsw, kln.mngy FROM ( SELECT kln2.mngy, MAX(kln2.nonUnixjdjf) dm_hj FROM mfh.view_mats kln2 WHERE kln2.jdjf <= '2022-10-19 10:47:25.000000' GROUP BY kln2.mngy ) pun_ghky JOIN pun_ghky.mngy = kln.mngy);
此索引对
view_mats
有益:INDEX(mngy, nonUnixjdjf)
。也就是说,对于trip_dsty
:INDEX(mngy, jdjf)
。并且(可能)删除
idx_n1
,因为它仅包含该索引的开头。(我并不完全精通列存储;上面的建议是针对 InnoDB 索引;它可能适用于此。)
一般来说,Float 和 Double 上的
(m,n)
是无用的,并且可能导致舍入错误。double(20,10)
可能应该是普通的double
或DECIMAL(20,10)
。LIMIT 10000
——您真的向客户端交付了那么多行吗?铲掉这么多也是一个性能问题。