1. B+树索引
    1)聚集索引
    每张表只能有一个聚集索引,按照主键构造的一颗B+树,叶子节点就是数据页,查询优化器倾向于聚集索引,因为聚集索引的叶子节点直接能找到数据,我们可用使用explain 进行分析索引的使用

    2)非聚集索引(辅助索引)
    非聚集索引中并不包含真实数据,而是有一个相应行的数据的聚集索引键,当查找数据时,先进行非聚集索引查询接着进行聚集索引查询才能找到真实数据。
    3)B+树索引分裂
    根据B+树的原理进行分裂的话,会导致叶子节点空闲空间过大,也就是不停的创建新页,innodb的page header中有page_last_insert、page_direction、page_n_direction三个部分保存的数值影响着分裂点的确认,减少空闲空间。
    4)索引的创建和删除
    创建alter table a add {index|key} name type(字段)、create index name type on tableName(字段)
    删除drop index name on tableName
    可用使用命令show index from tablename来查看索引情况

    其中我们比较关心cardinality的值,它应该尽可能的接近表行数,如果太小可以删除该索引了。
    如果是生产环境下,进行索引的变更需要考虑到成本问题了,5.5之前的版本变更是删除该表并用新生成的表替换。
  2. 全文检索
    全文检索从innodb1.2版本开始支持
    innodb使用的是full inverted index{单词,(单词所在文档的ID,在具体文档中的位置)}表现形式的倒排索引。
    使用CREATE FULLTEXT INDEX idx_fts ON fts_a(body);创建全文检索
    1)innodb将倒排索引存储在辅助表Auxiliary Table中,为了提高并发性能共有6张Auxiliary Table,每张表有两列,一列是word,另一列是ilist字段,每张表根据word字段的latin编码进行分区。为了提高检索性能,引入FTS index cache(一个基于红黑树的全文检索索引缓存),那么插入数据的顺序是,先进行数据的入库,再分词然后结果跟新到FTS index cache,最后才是入Auxiliary Table,可以设置参数innodb_ft_aux_table来观察倒排索引

    上面的图中报以上错误 是因为表中没有一个字段是全文索引。
    当发生宕机时可能FTS index cache中的数据没有同步到Auxiliary Table,当重启数据库后进行全文检索时会自动读取未完成的文档进行分词然后将结果放到FTS index cache中,innodb_ft_cache_size用来控制FTS index cache大小,默认32m。
    当删除分词时,不删除Auxiliary Table中的记录,只删除FTS index cache中的记录,但是会将其fts_doc_id保存在deleted Auxiliary Table中,当设置了innodb_ft_aux_table后,可以通过访问information_schema.innodb_ft_deleted来查看删除的记录。
    当前版本的全文检索不支持没有单词界定符的语言如中文,每张表只能有一个全文检索索引
    2)全文检索查询
select *
from client
where match(account) against('admin' in natural language mode)

全文检索有三种模式
1】默认natural language查询带有指定单词的文档
2】boolean 在查询字符串前后添加特殊字符代表不同含义
+表示单词必须存在
-表示单词必须不存在
什么都没有代表单词是可选的,出现相关性更高
@30表示查询的多个单词之间的距离必须在给定限制内
>表示出现该单词时增加相关性
<出现该单词时降低相关性
~出现该单词时相关性为负
*表示以某某开头的单词
''表示短语
3】query expansion将查询单词扩充为相关单词