btr0sea.h
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:9k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /************************************************************************
  2. The index tree adaptive search
  3. (c) 1996 Innobase Oy
  4. Created 2/17/1996 Heikki Tuuri
  5. *************************************************************************/
  6. #ifndef btr0sea_h
  7. #define btr0sea_h
  8. #include "univ.i"
  9. #include "rem0rec.h"
  10. #include "dict0dict.h"
  11. #include "btr0types.h"
  12. #include "mtr0mtr.h"
  13. #include "ha0ha.h"
  14. /*********************************************************************
  15. Creates and initializes the adaptive search system at a database start. */
  16. void
  17. btr_search_sys_create(
  18. /*==================*/
  19. ulint hash_size); /* in: hash index hash table size */
  20. /************************************************************************
  21. Returns search info for an index. */
  22. UNIV_INLINE
  23. btr_search_t*
  24. btr_search_get_info(
  25. /*================*/
  26. /* out: search info; search mutex reserved */
  27. dict_index_t* index); /* in: index */
  28. /*********************************************************************
  29. Creates and initializes a search info struct. */
  30. btr_search_t*
  31. btr_search_info_create(
  32. /*===================*/
  33. /* out, own: search info struct */
  34. mem_heap_t* heap); /* in: heap where created */
  35. /*************************************************************************
  36. Updates the search info. */
  37. UNIV_INLINE
  38. void
  39. btr_search_info_update(
  40. /*===================*/
  41. dict_index_t* index, /* in: index of the cursor */
  42. btr_cur_t* cursor);/* in: cursor which was just positioned */
  43. /**********************************************************************
  44. Tries to guess the right search position based on the search pattern info
  45. of the index. */
  46. ibool
  47. btr_search_guess_on_pattern(
  48. /*========================*/
  49. /* out: TRUE if succeeded */
  50. dict_index_t* index, /* in: index */
  51. btr_search_t* info, /* in: index search info */
  52. dtuple_t* tuple, /* in: logical record */
  53. ulint mode, /* in: PAGE_CUR_L, ... */
  54. ulint latch_mode,  /* in: BTR_SEARCH_LEAF, ... */
  55. btr_cur_t* cursor,  /* out: tree cursor */
  56. mtr_t* mtr); /* in: mtr */
  57. /**********************************************************************
  58. Tries to guess the right search position based on the hash search info
  59. of the index. Note that if mode is PAGE_CUR_LE, which is used in inserts,
  60. and the function returns TRUE, then cursor->up_match and cursor->low_match
  61. both have sensible values. */
  62. ibool
  63. btr_search_guess_on_hash(
  64. /*=====================*/
  65. /* out: TRUE if succeeded */
  66. dict_index_t* index, /* in: index */
  67. btr_search_t* info, /* in: index search info */
  68. dtuple_t* tuple, /* in: logical record */
  69. ulint mode, /* in: PAGE_CUR_L, ... */
  70. ulint latch_mode,  /* in: BTR_SEARCH_LEAF, ... */
  71. btr_cur_t* cursor,  /* out: tree cursor */
  72. ulint has_search_latch,/* in: latch mode the caller
  73. currently has on btr_search_latch:
  74. RW_S_LATCH, RW_X_LATCH, or 0 */
  75. mtr_t* mtr); /* in: mtr */
  76. /************************************************************************
  77. Moves or deletes hash entries for moved records. If new_page is already hashed,
  78. then the hash index for page, if any, is dropped. If new_page is not hashed,
  79. and page is hashed, then a new hash index is built to new_page with the same
  80. parameters as page (this often happens when a page is split). */
  81. void
  82. btr_search_move_or_delete_hash_entries(
  83. /*===================================*/
  84. page_t* new_page, /* in: records are copied to this page */
  85. page_t* page); /* in: index page */
  86. /************************************************************************
  87. Drops a page hash index. */
  88. void
  89. btr_search_drop_page_hash_index(
  90. /*============================*/
  91. page_t* page); /* in: index page, s- or x-latched */
  92. /************************************************************************
  93. Drops a page hash index when a page is freed from a fseg to the file system.
  94. Drops possible hash index if the page happens to be in the buffer pool. */
  95. void
  96. btr_search_drop_page_hash_when_freed(
  97. /*=================================*/
  98. ulint space, /* in: space id */
  99. ulint page_no); /* in: page number */
  100. /************************************************************************
  101. Updates the page hash index when a single record is inserted on a page. */
  102. void
  103. btr_search_update_hash_node_on_insert(
  104. /*==================================*/
  105. btr_cur_t* cursor);/* in: cursor which was positioned to the
  106. place to insert using btr_cur_search_...,
  107. and the new record has been inserted next
  108. to the cursor */
  109. /************************************************************************
  110. Updates the page hash index when a single record is inserted on a page. */
  111. void
  112. btr_search_update_hash_on_insert(
  113. /*=============================*/
  114. btr_cur_t* cursor);/* in: cursor which was positioned to the
  115. place to insert using btr_cur_search_...,
  116. and the new record has been inserted next
  117. to the cursor */
  118. /************************************************************************
  119. Updates the page hash index when a single record is deleted from a page. */
  120. void
  121. btr_search_update_hash_on_delete(
  122. /*=============================*/
  123. btr_cur_t* cursor);/* in: cursor which was positioned on the
  124. record to delete using btr_cur_search_...,
  125. the record is not yet deleted */
  126. /************************************************************************
  127. Prints info of the search system. */
  128. void
  129. btr_search_print_info(void);
  130. /*=======================*/
  131. /************************************************************************
  132. Prints info of searches on an index. */
  133. void
  134. btr_search_index_print_info(
  135. /*========================*/
  136. dict_index_t* index); /* in: index */
  137. /************************************************************************
  138. Prints info of searches on a table. */
  139. void
  140. btr_search_table_print_info(
  141. /*========================*/
  142. char* name); /* in: table name */
  143. /************************************************************************
  144. Validates the search system. */
  145. ibool
  146. btr_search_validate(void);
  147. /*=====================*/
  148. /* Search info directions */
  149. #define BTR_SEA_NO_DIRECTION 1
  150. #define BTR_SEA_LEFT 2
  151. #define BTR_SEA_RIGHT 3
  152. #define BTR_SEA_SAME_REC 4
  153. /* The search info struct in an index */
  154. struct btr_search_struct{
  155. /* The following 4 fields are currently not used: */
  156. rec_t* last_search; /* pointer to the lower limit record of the
  157. previous search; NULL if not known */
  158. ulint n_direction; /* number of consecutive searches in the
  159. same direction */
  160. ulint direction; /* BTR_SEA_NO_DIRECTION, BTR_SEA_LEFT,
  161. BTR_SEA_RIGHT, BTR_SEA_SAME_REC,
  162. or BTR_SEA_SAME_PAGE */
  163. dulint modify_clock; /* value of modify clock at the time
  164. last_search was stored */
  165. /*----------------------*/
  166. /* The following 4 fields are not protected by any latch: */
  167. page_t* root_guess; /* the root page frame when it was last time
  168. fetched, or NULL */
  169. ulint hash_analysis; /* when this exceeds a certain value, the
  170. hash analysis starts; this is reset if no
  171. success noticed */
  172. ibool last_hash_succ; /* TRUE if the last search would have
  173. succeeded, or did succeed, using the hash
  174. index; NOTE that the value here is not exact:
  175. it is not calculated for every search, and the
  176. calculation itself is not always accurate! */
  177. ulint n_hash_potential;/* number of consecutive searches which would
  178. have succeeded, or did succeed, using the hash
  179. index */
  180. /*----------------------*/
  181. ulint n_fields; /* recommended prefix length for hash search:
  182. number of full fields */
  183. ulint n_bytes; /* recommended prefix: number of bytes in
  184. an incomplete field */
  185. ulint side; /* BTR_SEARCH_LEFT_SIDE or
  186. BTR_SEARCH_RIGHT_SIDE, depending on whether
  187. the leftmost record of several records with
  188. the same prefix should be indexed in the
  189. hash index */
  190. /*----------------------*/
  191. ulint n_hash_succ; /* number of successful hash searches thus
  192. far */
  193. ulint n_hash_fail; /* number of failed hash searches */
  194. ulint n_patt_succ; /* number of successful pattern searches thus
  195. far */
  196. ulint n_searches; /* number of searches */
  197. };
  198. /* The hash index system */
  199. typedef struct btr_search_sys_struct btr_search_sys_t;
  200. struct btr_search_sys_struct{
  201. hash_table_t* hash_index;
  202. };
  203. extern btr_search_sys_t* btr_search_sys;
  204. /* The latch protecting the adaptive search system: this latch protects the
  205. (1) positions of records on those pages where a hash index has been built.
  206. NOTE: It does not protect values of non-ordering fields within a record from
  207. being updated in-place! We can use fact (1) to perform unique searches to
  208. indexes. */
  209. extern rw_lock_t* btr_search_latch_temp;
  210. #define btr_search_latch (*btr_search_latch_temp)
  211. extern ulint btr_search_n_succ;
  212. extern ulint btr_search_n_hash_fail;
  213. /* After change in n_fields or n_bytes in info, this many rounds are waited
  214. before starting the hash analysis again: this is to save CPU time when there
  215. is no hope in building a hash index. */
  216. #define BTR_SEARCH_HASH_ANALYSIS 17
  217. #define BTR_SEARCH_LEFT_SIDE 1
  218. #define BTR_SEARCH_RIGHT_SIDE 2
  219. /* Limit of consecutive searches for trying a search shortcut on the search
  220. pattern */
  221. #define BTR_SEARCH_ON_PATTERN_LIMIT 3
  222. /* Limit of consecutive searches for trying a search shortcut using the hash
  223. index */
  224. #define BTR_SEARCH_ON_HASH_LIMIT 3
  225. #ifndef UNIV_NONINL
  226. #include "btr0sea.ic"
  227. #endif
  228. #endif