【问题标题】:How to make filtering and sorting JSON data in MySQL faster?如何让 MySQL 中的 JSON 数据过滤和排序更快?
【发布时间】:2021-06-23 23:45:56
【问题描述】:

我有大约 150.000 行的表“listing_data”。当数据来自 JSON 时,我在过滤和排序方面遇到问题。我在每一列上添加了过滤和排序所需的键。

但是,作为用于存储 JSON 的一列“数据”使用“文本”,因此我无法在此处添加索引。我正在尝试运行此查询

SELECT 
  id, 
  title, 
  slug, 
  description, 
  uniqueId, 
  data, 
  images, 
  view, 
  contact, 
  lastSync, 
  status, 
  sold, 
  waktu, 
  FLOOR(
    JSON_UNQUOTE(
      JSON_EXTRACT(data, '$.price')
    )/ 100000000
  )* 100 AS rangePrice, 
  COUNT(id) AS total 
FROM 
  listing_data 
WHERE 
  JSON_UNQUOTE(
    JSON_EXTRACT(data, '$.subCategory')
  )= 'rumah' 
  and JSON_UNQUOTE(
    JSON_EXTRACT(data, '$.type')
  )= 'dijual' 
  and LOWER(
    JSON_UNQUOTE(
      JSON_EXTRACT(data, '$.province')
    )
  )= 'lampung' 
  and LOWER(
    JSON_UNQUOTE(
      JSON_EXTRACT(data, '$.regency')
    )
  )= 'bandar lampung' 
  and LOWER(
    JSON_UNQUOTE(
      JSON_EXTRACT(data, '$.district')
    )
  )= 'way halim' 
GROUP BY 
  JSON_UNQUOTE(
    JSON_EXTRACT(data, '$.price')
  ) 
ORDER BY 
  rangePrice ASC 
LIMIT 
  0, 20

运行时间为 2.8148 秒。有什么解决方案可以让它更快吗?我想知道是否有办法在 TEXT 列中添加索引。

【问题讨论】:

  • 在 MySQL 5.7 及更高版本中,您可以在 generated columns 上创建索引。但是索引必须针对那些特定的列。如果您搜索的 JSON 字段一直在变化,那将不合适,我猜它们会这样。

标签: mysql query-optimization mysql-json


【解决方案1】:

您可以从 JSON 列中提取所有需要的数据并将其放入新列中。

这些新列可以是可索引的类型。

也许您甚至可以完全摆脱 JSON 列?

【讨论】:

    【解决方案2】:
    • LOWER 妨碍优化。使用合适的排序规则。
    • JSON_UNQUOTE 妨碍优化;为什么需要它?
    • 常用列(尤其是pricerangeprice,以及一般地理区域,可能还有type)拉到自己的列中。
    • 然后在它们上构建选定的“复合”索引
    • GROUP BY 无效,因为它不包括其他各种列。也许这需要单独查询或对数据进行第二次传递。
    • 使用COUNT(*) 代替COUNT(id);后者需要不必要地测试id IS NOT NULL

    【讨论】:

      猜你喜欢
      • 2017-08-12
      • 2020-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-22
      • 2014-02-25
      • 2015-11-04
      相关资源
      最近更新 更多