我有一个mysql数据库运行在raspi4 2gb的usb>sata ssd和python连接器接口上。当我运行查询时
UPDATE sessions
SET used = 1, date_created = %s, places = %s, loc_query = %s,
resp_loc = %s, resp_json = %s, ip_address = %s, full_q_string = %s
WHERE used IS NULL
LIMIT 1
它的工作速度很快(大约1秒),但当它找到列表中较低的行时,它的速度会慢得多(变成2-3秒以上,到第9000行时是4-5秒)。我以为这是db填充的结果,但当我返回并释放第1-10行时,将查询中所有填充的列置零并设置“used”=null,前10行的速度非常快,即使填充了其他9000行,但当它开始写入第9001行时,速度又变慢了。我试着直截了当地写一行
UPDATE sessions
SET used = 1, date_created = %s, places = %s, loc_query = %s,
resp_loc = %s, resp_json = %s, ip_address = %s, full_q_string = %s
WHERE placeholder_id = 9002`
它工作得很好/很快,但我需要第一个查询中的逻辑/想法才能工作。最后,我尝试重新启动pi来刷新ram,以为这是缓存,但有类似的过期时间。任何输入建议都将被告知:)
mysql-(mysql版本8.0.20-0ubuntu0.20.04.1 for linux on aarch64((ubuntu)))
表列:
placeholder_id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
session_key CHAR(5),
date_polled DATETIME,
date_created DATETIME(6),
full_q_string VARCHAR(2550),
ip_address VARCHAR(255),
places JSON,
loc_query LONGTEXT,
resp_loc LONGTEXT,
resp_json JSON
1条答案
按热度按时间4sup72z81#
问题是mysql有一个find a行
user IS NULL
. 这可能需要越来越长的时间。解决方案是在
user
:mysql应该能够使用索引来查找
NULL
row相当快地加快了更新速度(在上维护索引需要一点开销)insert
s和update
s) 是的。