Error
Error Code:
3753
MySQL Error 3753: Functional Index on JSON/GEOMETRY
Description
This error occurs when you attempt to create a functional index on an expression or function that returns a JSON or GEOMETRY data type. MySQL explicitly prohibits functional indexes on these types due to their complex structure and the overhead involved in evaluating them during indexing operations.
Error Message
Cannot create a functional index on a function that returns a JSON or GEOMETRY value.
Known Causes
3 known causesIndexing JSON Data
You attempted to create a functional index on an expression that extracts or manipulates JSON data from a column, which is not supported.
Indexing GEOMETRY Data
A functional index was defined on an expression involving GEOMETRY data types, which are explicitly disallowed for this indexing method.
Unsupported Function Return Type
The function used in the functional index definition, although valid for other operations, returns a JSON or GEOMETRY value, making it incompatible.
Solutions
4 solutions available1. Extract JSON Values to Separate Columns medium
Denormalize JSON data into dedicated columns for indexing.
1
Identify the specific JSON keys you need to query frequently and create new columns in your table to store these extracted values.
ALTER TABLE your_table ADD COLUMN extracted_key VARCHAR(255);
2
Populate these new columns by extracting the relevant data from your JSON column.
UPDATE your_table SET extracted_key = JSON_EXTRACT(json_column, '$.your_key');
3
Create a regular index on the newly created columns.
CREATE INDEX idx_extracted_key ON your_table (extracted_key);
4
Modify your queries to use the new indexed columns instead of the JSON functions.
SELECT * FROM your_table WHERE extracted_key = 'some_value';
2. Use Generated Columns for Indexing medium
Leverage generated columns that store the result of a JSON extraction, which can then be indexed.
1
Add a generated column to your table. This column will automatically store the extracted value from your JSON.
ALTER TABLE your_table ADD COLUMN extracted_key_generated INT AS (JSON_EXTRACT(json_column, '$.your_key')) STORED;
2
Create an index on the generated column.
CREATE INDEX idx_extracted_key_generated ON your_table (extracted_key_generated);
3
Update your queries to use the generated column.
SELECT * FROM your_table WHERE extracted_key_generated = 123;
3. Pre-calculate and Store Derived Data advanced
For complex JSON or GEOMETRY manipulations, calculate and store the result in a separate, indexable column.
1
Determine the specific derived values you need to query frequently from your JSON or GEOMETRY data.
text
Example: If you frequently query the area of a GEOMETRY polygon, you would calculate this area.
2
Add a new column to your table to store these pre-calculated values.
ALTER TABLE your_table ADD COLUMN derived_value DECIMAL(10, 2);
3
Use triggers or application logic to populate and maintain this new column whenever the original JSON or GEOMETRY data is inserted or updated.
CREATE TRIGGER update_derived_value BEFORE INSERT ON your_table
FOR EACH ROW SET NEW.derived_value = ST_Area(NEW.geometry_column);
4
Create an index on the new `derived_value` column.
CREATE INDEX idx_derived_value ON your_table (derived_value);
5
Modify your queries to filter on the `derived_value` column.
SELECT * FROM your_table WHERE derived_value > 1000;
4. Re-evaluate Indexing Strategy easy
Consider if indexing the specific JSON/GEOMETRY function is truly necessary or if alternative query patterns exist.
1
Analyze the queries that are failing. Understand what specific information is being sought from the JSON or GEOMETRY data.
text
Example: Are you searching for a specific value within a JSON object, or checking if a point falls within a GEOMETRY polygon?
2
Explore if simpler, non-functional indexable queries can achieve the same result. This might involve scanning the JSON/GEOMETRY data directly if the volume is manageable.
SELECT * FROM your_table WHERE JSON_EXTRACT(json_column, '$.some_key') = 'value'; -- This query would fail if used in a functional index.
3
If performance is critical and direct indexing isn't possible, consider the other solutions provided to denormalize or pre-calculate data.
text
No code snippet for this step as it's a strategic decision.