mysql索引知识点

MySQL索引的相关问题

一:索引类型

MySQL 有多中索引类型:
PRIMARY, INDEX, UNIQUE 这3种是一类
PRIMARY 主键。 就是 唯一 且 不能为空。
NORMAL(INDEX) 索引,普通的。(可以用在比较短的文本)
UNIQUE 唯一索引。 不允许有重复。
FULLTEXT 是全文索引,用于在一篇文章中,检索文本信息的。 此索引用于搜索很长一篇文章的时候,效果最好。
SPATIAL,空间索引。新版本MySQL中,InnoDB支持空间索引,通过R树来实现,使得空间搜索变得高效。

二:索引方法

MySQL索引方法:BTREE、HASH

索引是帮助mysql获取数据的数据结构。最常见的索引是Btree索引和Hash索引。
不同的引擎对于索引有不同的支持:Innodb和MyISAM默认的索引是Btree索引;而Mermory默认的索引是Hash索引。

2.1 Hash索引

所谓Hash索引,当我们要给某张表某列增加索引时,将这张表的这一列进行哈希算法计算,得到哈希值,排序在哈希数组上。所以Hash索引可以一次定位,其效率很高,而Btree索引需要经过多次的磁盘IO,但是innodb和myisam之所以没有采用它,是因为它存在着好多缺点:

1、因为Hash索引比较的是经过Hash计算的值,所以只能进行等式比较,不能用于范围查询

2、每次都要全表扫描

3、由于哈希值是按照顺序排列的,但是哈希值映射的真正数据在哈希表中就不一定按照顺序排列,所以无法利用Hash索引来加速任何排序操作

4、不能用部分索引键来搜索,因为组合索引在计算哈希值的时候是一起计算的。

5、当哈希值大量重复且数据量非常大时,其检索效率并没有Btree索引高的。

2.2 Btree索引

至于Btree索引,它是以B+树为存储结构实现的。

但是Btree索引的存储结构在Innodb和MyISAM中有很大区别。

扫描二维码关注公众号,回复: 2422456 查看本文章

MyISAM中数据文件和索引文件是分开的,因此MyISAM的索引方式也称为非聚集,Innodb的索引方式成为聚集索引。

Btree索引中的最左匹配原则:

Btree是按照从左到右的顺序来建立搜索树的。比如索引是(name,age,sex),会先检查name字段,如果name字段相同再去检查后两个字段。

三:索引使用注意

3.1 索引不足之处

(1)索引提高了查询的速度,但是降低了INSERT、UPDATE、DELETE的速度,因为在插入、修改、删除数据时,还要同时操作一下索引文件;
(2)建立索引会占用一定的磁盘空间。

3.2 索引使用注意事项

(1)只要列中包含NULL值将不会被包含在索引中,组合索引只要有一列含有NULL值,那么这一列对于组合索引就是无效的,所以我们在设计数据库的时候最好不要让字段的默认值为NULL;
(2)使用短索引,如果可能,应该给索引指定一个长度,例如:一个varchar(255)的列,但真实存储的数据只有20位的话,在创建索引时应指定索引长度为20,而不是默认不写。如下:

ALTER TABLE t_user add INDEX U_INDEX(USERNAME(16)) 优于 ALTER TABLE t_user 
add INDEX U_INDEX(USERNAME)

  使用短索引不仅能够提高查询速度,而且能节省磁盘操作以及I/O操作。

(3)索引列排序

     Mysql在查询的时候只会使用一个索引(N条独立索引同时在一条语句使用的消耗比只使用一个索引还要慢),因此如果where子句已经使用了索引的话,那么order by中的列是不会使用索引的,所以order by尽量不要包含多个列的排序,如果非要多列排序,最好使用组合索引。

(4)Like 语句

    一般情况下不是鼓励使用like,如果非使用,那么需要注意 like”%aaa%”不会使用索引;但like“aaa%”会使用索引。

(5)不使用 NOT IN和<>操作

三:建立索引的原则

为了使索引的使用效率更高,在创建索引时,必须考虑在哪些字段上创建索引和创建什么类型的索引,有7大原则:

1.选择唯一性索引
2.为经常需要排序、分组和联合操作的字段建立索引
3.为常作为查询条件的字段建立索引
4.限制索引的数目
5.尽量使用数据量少的索引
6.尽量使用前缀来索引
7.删除不再使用或者很少使用的索引

参考资料:
https://blog.csdn.net/u014307117/article/details/47325091 hash/btree索引区别
http://blog.sina.com.cn/s/blog_887d00920100wgf1.html 索引设计原则
https://www.cnblogs.com/parryyang/p/5900926.html Mysql索引PRIMARY、NORMAL、UNIQUE、FULLTEXT 区别和使用场合
https://www.cnblogs.com/zhming26/p/6322353.html 如何查看MySQL的当前存储引擎?

猜你喜欢

转载自blog.csdn.net/apple9005/article/details/80250475