Как мога ефективно да търся json данни в mysql база данни?
Инсталирах extract_json udf от 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 * 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 полетата? Или моята команда за избор е написана неефективно?