August 9, 2012

[MySQL 源码] innodb如何创建二级索引

以下为分析问题时的随笔。写的很凌乱,仅做记录,以备后用。。。。。。 ////////////////////////////////////////////////////////////// ha_innobase::add_index是innodb创建索引的接口函数。 以下所有的讨论都是基于创建一个非聚集的二级索引。因此一些过程是被省略掉了。 1.获取数据词典信息           indexed_table = dict_table_get(prebuilt->table->name, FALSE); 2.检查索引键是否可用        error = innobase_check_index_keys(key_info, num_of_keys, prebuilt->table); 3.检查索引列长度 4. a.创建一个trx对象用于操作innodb数据词典,并创建新的数据词典信息 如果是主键,加LOCK_X,否则加LOCK_S锁 b.加数据词典锁row_mysql_lock_data_dictionary(trx); c.在ibdata的SYS_INDEXES中加载新的数据词典信息 d.trx_commit_for_mysql(trx); 提交刚刚创建的trx e.row_mysql_unlock_data_dictionary(trx) 以上步骤完成了对ibdata数据词典内的更新,在 完成后释放锁,这时候,如果在后续的row_merge_build_indexes时crash掉。trx_rollback_active不会drop掉新索引。 5. 调用函数row_merge_build_indexes实际创建索引,我们的讨论主要集中于此。 row_merge_build_indexes会读取表的聚集索引记录,创建临时表来保存这些记录,并使用合并排序算法进行排序以创建索引 a. 首先初始化merge file相关的数据结构,并初始化 merge_files = mem_alloc(n_indexes * sizeof *merge_files); block_size = 3 * sizeof *block; block = os_mem_alloc_large(&block_size); […]