Как я могу эффективно искать данные json в базе данных mysql?
Я установил udf extract_json с labs.mysql.com и поигрался с тестовой таблицей с 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 или более раз (я перешел с 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? Или мой оператор select написан неэффективно?