【发布时间】: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