mysql 索引

一.B+树索引
1.聚集索引
innodb存储引擎表是索引组织表,即表中数据按照主键顺序存放。
而聚集索引就是按照每张表的主键构造一棵B+树,同时叶子节点中存放的即为整张表的行记录数据,也将聚集索引的叶子节点称为数据页。每个数据页都通过一个双向链表来进行连接。
由于实际的数据页只能按照一棵B+树进行排序,因此每张表只能拥有一个聚集索引。
在多数情况下,优化器倾向于采用聚集索引,因为能够在B+树索引的叶子节点上直接找到数据。
由于定义了数据的逻辑顺序,聚集索引能够特别快的访问针对范围值得查询和主键的排序查询。


2.辅助索引
叶子节点不包含行记录的全部数据,叶子节点除了包含键值和对应的表的聚集索引键。
对于非聚集索引的离散读取,索引组织表上的非聚集索引会比堆表上的聚集索引慢一些。




二.B+树索引的管理
1.创建索引
alter table tbl_name add {INDEX | KEY} [index_name] [index_type] (index_col_name,...) [index_option]..
ALGORITHM = {DEFAULT|INPLACE|COPY}
LOCK = {DEFAULT|NONE|SHARED|}

ALGORITHM:
-copy 表示为创建临时表的方式建立index
-inplace 表示以FIC的方式建立index
-default表示根据参数old_alter_table来判断,默认为采用inplace的方式。

LOCK:
-none:执行索引创建或者删除操作时,对目标表不添加任何的锁,即事务仍然可以进行读写操作,不会阻塞
-share:对目标表加上一个S锁,可以进行读事务,不能进行写事务。
-exclusive:对目标表加上一个X锁,读写事务都不能进行。
-DEFAULT:对上述几种情况依次进行判断。


2.其他命令:
-删除索引:
alter table tbl_name drop primary key | drop {index|key} [index_name]
-对字段前100个字符添加索引
alter table tbl_name add key index_name(colmun_name(100));
-查看表上的index
show index from tbl_name
        Table: t3
   Non_unique: 1
     Key_name: idx-1
 Seq_in_index: 1
  Column_name: idt4
    Collation: A
  Cardinality: 3
     Sub_part: NULL
       Packed: NULL
         Null:
   Index_type: BTREE
      Comment:
Index_comment:

三.存储引擎的cardinality统计机制
1.统计条件:
-表中1/16的数据已发生变化
-stat_modified_counter>2000000000

2.统计采样
innodb_stats_transient_sample_pages  表示每次采样页的数量
innodb_stats_persistent  表示analyze table 计算得到的cardinality值是否存放在磁盘上。默认OFF
innodb_stats_persistent_sample_pages  表示执行analyze table时采样页的数量
innodb_stats_on_metadata  表示通过命令show table status , show index 及访问information_schema架构下的表tables和statistics时,是否需要重新计算索引的cardinality值。

四.索引的使用
1.覆盖索引
从辅助索引中就可以得到查询的结果,而不需要查询聚集索引中的记录。
优点:
-辅助索引不包含郑航记录的所有信息,故其大小要远小于聚集索引,因此可以减少大量的IO操作。
-针对于count(*)操作,优化器不会选择通过查询聚集索引来进行统计,而是会选择覆盖了的辅助索引。
例如联合辅助索引(userid,buy_date)
select count(*) from buy_log where buy_date >= xxx and buy_date<xxx;
 < xxx

<xxx< xxx</xxx<></xxx;

五.自适应哈希索引
自适应哈希索引经哈希函数映射到一个哈希表中,因此对于字典类型的查找非常快速,如
select * from table where index_col='xxx'. 但对于范围查找则无能为力。
通过show engine innodb status; 可以看到当前自适应哈希索引的使用状况
-------------------------------------
INSERT BUFFER AND ADAPTIVE HASH INDEX
-------------------------------------
Ibuf: size 1, free list len 0, seg size 2, 0 merges
merged operations:
 insert 0, delete mark 0, delete 0
discarded operations:
 insert 0, delete mark 0, delete 0
Hash table size 276671, node heap has 0 buffer(s)
Hash table size 276671, node heap has 0 buffer(s)
Hash table size 276671, node heap has 0 buffer(s)
Hash table size 276671, node heap has 0 buffer(s)
Hash table size 276671, node heap has 0 buffer(s)
Hash table size 276671, node heap has 0 buffer(s)
Hash table size 276671, node heap has 0 buffer(s)
Hash table size 276671, node heap has 0 buffer(s)
0.00 hash searches/s, 0.00 non-hash searches/s

六.全文检索
应对这种类型SQL的查询情况:select * from www where text like '%xxx%';
innodb 1.2.x版本开始,innodb存储引擎开始支持全文检索

参考书籍:
MySQL技术内幕:InnoDB存储引擎(第2版)

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/15412087/viewspace-2152948/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/15412087/viewspace-2152948/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL索引是一种数据结构,可以帮助MySQL快速定位和访问表中的数据。使用索引可以提高查询效率,降低数据库的负载。下面是MySQL索引的一些基本概念和使用方法: 1. 索引类型 MySQL支持多种类型的索引,包括B树索引、哈希索引、全文索引等。其中,B树索引是最常用的一种,也是默认的索引类型。B树索引可以用于精确匹配和范围查询,而哈希索引主要用于等值查询,全文索引则用于文本检索。 2. 索引创建 可以在创建表时指定索引,例如: ``` CREATE TABLE users ( id INT PRIMARY KEY, name VARCHAR(50), email VARCHAR(50), INDEX idx_email (email) ); ``` 也可以在已有的表上添加索引,例如: ``` ALTER TABLE users ADD INDEX idx_name (name); ``` 3. 索引使用 查询语句中可以使用WHERE子句和ORDER BY子句来利用索引,例如: ``` SELECT * FROM users WHERE email = 'example@example.com'; SELECT * FROM users WHERE name LIKE 'John%' ORDER BY id DESC; ``` 需要注意的是,索引并不是越多越好,过多的索引会占用过多的磁盘空间并降低写操作的性能。因此,需要根据实际情况选择合适的索引。同时,还需要定期对索引进行维护,包括优化查询语句、删除不必要的索引等。 4. 索引优化 MySQL提供了一些工具来优化索引,例如EXPLAIN命令可以帮助分析查询语句的执行计划,找出慢查询和不必要的全表扫描。可以使用OPTIMIZE TABLE命令来优化表的索引和碎片,从而提高查询性能。还可以使用缓存来避免频繁的查询操作,例如使用Memcached或Redis等缓存工具。 以上就是MySQL索引的一些基本概念和使用方法,需要根据实际情况进行选择和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值