2014-10-31 100 views
1

如何在mysql數據庫中高效地搜索json數據?mysql udf json_extract in where子句 - 如何提高性能

我從labs.mysql.com安裝了extract_json udf,並用2.750.000條目的測試表進行了測試。

CREATE TABLE `testdb`.`JSON_TEST_TABLE` (
    `AUTO_ID` INT UNSIGNED NOT NULL AUTO_INCREMENT, 
    `OP_ID` INT NULL, 
    `JSON` LONGTEXT NULL, 
PRIMARY KEY (`AUTO_ID`)) $$ 

一個例子JSON場看起來像這樣:

{"ts": "2014-10-30 15:08:56 (9400.223725848107) ", "operation": "1846922"} 

我發現,把json_extract成select語句幾乎沒有性能影響。 也就是說以下選擇(幾乎)具有相同的性能:

SELECT * FROM JSON_TEST_TABLE where OP_ID=2000000 LIMIT 10; 

SELECT OP_ID, json_extract(JSON, "ts") ts, json_extract(JSON, "operation") operation FROM JSON_TEST_TABLE where OP_ID=2000000 LIMIT 10; 

然而,只要我把json_extract表達到where子句的執行時間增加了10倍以上(I選自2,5-去至30秒):

SELECT OP_ID, json_extract(JSON, "ts") ts, json_extract(JSON, "operation") operation FROM JSON_TEST_TABLE where json_extract(JSON, "operation")=2000000 LIMIT 10; 

在這一點上,我想,我需要提取,我想搜索到在插入時單獨列的所有信息,而且,如果我真的有在JSON數據我要搜索需要先按照其他標準縮小要搜索的行數,但是我想確保我不會漏掉任何明顯的東西。 例如我可以以某種方式索引json字段嗎?或者,我的選擇陳述書寫效率低下?

回答

-2

我想如果你對你的查詢做一個EXPLAIN,你會看到MySQL做了一個全表掃描,只是因爲你的查詢是一個沒有索引的術語。

+0

這應該是一個評論 – Jakar 2015-11-23 18:08:58

1

事實上

SELECT * FROM JSON_TEST_TABLE where OP_ID=2000000 LIMIT 10; 

json_extract的執行過程中()將至多10次來執行。

在此一個

SELECT OP_ID, json_extract(JSON, "ts") ts, json_extract(JSON, "operation") operation FROM JSON_TEST_TABLE where json_extract(JSON, "operation")=2000000 LIMIT 10; 

json_extract()將對於每一行,結果限制爲10條記錄,因此速度損失來執行。 索引編制也無濟於事,因爲處理時間用完了,而不是MySQL的外部代碼。 Imho,在這種情況下最好的賭注是一個優化的UDF。

+0

謝謝你的澄清,但...這個問題差不多3歲! ;-)我最終將數據轉儲到彈性搜索實例中......問題解決了。 – edr 2017-06-30 06:56:11