mysql查询速度较慢,因为它访问表中较低的数据

1aaf6o9v  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(403)

我有一个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
4sup72z8

4sup72z81#

问题是mysql有一个find a行 user IS NULL . 这可能需要越来越长的时间。
解决方案是在 user :

create index idx_sessions_user on sessions(user);

mysql应该能够使用索引来查找 NULL row相当快地加快了更新速度(在上维护索引需要一点开销) insert s和 update s) 是的。

相关问题