CREATE TABLE Statement 1. NDB  handles a  JSON  column value internally as a  BLOB . This means that any  NDB  table having one or more JSON columns must have a primary key, else it cannot be recorded in the binary log. 2. The  NDB  storage engine does not support indexing of virtual columns. Since the default for generated columns is  VIRTUAL , you must specify explicitly the generated column to which to apply the indirect index as  STORED . The  CREATE TABLE  statement used to create the table  jempn  shown here is a version of the  jemp  table shown previously, with modifications making it compatible with  NDB : We can populate this table using the following  INSERT  statement: Now  NDB  can use index  i , as shown here: You should keep in mind that a stored generated column uses  DataMemory , and that an index on such a column uses  IndexMemory . MySQL supports invisible columns as of MySQL 8.0.23. An invisible column is normally hidden to queries, but can be accessed if explicitly referenced. Prior to MySQL 8.0.23, all columns are visible. As an illustration of when invisible columns may be useful, suppose that an application uses  SELECT * queries to access a table, and must continue to work without modification even if the table is altered to add 13.1.20.10 Invisible Columns 2590 CREATE TABLE jempn ( a BIGINT(20) NOT NULL AUTO_INCREMENT PRIMARY KEY, c JSON DEFAULT NULL, g INT GENERATED ALWAYS AS (c->"$.name") STORED, INDEX i (g) ) ENGINE=NDB; INSERT INTO jempn (a, c) VALUES (NULL, ’{"id": "1", "name": "Fred"}’), (NULL, ’{"id": "2", "name": "Wilma"}’), (NULL, ’{"id": "3", "name": "Barney"}’), (NULL, ’{"id": "4", "name": "Betty"}’); mysql>  EXPLAIN SELECT c->>"$.name" AS name FROM jempn WHERE g > 2\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: jempn partitions: p0,p1 type: range possible_keys: i key: i key_len: 5 ref: NULL rows: 3 filtered: 100.00 Extra: Using where with pushed condition (‘test‘.‘jempn‘.‘g‘ > 2) 1 row in set, 1 warning (0.00 sec) mysql>  SHOW WARNINGS\G *************************** 1. row *************************** Level: Note Code: 1003 Message: /* select#1 */ select json_unquote(json_extract(‘test‘.‘jempn‘.‘c‘,’$.name’)) AS ‘name‘ from ‘test‘.‘jempn‘ where (‘test‘.‘jempn‘.‘g‘ > 2) 1 row in set (0.00 sec)