成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

別再濫用模糊查找了,來試試 MySQL 多值索引!

數據庫 MySQL
MySQL 8.0版本以后,可以建立多值索引,應用此種查詢場景。相比模糊查找方案,多值索引的檢索性能更好,方案更加簡單。

商家在后臺系統中根據商品名稱檢索商品,在商品數量有限時,可以使用模糊查找方式實現簡單地檢索。如使用 WHERE columName like '%inputName%' 實現模糊查找。

然而有一種場景正在濫用模糊查找。

在優惠券配置后臺中,需要具備優惠券模版檢索能力,其中模板檢索條件是根據商品 ID,檢索哪些優惠券模版關聯了指定商品。 一個優惠券模版可以在多個商品上使用,兩者關聯關系為 1:N;

業界通常的實現方案有兩種:

  • 1)使用 ElasticSerach實現全文檢索。
  • 2)使用 MySQL 檢索。

當數據量較少,檢索條件有限時,可優先先選擇方案更加簡單地MySQL方案。

如何實現 指定商品 ID 檢索關聯的優惠券模版 功能呢?MySQL 有兩種方案

方案 1:模糊查找

通過模糊查找實現檢索,如 coupon_template 中 relatedProductIds 屬性記錄了 關聯的商品 Id 列表。

WHERE related_product_Ids like  '%${inputProductId}%'

這種方式并不準確,例如模版 A 的related_product_ids = 110,111,112, 當用戶輸入 11 時,模板 A 會被檢索出來。

如何優化呢?可以將related_product_ids 存儲為 **"110,111,112,"**,增加 1 個逗號。  SQL語句調整為

WHERE related_product_Ids like  '%${inputProductId},%'

此種方式就萬無一失了嗎?不然,當用戶輸入12 時,依然會錯誤地檢索到模版 A。

再次優化后,related_product_ids 存儲為 ",110,111,112," 即前后均添加逗號,SQL 語句調整為

WHERE related_product_Ids like  '%,${inputProductId},%' 前后添加逗號,用來截斷。

方案 2:多值索引查找

MySQL 8.0版本以后,可以建立多值索引,應用此種查詢場景。相比模糊查找方案,多值索引的檢索性能更好,方案更加簡單。

什么是多值索引

對普通的索引來說,每一條記錄僅對應一條索引記錄,對多值索引而言,一條記錄可以對應多條索引記錄。

普通索引可以對 user_id、order_id 字段建立索引。多值索引可以對 JSON 字段建立索引,例如 related_product_Ids 字段在數據庫中是 JSON 類型,值為 [110, 111, 112],當對該字段建立多值索引時,可以建立三條索引記錄,110,111,112 ,因此單獨查詢任一商品Id,均可以索引到 記錄 A。

接下來查看下如何使用多值索引

如何使用多值索引

1)創建JSON 類型的字段

alter table coupon_template add column related_prodcut_ids JSON default NULL;

2)創建一條 JSON 記錄

insert into  coupon_template(related_product_ids) values ('[110,111,112]');

3)對 JSON 類型創建多值索引

alter table coupon_template add INDEX `relatedProductIdsIndex`((cast(json_extract(`related_product_ids`, '$[*]') as unsigned array)));

創建多值索引部分,需要指定表達式。范式是 ((cast(json_extract(columnName, 'expression') as unsigned array)))

因為 product_ids是 Json 數組,所以表達式部分 是 $[*]。 如果是一個 Json Object,例如如下的 JSON

{
  "name": "xxxx",
  "ids": [110,111,112]
}

表達式應該為 $.ids

例如下面的代碼示例,創建了 ids_ext JSON 屬性,對 json 中的 ids屬性建立二級索引。注意 表達式變成了,ids_ext-> '$.ids',這是創建二級索引的另一種簡潔寫法,無需嵌套 json_extract 方法了。

alter table coupon_template add INDEX ids_ext_index ((CAST(ids_ext-> '$.ids' AS UNSIGNED ARRAY)));

如何查詢多值索引

使用 MEMBER OF (表達式) 可查詢多值索引,例如以下示例

圖片圖片

select * from coupon_template WHERE 110 MEMBER OF (ids_ext-> '$.ids');

使用 explain 查看執行計劃,如下截圖所示,確實可以使用到 ids_ext_index 索引。

圖片圖片

最后

MySQL 8.0 在 2018 年發布,目前已經成熟。該版本引入了一系列新特性如 JSON類型、窗口函數、多值索引和OnlineDDL Instant瞬時改表等。

此外官方已經在 2023 年底停止 MySQL 5.7版本,所以還是要盡快遷移到 8.0 版本。

責任編輯:武曉燕 來源: 碼猿技術專欄
相關推薦

2020-07-10 12:06:28

WebpackBundleless瀏覽器

2020-08-25 08:03:59

測試Sharness結構

2022-06-17 11:10:43

PandasPolarsPython

2020-11-04 16:34:45

單元測試技術

2020-12-02 08:31:47

Elasticsear

2012-07-03 09:38:42

前端

2020-12-15 10:24:05

2022-05-27 21:56:55

索引存儲MySQL 存儲引擎

2024-08-07 10:34:46

2025-02-17 10:30:01

2023-03-28 08:58:47

分庫分表TiDB

2019-11-05 15:52:23

Java源碼分析垃圾回收

2024-01-10 08:36:10

延時關閉訂單

2024-11-14 07:20:00

2016-09-23 18:32:42

iTunesIOS 10蘋果

2018-03-20 16:20:29

LinuxChromiumLibreOffice

2021-01-27 11:36:34

代碼開發工具

2020-12-03 09:05:38

SQL代碼方案

2021-05-17 14:57:23

策略模式代碼

2025-05-15 03:00:00

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产福利视频在线观看 | av网站免费 | a级大片 | 亚洲成人自拍网 | 激情五月激情综合网 | 在线一区视频 | 午夜电影网 | 99精品福利视频 | 亚洲精品一区二区二区 | 81精品国产乱码久久久久久 | 午夜电影福利 | 日本亚洲一区 | 欧美一区 | 在线观看日韩精品视频 | 国产高清视频 | 亚洲国产成人精品女人 | 国产在线视频一区二区 | 一区二区三区四区免费观看 | 作爱视频免费看 | 九九热精品在线 | 国产1区在线 | 国产精品一区二区无线 | 中文字幕一级毛片 | 成人欧美日韩一区二区三区 | 99精品国自产在线 | 国产精品久久久久久吹潮 | 精品亚洲永久免费精品 | 影音先锋成人资源 | 国产一区二区免费在线 | 91亚洲精品久久久电影 | 国产99久久| 久久国产精品视频 | 欧美视频 亚洲视频 | 国产一区二区免费在线 | 成年人黄色一级片 | 国产精品九九九 | 中文字幕第一页在线 | av成年人网站 | 狠狠久| 国产精品久久久久久久久图文区 | 久久麻豆精品 |