首页 > 解决方案 > SQL 缓存表布局 - UPDATE / INSERT 性能

问题描述

我目前正在开发一个需要实现某种数据缓存的 Web 应用程序。我想将此缓存存储在 SQL 数据库(mySQL 5.6)中

一个缓存条目的长度始终为 35000 个双精度值,并由从 1 到 35000 的索引标识。

我的第一次尝试是构建一个存储缓存标头的表,例如创建日期和缓存被命中或需要重建时的标准,以及实际存储数据的第二个表。

标题表具有以下布局:

tb_cache_header
id (primary key) | cache_criteria | lock | create_date
               0 |              a |    0 |  2019-10-10
               1 |              b |    0 |  2019-10-11                    
               3 |              f |    0 |  2019-10-12

第二个表具有以下布局:

tb_cache_data

   id | data0 | data1 | data3
    1 |   0.1 |   0.3 |   0.5
    2 |   0.3 |   1.2 |   1.4
...
35000 |   0.2 |   3.1 |   2.1

所以每一列代表一个缓存条目,列名中的数字存储在 tb_cache_header.id 中。

如果我需要从缓存中获取数据,我正在对 tb_cache_header 进行 SQL 查询以查找缓存是否被命中,然后从 tb_cache_data 查询名称为 data[tb_cache_header.Id] 的列。如果没有命中缓存,我会在 tb_cache_header 中添加一个新行,在 tb_cache_data 中添加一个新列。然后该列填充了一个事务,该事务在 php 中使用准备好的语句调用,例如UPDATE tb_cache_data SET data4 = 0.5 WHERE id=10.

更新最多需要 20 秒。

那么像这样使用其他表格格式会更好吗?

tb_cache_data

id | cache_id (foreign key from tb_cache_header.id) | data
 1 |                                              0 |  0.1
 2 |                                              0 |  0.3
 ...
 1 |                                              1 |  0.3
 2 |                                              1 |  1.2
 ...
 1 |                                              3 |  0.5
 2 |                                              3 |  1.4

并且使用比INSERT INTO tb_cache_data (id, cache_id, data) VALUES (10, 4, 0.5)

在这种情况下,INSERT / UPDATE 是否更快,哪一列应该是快速读取一个缓存条目的索引?

谢谢麦丁

标签: phpmysqlprepared-statement

解决方案


推荐阅读