index_init()方法在索引被使用之前调用,使存储引擎可以执行任何必要的准备或优化。
int ha_foo::index_init(uint keynr, bool sorted)
大部分存储引擎不需要做特别的准备,如果存储引擎没有显式地实现该方法,则会使用一个默认实现。
int handler::index_init(uint idx) { active_index=idx; return 0; }
index_end()方法与index_init()方法相对应。index_end()方法的目前是清理任何由index_init()方法所做的准备工作。
如果存储引擎没有实现index_init(),它就没必要实现index_end()。
index_read()方法用来按键搜索一行:
int ha_foo::index_read(byte * buf, const byte * key,
ulonglong keypart_map,
enum ha_rkey_function find_flag)
*buf参数是字节数组,由存储引擎填入匹配*key指定的索引键的行。keypart_map参数是说明key参数中包含哪些键的位图。find_flag参数是用来说明搜索行为的枚举值。
使用的索引是之前在index_init()调用中定义的,并存储在handler的active_index变量中。
以下find_flag的值是允许的:
HA_READ_AFTER_KEY
HA_READ_BEFORE_KEY
HA_READ_KEY_EXACT
HA_READ_KEY_OR_NEXT
HA_READ_KEY_OR_PREV
HA_READ_PREFIX
HA_READ_PREFIX_LAST
HA_READ_PREFIX_LAST_OR_PREV
存储引擎必须将*key参数转换成存储引擎特定的格式,使用它根据find_flag找到匹配的行,然后以MySQL内部行格式填充*buf。
除了返回匹配的行,存储引擎还必须设置游标以支持索引顺序读。
如果*key参数是null,存储引擎应该读取索引中的第一个键。
index_read_idx()方法等同于index_read()方法,除了index_read_idx()接受一个额外的keynr参数。
int ha_foo::index_read_idx(byte * buf, uint keynr, const byte * key,
ulonglong keypart_map,
enum ha_rkey_function find_flag)
keynr参数指定用来读取的索引,反之index_read()的索引已经提前设定了。
与index_read()方法一样,存储引擎必须返回按照find_flag找到的匹配的行并且设置游标用于将来读取。
MySQL 5.7已调整接口,handler::index_read_idx_map()调用handler::index_read_map(),不需要专门实现。
index_read_last()方法与index_read()工作方式一样,但是返回当前键值的最后一行或前一行。
int ha_foo::index_read_last(byte * buf, const byte * key,
key_part_map keypart_map)
index_read_last()在对类型下面的语句优化掉ORDER BY子句时使用:
SELECT * FROM t1 WHERE a=1 ORDER BY a DESC,b DESC;
index_next()方法用于索引扫描:
int ha_foo::index_next(byte * buf)
*buf参数填入内部游标中的下一个匹配键值的行,游标由存储引擎在index_read()和index_first()之类的操作期间设置。
index_prev()方法用于反向索引扫描:
int ha_foo::index_prev(byte * buf)
*buf参数填入内部游标中的前一个匹配键值的行,游标由存储引擎在index_read()和index_first()之类的操作期间设置。
index_first()方法用于索引扫描:
int ha_foo::index_first(byte * buf)
*buf参数填入索引中的第一个键值的行。
index_last()方法用于反向索引扫描:
int ha_foo::index_last(byte * buf)
*buf参数填入索引中的最后一个键值的行。