table 对应 column; index 对应 field /** Data structure for a column in a table */struct dict_col_struct{/*----------------------*//** The following are copied from dtype_t,so that all bit-fields can be packed tightly. *//* @{ */unsigned mtype:8; /*!< main data type */unsigned prtype:24; /*!< precise type; MySQL datatype, charset code, flags toindicate nullability,signedness, whether this is abinary string, whether this isa true VARCHAR where MySQLuses 2 bytes to store the length *//* the remaining fields do not affect alphabetical ordering: */unsigned len:16; /*!< length; for MySQL data thisis field->pack_length(),except that for a >= 5.0.3type true VARCHAR this is themaximum byte length of thestring data (in addition tothe string, MySQL uses 1 or 2bytes to store the string length) */unsigned mbminmaxlen:5; /*!< minimum and maximum length of acharacter, in bytes;DATA_MBMINMAXLEN(mbminlen,mbmaxlen);mbminlen=DATA_MBMINLEN(mbminmaxlen);mbmaxlen=DATA_MBMINLEN(mbminmaxlen) *//*----------------------*//* End of definitions copied from dtype_t *//* @} */unsigned ind:10; /*!< table column position(starting from 0) */unsigned ord_part:1; /*!< nonzero if this columnappears in the ordering fieldsof an index */};/** Data structure for a database table. Most fields will beinitialized to 0, NULL or FALSE in dict_mem_table_create(). */struct dict_table_struct{table_id_t id; /*!< id of the table */mem_heap_t* heap; /*!< memory heap */char* name; /*!< table name */const char* dir_path_of_temp_table;/*!< NULL or the directory pathwhere a TEMPORARY table that was explicitlycreated by a user should be placed ifinnodb_file_per_table is defined in my.cnf;in Unix this is usually /tmp/..., in Windowstemp/... */unsigned space:32;/*!< space where the clustered index of thetable is placed */unsigned flags:DICT_TF2_BITS;/*!< DICT_TF_COMPACT, ... */unsigned ibd_file_missing:1;/*!< TRUE if this is in a single-tabletablespace and the .ibd file is missing; thenwe must return in ha_innodb.cc an error if theuser tries to query such an orphaned table */unsigned tablespace_discarded:1;/*!< this flag is set TRUE when the usercalls DISCARD TABLESPACE on thistable, and reset to FALSE in IMPORTTABLESPACE */unsigned cached:1;/*!< TRUE if the table object has been addedto the dictionary cache */unsigned n_def:10;/*!< number of columns defined so far */unsigned n_cols:10;/*!< number of columns */unsigned corrupted:1;/*!< TRUE if table is corrupted */dict_col_t* cols; /*!< array of column descriptions */const char* col_names;/*!< Column names packed in a character string"name1/0name2/0...nameN/0". Untilthe string contains n_cols, it will beallocated from a temporary heap. The finalstring will be allocated from table->heap. */#ifndef UNIV_HOTBACKUPhash_node_t name_hash; /*!< hash chain node */hash_node_t id_hash; /*!< hash chain node */UT_LIST_BASE_NODE_T(dict_index_t)indexes; /*!< list of indexes of the table */UT_LIST_BASE_NODE_T(dict_foreign_t)foreign_list;/*!< list of foreign key constraintsin the table; these refer to columnsin other tables */UT_LIST_BASE_NODE_T(dict_foreign_t)referenced_list;/*!< list of foreign key constraintswhich refer to this table */UT_LIST_NODE_T(dict_table_t)table_LRU; /*!< node of the LRU list of tables */ulint n_mysql_handles_opened;/*!< count of how many handles MySQL has openedto this table; dropping of the table isNOT allowed until this count gets to zero;MySQL does NOT itself check the number ofopen handles at drop */unsigned fk_max_recusive_level:8;/*!< maximum recursive level we support whenloading tables chained together with FKconstraints. If exceeds this level, we willstop loading child table into memory along withits parent table */ulint n_foreign_key_checks_running;/*!< count of how many foreign key checkoperations are currently being performedon the table: we cannot drop the table whilethere are foreign key checks running onit! */trx_id_t query_cache_inv_trx_id;/*!< transactions whose trx id issmaller than this number are notallowed to store to the MySQL querycache or retrieve from it; when a trxwith undo logs commits, it sets thisto the value of the trx id counter forthe tables it had an IX lock on */UT_LIST_BASE_NODE_T(lock_t)locks; /*!< list of locks on the table */#ifdef UNIV_DEBUG/*----------------------*/ibool does_not_fit_in_memory;/*!< this field is used to specify insimulations tables which are so bigthat disk should be accessed: diskaccess is simulated by putting thethread to sleep for a while; NOTE thatthis flag is not stored to the datadictionary on disk, and the databasewill forget about value TRUE if it hasto reload the table definition fromdisk */#endif /* UNIV_DEBUG *//*----------------------*/unsigned big_rows:1;/*!< flag: TRUE if the maximum length ofa single row exceeds BIG_ROW_SIZE;initialized in dict_table_add_to_cache() *//** Statistics for query optimization *//* @{ */unsigned stat_initialized:1; /*!< TRUE if statistics havebeen calculated the first timeafter database startup or table creation */ib_int64_t stat_n_rows;/*!< approximate number of rows in the table;we periodically calculate new estimates */ulint stat_clustered_index_size;/*!< approximate clustered index size indatabase pages */ulint stat_sum_of_other_index_sizes;/*!< other indexes in database pages */ulint stat_modified_counter;/*!< when a row is inserted, updated,or deleted,we add 1 to this number; we calculate newestimates for the stat_... values for thetable and the indexes at an interval of 2 GBor when about 1 / 16 of table has beenmodified; also when the estimate operation iscalled for MySQL SHOW TABLE STATUS; thecounter is reset to zero at statisticscalculation; this counter is not protected byany latch, because this is only used forheuristics *//* @} *//*----------------------*//**!< The following fields are used by theAUTOINC code. The actual collection oftables locked during AUTOINC read/write iskept in trx_t. In order to quickly determinewhether a transaction has locked the AUTOINClock we keep a pointer to the transactionhere in the autoinc_trx variable. This is toavoid acquiring the kernel mutex and scanningthe vector in trx_t.When an AUTOINC lock has to wait, thecorresponding lock instance is created onthe trx lock heap rather than use thepre-allocated instance in autoinc_lock below.*//* @{ */lock_t* autoinc_lock;/*!< a buffer for an AUTOINC lockfor this table: we allocate the memory hereso that individual transactions can get itand release it without a need to allocatespace from the lock heap of the trx:otherwise the lock heap would grow rapidlyif we do a large insert from a select */mutex_t autoinc_mutex;/*!< mutex protecting the autoincrementcounter */ib_uint64_t autoinc;/*!< autoinc counter value to give to thenext inserted row */ulong n_waiting_or_granted_auto_inc_locks;/*!< This counter is used to track the numberof granted and pending autoinc locks on thistable. This value is set after acquiring thekernel mutex but we peek the contents todetermine whether other transactions haveacquired the AUTOINC lock or not. Of courseonly one transaction can be granted thelock but there can be multiple waiters. */const trx_t* autoinc_trx;/*!< The transaction that currently holds thethe AUTOINC lock on this table. *//* @} *//*----------------------*/#endif /* !UNIV_HOTBACKUP */#ifdef UNIV_DEBUGulint magic_n;/*!< magic number *//** Value of dict_table_struct::magic_n */# define DICT_TABLE_MAGIC_N 76333786#endif /* UNIV_DEBUG */}; /* Dictionary system struct */struct dict_sys_struct{mutex_t mutex; /*!< mutex protecting the datadictionary; protects also thedisk-based dictionary system tables;this mutex serializes CREATE TABLEand DROP TABLE, as well as readingthe dictionary data for a table fromsystem tables */row_id_t row_id; /*!< the next row id to assign;NOTE that at a checkpoint thismust be written to the dict systemheader and flushed to a file; inrecovery this must be derived fromthe log records */hash_table_t* table_hash; /*!< hash table of the tables, basedon name */hash_table_t* table_id_hash; /*!< hash table of the tables, basedon id */UT_LIST_BASE_NODE_T(dict_table_t)table_LRU; /*!< LRU list of tables */ulint size; /*!< varying space in bytes occupiedby the data dictionary table andindex objects */dict_table_t* sys_tables; /*!< SYS_TABLES table */dict_table_t* sys_columns; /*!< SYS_COLUMNS table */dict_table_t* sys_indexes; /*!< SYS_INDEXES table */dict_table_t* sys_fields; /*!< SYS_FIELDS table */};