DROP TABLE IF EXISTS test_json_index; CREATE TABLE test_json_index ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, OrgID INT NOT NULL, DataBlob json NOT NULL ); ALTER TABLE test_json_index ADD INDEX (OrgID), ADD INDEX indexA (( CAST(DataBlob->'$.a' AS UNSIGNED INTEGER ARRAY) )), ADD INDEX indexB (( CAST(DataBlob->'$.b' AS UNSIGNED ) )); INSERT INTO test_json_index (OrgID, DataBlob) VALUES( 1, "{\"a\":[1, 2, 3], \"b\": 1}" ); INSERT INTO test_json_index (OrgID, DataBlob) VALUES( 2, "{\"a\":[4, 5, 6], \"b\": 2}" ); SHOW INDEX FROM test_json_index; EXPLAIN SELECT * FROM (SELECT * from test_json_index where OrgID = 1) as tmp WHERE 1 member of(tmp.DataBlob->'$.a'); EXPLAIN SELECT * FROM test_json_index WHERE 1 member of(DataBlob->'$.a') AND OrgID = 1; EXPLAIN SELECT * FROM (SELECT * from test_json_index where OrgID = 1) as tmp WHERE 1 = CAST(DataBlob->'$.b' AS UNSIGNED); EXPLAIN SELECT * FROM test_json_index WHERE 1 = CAST(DataBlob->'$.b' AS UNSIGNED) AND OrgID = 1;