码迷,mamicode.com
首页 > 数据库 > 详细

MySQL 索引

时间:2016-01-08 14:44:48      阅读:290      评论:0      收藏:0      [点我收藏+]

标签:mysql索引

*************************索引分类*************************

逻辑分类:
Single column indexes单列索引
Combined Indexes,Multiple-Column Indexes 多列索引
Unique 唯一索引
NonUnique 非唯一索引


物理存储分类:
clustered index 聚簇索引(主键和数据存放到一起)
not-clustered index非聚簇索引(普通索引)


数据结构分类:
BTREE索引,是B+树(B+ Tree)的简写
HASH索引(InnoDB是自适应哈希索引),只用于HEAP表
空间索引(5.6以前Myisam存储引擎支持,5.7InnoDB引入空间索引),很少用
Fractal Tree索引,用于TokuDB表

全文索引(5.6.10版本开始支持)

*************************B+TREE索引*************************

演化:二分查找->平衡二叉树->B树->b+树

介绍:所有记录节点都是按键值的大小顺序存放在同一层的叶子节点上,由各叶子节点指针进行连接

插入操作:必须保证插入后叶子节点记录依然排序,需要考虑的几种情况

Leaf Page满
Index Page满操作
NONO直接将记录插入叶子节点
YES
NO

1)拆分Leaf Page

2)将中间的节点放入到Index Page中

3)小于中间节点的记录放左边

4)大于或者等于中间节点的记录放到右边

YESYES

1)拆分Leaf Page

2)小于中间节点的记录放左边

3)大于或者等于中间节点的记录放到右边

4)拆分IndexPage

5)小于中间节点的记录放左边

6)大于中间节点的记录放右边

7)中间节点放入上一层IndexPage

YES左右页节点未满旋转,首先检查左兄弟节点,左兄弟节点如果未满,则移到左兄弟节点,这样做的好处是没必要做拆分
删除操作:使用填充因子来控制树的删除变化,50%是填充因子可设的最小值,删除操作同样必须保证删除后叶子节点的排序性,删除操作的几种情况:

叶子节点小于填充因子中间节点小于填充因子
操作
NONO直接将记录从叶子节点删除,如果该节点还是Index page的节点,那么则用该页节点的右节点替代
YESNO合并叶子节点和它的兄弟节点,同时更新Index Page
YESYES

1)合并叶子节点和他的兄弟节

2)更新index page

3)合并index page和它的兄弟节点

*************************B+TREE索引分类*************************

聚集索引:按照每张表的主键构造一颗B+TREE,叶子节点中存放的就是整张表的行记录数据,也将聚集索引的叶子节点称为数据页。在InnoDB表中,可使用py_innodb_page_info工具来分析页,可看出索引是单独存放的一个页,该页储存键值以及指向数据页的偏移量。

非聚集索引:叶子节点不包含行记录的全部数据,叶子节点除了包含键值外,每个叶子节点中的索引行中还包含了聚集索引键,通过该聚集索引键可获取行内容。

*************************B+TREE索引管理*************************

创建索引语法:


CREATE [ONLINE|OFFLINE] [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name

    [index_type]

    ON tbl_name (index_col_name,...)

    [index_option]

    [algorithm_option | lock_option] ...


index_col_name:

    col_name [(length)] [ASC | DESC]


index_type:

    USING {BTREE | HASH}


index_option:

    KEY_BLOCK_SIZE [=] value

  | index_type

  | WITH PARSER parser_name

  | COMMENT ‘string‘


algorithm_option:

    ALGORITHM [=] {DEFAULT|INPLACE|COPY}


lock_option:

    LOCK [=] {DEFAULT|NONE|SHARED|EXCLUSIVE}

或者

ALTER  TABLE tbl_name

  | ADD {INDEX|KEY} [index_name]

        [index_type] (index_col_name,...) [index_option] ...

  | DROP PRIMARY KEY

  | DROP {INDEX|KEY} index_name

index_col_name:

    col_name [(length)] [ASC | DESC]

index_type:

    USING {BTREE | HASH}

index_option:

    KEY_BLOCK_SIZE [=] value

  | index_type

  | WITH PARSER parser_name

  | COMMENT ‘string‘

查看表上索引信息:

mysql> show index from t1\G;

*************************** 1. row ***************************

        Table: t1

   Non_unique: 0

     Key_name: PRIMARY

 Seq_in_index: 1

  Column_name: id

    Collation: A

  Cardinality: 9

     Sub_part: NULL

       Packed: NULL

         Null: 

   Index_type: BTREE

      Comment: 

Index_comment: 

*************************** 2. row ***************************

        Table: t1

   Non_unique: 1

     Key_name: idx_name

 Seq_in_index: 1

  Column_name: name

    Collation: A

  Cardinality: 9

     Sub_part: NULL

       Packed: NULL

         Null: 

   Index_type: BTREE

      Comment: 

Index_comment: 

2 rows in set (0.02 sec)


ERROR: 

No query specified


MySQL 索引

标签:mysql索引

原文地址:http://gaoquan.blog.51cto.com/4503718/1732823

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!