mysql 索引

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql 索引相关的知识,希望对你有一定的参考价值。

聚簇索引(clustered index)

    1、有主键时,根据主键创建聚簇索引
    2、没有主键时,会用一个唯一且不为空的索引列做为主键,成为此表的聚簇索引
    3、如果以上两个都不满足那innodb自己创建一个虚拟的聚集索引
辅助索引(secondary index)
   非聚簇索引都是辅助索引,像复合索引、前缀索引、唯一索引

   在聚簇索引之上创建的索引称之为辅助索引,辅助索引访问数据总是需要二次查找。辅助索引叶子节点存储的不再是行的物理位置,而是主键值。通过辅助索引首先找到的是主键值,再通过主键值找到数据行的数据叶,再通过数据叶中的Page Directory找到数据行。


普通索引

   这是最基本的索引,它没有任何限制,MyIASM中默认的BTREE类型的索引,也是我们大多数情况下用到的索引。

复合索引(最左前缀)

   由多列创建的索引称为符合索引,在符合索引中的前导列必须出现在where条件中,索引才会被使用

前缀索引

   当索引的字符串列很大时,创建的索引也就变得很大,为了减小索引体积,提高索引的扫描速度,就用索引的前部分字串索引,这样索引占用的空间就会大大减少,并且索引的选择性也不会降低很多。而且是对BLOB和TEXT列进行索引,或者非常长的VARCHAR列,就必须使用前缀索引,因为mysql不允许索引它们的全部长度。

唯一索引

   唯一索引比较好理解,就是索引值必须唯一,这样的索引选择性是最好的。

主键索引

   主键索引就是唯一索引,不过主键索引是在创建表时就创建了,唯一索引可以随时创建。

全文索引(FULLTEXT)

   MySQL从3.23.23版开始支持全文索引和全文检索,FULLTEXT索引仅可用于 MyISAM 表;他们可以从CHAR、VARCHAR或TEXT列中作为CREATE TABLE语句的一部分被创建,或是随后使用ALTER TABLE 或CREATE INDEX被添加。////对于较大的数据集,将你的资料输入一个没有FULLTEXT索引的表中,然后创建索引,其速度比把资料输入现有FULLTEXT索引的速度更为快。不过切记对于大容量的数据表,生成全文索引是一个非常消耗时间非常消耗硬盘空间的做法。


自适应哈希索引

   innodb会监控表上的索引使用情况,如果观察到建立哈希索引可以带来速度的提升,那就建立哈希索引,自适应哈希索引通过缓冲池的B+树构造而来,因此建立的速度很快,不需要将整个表都建哈希索引,InnoDB存储引擎会自动根据访问的频率和模式来为某些页建立哈希索引。自适应哈希索引不需要存储磁盘的,当停库内容会丢失,数据库起来会自己创建,慢慢维护索引。 

myisam索引

   因为myisam的索引和数据是分开存储存储的,myisam通过key_buffer把索引先缓存到内存中,当需要访问数据时(通过索引访问数据),在内存中直接搜索索引,然后通过索引找到磁盘相应数据,这也就是为什么索引不在key buffer命中时,速度慢的原因。

innodb索引

   innodb的数据和索引放在一起,当找到索引也就找到了数据


索引扫描方式
紧凑索引扫描(dense index)
   在最初,为了定位数据需要做权表扫描,为了提高扫描速度,把索引键值单独放在独立的数据的数据块里,并且每个键值都有个指向原数据块的指针,因为索引比较小,扫描索引的速度就比扫描全表快,这种需要扫描所有键值的方式就称为紧凑索引扫描

 

松散索引扫描(sparse index)
   为了提高紧凑索引扫描效率,通过把索引排序和查找算法(B+trre),发现只需要和每个数据块的第一行键值匹配,就可以判断下一个数据块的位置或方向,因此有效数据就是每个数据块的第一行数据,如果把每个数据块的第一行数据创建索引,这样在这个新创建的索引上折半查找,数据定位速度将更快。这种索引扫描方式就称为松散索引扫描。

 

覆盖索引扫描(covering index)
   包含所有满足查询需要的数据的索引称为覆盖索引,即利用索引返回select列表中的字段,而不必根据索引再次读取数据文件。


索引相关常用命令
1) 创建主键
 CREATE TABLE `pk_tab2` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `a1` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

2) 创建唯一索引
create unique index indexname on tablename(columnname); 
alter table tablename add unique index indexname(columnname);

 

3) 创建单列一般索引
create index indexname on tablename(columnname);
alter table tablename add index indexname(columnname);


4) 创建全文索引
create fulltext index indexname on tablename(columnname);
alter table tablename add fulltext index indexname(columnname);

 

5) 创建单列前缀索引
create index indexname on tablename(columnname(10));    //单列的前10个字符创建前缀索引
alter table tablename add index indexname(columnname(10)); //单列的前10个字符创建前缀索引

 

6) 创建复合索引
create index indexname on tablename(columnname1,columnname2);    //多列的复合索引
create index indexname on tablename(columnname1,columnname2(10));    //多列的包含前缀的复合索引
alter table tablename add index indexname(columnname1,columnname2); //多列的复合索引
alter table tablename add index indexname(columnname1,columnname(10)); //多列的包含前缀的复合索引

 

7) 删除索引
drop index indexname on tablename;;
alter table tablename drop  index indexname;

 

8) 查看索引
show index from tablename;
show create table pk_tab2;




以上是关于mysql 索引的主要内容,如果未能解决你的问题,请参考以下文章

mysql索引类型解释

mysql 索引

mysql索引(九)索引合并

mysql覆盖索引和联合索引的区别

mysql---索引优化

MySQL索引