如何加快MySQL中JSON数据的过滤和排序?

如何加快MySQL中JSON数据的过滤和排序?,mysql,query-optimization,mysql-json,Mysql,Query Optimization,Mysql Json,我有一个表“listing_data”,大约有150.000行。当数据来自JSON时,我在过滤和排序方面有问题。我在每个列上添加了筛选和排序所需的键 然而,由于用于存储JSON的一列“数据”使用“文本”,所以我无法在其中添加索引。我正在尝试运行此查询 SELECT id, title, slug, description, uniqueId, data, images, view, contact, lastSync, statu

我有一个表“listing_data”,大约有150.000行。当数据来自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秒。有什么办法可以让它更快?我想知道是否有办法将索引添加到文本列。

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

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


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

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

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

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

  • LOWER
    妨碍了优化。使用合适的排序规则
  • JSON\u UNQUOTE
    妨碍了优化;你为什么需要它
  • 将常用列(尤其是
    price
    rangeprice
    和general geographic area,也可能是
    类型
    )拉到各自的列中
  • 然后在其上构建选定的“复合”索引
  • 分组依据
    无效,因为它不包括其他各种列。也许这需要一个单独的查询或第二次传递数据
  • 使用
    COUNT(*)
    代替
    COUNT(id)
    ;后者需要进行不必要的测试
    id不为NULL
      • LOWER
        妨碍了优化。使用合适的排序规则
      • JSON\u UNQUOTE
        妨碍了优化;你为什么需要它
      • 将常用列(尤其是
        price
        rangeprice
        和general geographic area,也可能是
        类型
        )拉到各自的列中
      • 然后在其上构建选定的“复合”索引
      • 分组依据
        无效,因为它不包括其他各种列。也许这需要一个单独的查询或第二次传递数据
      • 使用
        COUNT(*)
        代替
        COUNT(id)
        ;后者需要进行不必要的测试
        id不为NULL

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